Python Pygame精灵不画画

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

所以我正在制作这个小行星射击游戏,我有一个叫做激光的课程。因为我需要创建很多激光器,所以我为这个类创建了一个精灵组,并添加了25个精灵。我这样做是为了,每当用户按下空格键时,组中最后一个激光(我设法用精灵列表来组织它)就会用Vector2D在屏幕上出现,其余的激光都“隐藏”在飞船精灵下。 以下是激光等级的代码:

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()