#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 . Я довольно новичок в ООП, и это помогло мне в моем понимании, а также в решении проблемы, с которой я боролся в течение нескольких часов. Спасибо!