Избегайте игрового цикла в игровом цикле, это означает, что удалить цикл из initializeGame
.
Имя initializeGame
вводит в заблуждение, назовите его runGame
:
def runGame(theGame):
# This function consists code for Events
theGame.events()
# This function consists code from enemy hit events
theGame.hit_or_not()
# This function consists code for bullet hit events
theGame.bulletHit_or_not()
# This function consists code for player movements
theGame.movements()
# This function consists code for drawing the sprites over the screen
theGame.redrawGameWindow()
Так что достаточно иметь один game
, который просто "сбрасывается" при создании игрового объекта ew.
В одном-единственном игровом цикле должен быть вызван runGame
:
def startGame(run):
game = Game()
while run:
theGame.clock.tick(FPS)
# run the game
runGame(game)
# get keys
keys = pygame.key.get_pressed()
# handle keys
if keys[pygame.K_ESCAPE]:
run = False
if keys[pygame.K_c]:
game = Game()
startGame(True)
Обратите внимание, startGame()
уже имеет цикл, поэтому нет необходимости в дополнительном цикле игры в любой функции. runGame()
делает все то, что было сделано в рамках игры. runGame()
постоянно вызывается в игровом цикле в startGame()
.
Если нужно запустить новую игру, достаточно создать новый объект Game
.
Обратите внимание, что состояния, возвращаемые pygame.key.get_pressed()
, оцениваются, когда pygame.event
s обрабатываются либо pygame.event.get()
, либо pygame.event.pump()
.
Звоните pygame.key.get_pressed()
после цикла событий.
Я бы предпочел немного другой дизайн. Получить события в главном цикле (pygame.event.get()
) и передать их в runGame()
и далее в Game.events()
:
class Game:
# [...]
def events(self, eventlist):
for event in eventlist:
# handle events
# [...]
def runGame(theGame, eventlist):
# This function consists code for Events
theGame.events(eventlist)
# [...]
def startGame(run):
game = Game()
while run:
theGame.clock.tick(FPS)
# run the game
eventlist = pygame.event.get()
runGame(game, eventlist)
# get keys
keys = pygame.key.get_pressed()
# handle keys
if keys[pygame.K_ESCAPE]:
run = False
if keys[pygame.K_c]:
game = Game()