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