метод обновления группы pygame не работает - PullRequest
0 голосов
/ 25 апреля 2018

Я создаю игру, похожую на 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.

Может кто-нибудь объяснить, что не так?Производит ли функция какой-то побочный эффект?

1 Ответ

0 голосов
/ 04 июля 2018

Определите self.x в методе update(), а не в методе __init__()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...