我正在创建一个类似于Space Invaders的游戏,但精灵组更新方法无效。
pygame.sprite.Group.update
方法不是逐个更新列表中的对象,而是导致列表中存储的所有对象获取第一个对象的值。
设计外星人的班级:
class Alien(Sprite):
def __init__(self,screen,ai):
super().__init__()
self.image = pygame.image.load("C:\\Users\\ozzy\\Desktop\\project alien invasion\\alien.bmp")
self.screen = screen
self.rect = self.image.get_rect()
self.ai = ai
self.rect.x = self.rect.width
self.rect.y = self.rect.height
self.x = float(self.rect.x)
将舰队向右移动
def update(self):
self.x += 3
self.rect.x = self.x
创建车队
def create_fleet(screen,ai,aliens,ship):
alien = Alien(screen,ai)
alien_width = alien.rect.width
alien_height = alien.rect.height
number_alien_x = get_number_x(ai,alien_width)
number_alien_y = get_number_y(ai,alien_height,ship)
for alien_coloum in range(number_alien_y):
for alien_row in range(number_alien_x):
create_aliens(screen,ai,alien_width,aliens,alien_row,alien_coloum)
获取可以放在显示器上的行数
def get_number_y(ai,alien_height,ship):
available_space_y = (ai.height - ship.rect.height -(3 * alien_height))
number_of_rows = int(available_space_y / (2 * alien_height))
return number_of_rows
获取可适合屏幕的列数
def get_number_x(ai,alien_width):
available_space_x = ai.width - 2 * alien_width
number_of_aliens = int(available_space_x /(2 * alien_width))
return number_of_aliens
将船队存放在群组中
def create_aliens(screen,ai,alien_width,aliens,alien_row,alien_coloum):
alien = Alien(screen,ai)
alien_x = alien_width + 2 * alien_width * alien_row
alien.rect.x = alien_x
alien.rect.y = alien.rect.height + 2 * alien.rect.height * alien_coloum
aliens.add(alien)
调用组
上的更新方法def update_aliens(aliens):
for a in aliens.sprites():
print(a.rect.x)
aliens.update()
#the update method cause the x co ordintes to be same first object
for a in aliens.sprites():
print(a.rect.x)
#main method
aliens = Group()
create_fleet(screen,ai,aliens,ship)
while True:
update_aliens(aliens)
在调用更新方法之前,组中的外星人具有不同的x坐标,但在更新方法之后,它们都具有相同的x坐标。
有人可以解释什么是错的吗?该功能是否会产生某种副作用?
答案 0 :(得分:0)
在self.x
方法而不是update()
方法中定义__init__()