Мало что нужно исправить. Не уверен, что этих исправлений будет достаточно, но, по крайней мере, они помогут.
Класс 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()
.