【问题标题】:Enemies Not Unpausing In Pygame敌人在 Pygame 中没有取消暂停
【发布时间】:2020-11-26 20:23:36
【问题描述】:

Enemy 组中的精灵在随机方向移动。如果它们撞到窗户的边缘,它们会弹回来(从左到右,从右到左)。当按下P 时,.stop() 会使所有敌人暂停。 .start() 取消暂停。然而,现在敌人飞出屏幕,通过了设置在窗口左侧和右侧的边界。 .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()

【问题讨论】:

  • self.speedHolder 持有什么?
  • 你在哪里设置和更改pause
  • @Carcigenicate 它拥有speed 参数,因为在Enemy 停止后,它们的旧方向被删除了

标签: python pygame self


【解决方案1】:

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

区别很重要,因为 Python 列表将作为 reference 传递,而元组作为 value 传递。因此,当速度作为列表传递时,初始化程序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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多