Попытка отобразить несколько снарядов на экране - PullRequest
0 голосов
/ 20 апреля 2019

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

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

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

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 Ответ

0 голосов
/ 20 апреля 2019

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

Класс 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, это имеет смысл.
Опять же, self._display_surf не определено в вашем коде, я полагаю, это дисплей, который вы передаете функции draw().

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