Python Pygame精灵不画画
所以我正在制作这个小行星射击游戏,我有一个叫做激光的课程。因为我需要创建很多激光器,所以我为这个类创建了一个精灵组,并添加了25个精灵。我这样做是为了,每当用户按下空格键时,组中最后一个激光(我设法用精灵列表来组织它)就会用Vector2D在屏幕上出现,其余的激光都“隐藏”在飞船精灵下。 以下是激光等级的代码:Python Pygame精灵不画画,python,pygame,sprite,game-development,Python,Pygame,Sprite,Game Development,所以我正在制作这个小行星射击游戏,我有一个叫做激光的课程。因为我需要创建很多激光器,所以我为这个类创建了一个精灵组,并添加了25个精灵。我这样做是为了,每当用户按下空格键时,组中最后一个激光(我设法用精灵列表来组织它)就会用Vector2D在屏幕上出现,其余的激光都“隐藏”在飞船精灵下。 以下是激光等级的代码: import pygame class Laser(pygame.sprite.Sprite): def __init__(self, pos): super
import pygame
class Laser(pygame.sprite.Sprite):
def __init__(self, pos):
super().__init__()
self.image = pygame.image.load("laser.png")
self.scale = 0.05
self.image = pygame.transform.smoothscale(
self.image,
(int(self.image.get_rect().width * self.scale),
int(self.image.get_rect().height * self.scale)),
)
self.rect = self.image.get_rect()
# Getting the rectangle around the image lets you move it.
self.rect.center = pos
self.speed = pygame.math.Vector2(0, -5)
self.speed.rotate_ip(0)
self.track = 0
def update(self, pos):
if self.track == 0:
self.rect.move_ip(pos)
def move(self):
self.rect.move_ip(self.speed)
self.track = self.track + 1
# self.track makes it so that the program knows not to call the update function for this Laser object.
main.py中涉及激光拍摄和创建的代码片段(包括所有代码可能太多):
为此:
if (event.key == pygame.K_SPACE):
last_laser.rect.center = (400, 400)
# Some arbitrary x and y values (400, 400).
last_laser.track += 1
但是我想要的很多东西都不满足于上面的代码。首先,我希望激光射出,像在屏幕上移动一样(我知道移动是像素的重新着色)。此外,我希望它能够移动到不同的位置,因为它将取决于用户将他/她的飞船精灵移动到何处以及从何处拍摄。几个小时来,我一直在努力寻找解决方案,并为此问题专门制作了一个堆栈溢出帐户,如有任何帮助,将不胜感激。:)
编辑:
激光正在发射,但现在我需要弄清楚玩家如何发射多个激光。我的意思是,玩家应该能够按空格键,等待几秒钟,然后再按空格键,屏幕上应该有2个激光。目前,如果播放机这样做,屏幕上的激光将被擦除,然后重新定位,看起来像是一个新的激光来自宇宙飞船。这会让玩家感到困惑,因为刚刚升起的激光“消失了”。首先,你有一个精灵组中的所有激光,但你从该组中获取所有激光,并将其放入一个列表中,然后在列表中循环更新并绘制它们,然后通过精灵组再次绘制它们,这是不必要的,而是将所有精灵放在精灵组中,并调用
lasers.update()
和lasers.draw(screen)
,或者将它们放在列表中,然后执行您现在正在执行的操作,除了这里
for i in range(0, 25):
lasers.add(Laser((width/2, height)))
变成
for i in range(0, 25):
lasers_list.append(Laser((width/2, height)))
还有很多线条可以缩短,看起来更干净
last_laser = lasers.sprites()[len(lasers_list) - 1]
last_laser = lasers.sprites()[-1] #-1 gets the last in list
if (len(lasers_list) - 1) > -1:
if len(lasers_list) > 0:
self.track = self.track + 1
self.track += 1
也会移动
screen.blit(lasers_list[i].image, lasers_list[i].rect)
if lasers_list[i].rect.top < 0:
lasers.remove(lasers_list[i])
按空格键时,它将继续移动同一个激光,直到它击中顶部并被移除。如果这是你想要的,它不是完美的,但它可以做到。否则,您可能需要一个计数器,用于对激光进行倒计时
所以我认为这解决了你问题的第二部分。至于按空格键时激光不显示,如果您清理代码并使用精灵组或列表,而不是两者都使用,那么它应该可以工作,如果不能,请发布所有代码,以便我可以重新创建它。非常感谢您,我将更新代码,希望这可以工作。另外,我投了更高的票,但它不会出现,因为我只有不到15个代表:(哟,老兄,谢谢你!除了调用last_laser外,你似乎是对的。move()有错误,所以我将它改为last_laser.rect.center=(player.rect.center,player.rect.top)last_laser.track+=1,它工作了。现在,我需要更改它,以便播放器可以同时发射多个激光。我该怎么做?是的,那
last_laser.move()
只要你有一个可行的方法,它似乎应该可以工作。一次发射多个激光。当你用last\u laser=lasers.sprites()获得last\u laser
时
当你发射激光时,将-1改为变量,然后减1,这样就可以得到下一个1是的,这看起来很聪明,我还将添加一个计数器来跟踪变量。非常感谢,我非常感谢你的帮助。
last_laser = lasers.sprites()[len(lasers_list) - 1]
last_laser = lasers.sprites()[-1] #-1 gets the last in list
if (len(lasers_list) - 1) > -1:
if len(lasers_list) > 0:
self.track = self.track + 1
self.track += 1
screen.blit(lasers_list[i].image, lasers_list[i].rect)
if lasers_list[i].rect.top < 0:
lasers.remove(lasers_list[i])
def update(self, pos):
if self.track == 0:
self.rect.move_ip(pos)
screen.blit(lasers_list[i].image, lasers_list[i].rect)
if self.rect.top < 0:
self.kill() #deletes from sprite group
def update(self, pos):
if self.track == 0:
self.rect.move_ip(pos)
else: #if not moving with ship
self.move() # so it moves on its own
screen.blit(lasers_list[i].image, lasers_list[i].rect)
if self.rect.top < 0:
self.kill() #deletes from sprite group
if (event.key == pygame.K_SPACE):
if len(lasers_list) > 0:
last_laser.move()