Pygame 中没有停止的敌人

Enemies Not Unpausing In Pygame

Enemy组中的精灵向随机方向移动。如果它们碰到 window 的边缘,它们会弹回(从左到右,从右到左)。当按下 P 时,.stop() 会导致所有敌人暂停。 .start() 取消暂停。但是,现在飞出屏幕的敌人会通过 window 左右设置的边界。 .start() 应该保持不更改 .update() 中的任何设置。

class Enemy(pygame.sprite.Sprite):
    def __init__(self, position, speed):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("enemy-spaceship-sprite.png")
        self.image = self.image.convert()
        self.image = pygame.transform.scale( self.image, (50, 50))
        self.image.set_colorkey( self.image.get_at( (1,1) ) )
        self.rect = self.image.get_rect() 
        self.rect.center = position
        (self.speedX, self.speedY) = speed
        self.speedHolder = speed

    def update(self):
        self.rect.center = (self.rect.centerx + self.speedX, self.rect.centery + self.speedY)

        if self.rect.left < 0:
            self.speedX = abs(self.speedX)
        if self.rect.right > WIDTH :
            self.speedX = -1 * abs(self.speedX)
        if self.rect.top < 0:
            self.speedY = abs(self.speedY)
        if self.rect.top > HEIGHT:
            self.rect.bottom = 0

    def stop(self):
        self.speedY = 0
        self.speedX = 0
    def start(self):
        (self.speedX, self.speedY) = self.speedHolder

游戏循环:

keepGoing = True
while keepGoing:
    # Set FPS of the game - 30 frames per second/tick
    clock.tick(CLOCK_TICK)
    # Every 30 ticks is a second
    tickCount += 1

    # Pause everything in the game
    if pause == True:
        for eachEnemy in enemyGroup:
            eachEnemy.stop()
    else:
        for eachEnemy in enemyGroup:
            eachEnemy.start()

########### Bunch of skipped code ###########
        missileGroup.clear(screen, background)
        missileGroup.update()
        missileGroup.draw(screen)

        pygame.display.flip()

我怀疑您使用的是初始敌人 speed 参数的列表,而不是元组。

区别很重要,因为 Python 列表将作为 reference 传递,而元组作为 value[=30] 传递=].因此,当速度作为列表传递时,初始化程序 self.speedHolder = speed 不会复制值,它只是一直指向原始列表。 Enemy 的所有实例可能都使用相同的列表。

如果这个列表改变了,Enemy.start()中指向的值显然也会改变。所以你会看到所描述的行为。

确保当您创建 Enemy 的实例时,speed 是一个元组,例如:

position = ( 100, 100 )
speed    = ( 3, 3 )                       # speed is a tuple
monster  = new Enemy( position, speed )   # <<-- tuples pass by value (copy)
speed    = ( 20, -3 )                     # nothing happens to monster

而不是:

position = [ 100, 100 ]
speed    = [ 3, 3 ]                       # speed is a list
monster  = new Enemy( position, speed )   # <<-- lists passed by reference
speed    = [ 20, -3 ]                     # monster now moves erratically