在Pygame中不会停止的敌人

大顺·莫里森

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()
金斯利

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

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

如果更改此列表,则指向的值Enemy.start()显然也会更改。因此,您将看到描述的行为。

确保在创建的实例(Enemyspeed元组)时,例如:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章