Попытка отобразить несколько снарядов на экране

#python #pygame

#python #pygame

Вопрос:

По сути, я пытаюсь отобразить несколько снарядов на экране, чтобы игрок мог избежать.

На данный момент я не беспокоюсь о хит-боксах или о чем-то подобном, просто пытаюсь отобразить несколько снарядов. Он отображает один, затем снаряд исчезает с экрана и никогда не отображается обратно.

Я считаю, что это может быть проблемой области, но я не совсем уверен. Я переместил почти каждый фрагмент кода, о котором я могу думать, но безрезультатно.

 class Game:

    clock = pygame.time.Clock()

    def __init__(self): 
        self.enemy = Projectile() 
        self.enemies = []

    def loop(self):
        self.clock.tick(30) 

        for enemy in self.enemies:
            if self.enemy.y < 925 and self.enemy.x < self.screen_width: 
                self.enemy.x  = self.enemy.velocity
                self.enemy.frame_count  = 1
            else:
                self.enemies.pop(self.enemies.index(self.enemy))

        if len(self.enemies) < 5:
            self.enemies.append(self.enemy)

    def render(self):
        # other stuff

        for enemy in self.enemies: 
            self.enemy.draw_projectile(self._display_surf)
  

И затем в моем файле снаряда у меня есть:

 class Projectile():
     # projectile images

    def __init__(self):
     # stuff 

    def draw(self, gameDisplay): 

        if self.frame_count > 118: 
            self.frame_count = 0 

        display_window.blit(self.projectile_sprites[self.frame_count],(self.x, self.y))
  

Я пытаюсь вывести на экран несколько врагов типа снарядов. Я просмотрел несколько руководств о том, как делать подобные вещи, и я не могу получить ожидаемые результаты.

Комментарии:

1. В классе projectile на самом деле написано: gameDisplay.blit(self.projectile_sprites[self.frame_count], (self.x, self.y))

2. Я не вижу, где вы создаете снаряды. В идеале у вас должен быть экземпляр снаряда для каждого снаряда, который вы хотите нарисовать

3. Я думал, что это то, что я делал с self.enemies.append(self.enemy), где self.enemy является экземпляром класса.

4. Я выполнил несколько инструкций печати, чтобы проверить позиции x и y, и враг застревает в конце экрана и никогда не появляется из списка. Кроме того, в списке всегда есть только один экземпляр класса. Я попытался переместить экземпляр класса в свой цикл, но они просто продолжают появляться, прежде чем выскочить из списка.

5. Вы просто копируете ссылки на один и тот же объект. Вы должны вызывать каждый раз Projectile() . Должно быть что-то вроде self.enemies.append(Projectile()) .

Ответ №1:

Несколько вещей необходимо исправить. Не уверен, что этих исправлений будет достаточно, но, по крайней мере, они помогут.

Тактически класс Projectile выглядит нормально. Однако я не могу говорить за пропущенные части.
Однако вы никогда не используете gameDisplay аргумент в draw функции, но у вас есть display_window . Должны ли они быть одним и тем же? Если это так, используйте то же имя.
Я предполагаю display_window , что / gameDisplay — это дисплей, инициализированный поверхностью pygame.display.set_mode() . Если это так, все в порядке.

Для Game класса см. Комментарии, которые я добавил.

 class Game:

    clock = pygame.time.Clock()

    def __init__(self): 
        #self.enemy = Projectile() remove this line, is useless.
        self.enemies = []

    def loop(self):
        self.clock.tick(30) 

        for enemy in self.enemies:
            if enemy.y < 925 and enemy.x < self.screen_width:
                #no need of self before enemy in this section. Otherwise you
                #do not refer to the "enemy" on which you are looping but to
                #the attribute "enemy" (which I removed). They are different things. 
                enemy.x  = enemy.velocity
                enemy.frame_count  = 1
            else:
                self.enemies.pop(self.enemies.index(enemy))
                #I leave this here for now, but remember that editing
                #a list on which you are looping is a bad idea in general.

        if len(self.enemies) < 5:
            self.enemies.append(Projectile())
            #each iteration you need to create a new instance of the class.

    def render(self):
        # other stuff

        for enemy in self.enemies: 
            enemy.draw(self._display_surf)
            #again, no self before enemy, same reason of before.
  

Я не знаю, что это draw_projectile() такое. Я полагаю, вы хотели использовать draw() метод Projectile class , это имеет смысл таким образом.
Опять self._display_surf же, это не определено в вашем коде, я предположил, что это отображение, которое вы передаете draw() функции.

Комментарии:

1. Эй, я просто хотел поблагодарить вас! Я так увлекся написанием self перед почти всем, что не считал, что это не имеет отношения к этому циклу for . Я довольно новичок в ООП, и это помогло мне в моем понимании, а также в решении проблемы, с которой я боролся в течение нескольких часов. Спасибо!