Как каждый раз инициализировать новый объект для сброса игры в Pygame - PullRequest
1 голос
/ 13 июня 2019

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

Это то, что я пробовал до сих пор:

def initializeGame(theGame):

    while run:
        theGame.clock.tick(FPS)

        # 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()

def startGame(run):
    first_game = Game()

    while run:
        initializeGame(first_game)

        keys = pygame.key.get_pressed()

        if keys[pygame.K_ESCAPE]:
            run = False

        if keys[pygame.K_c]:
            new_game = Game()
            initializeGame(new_game)

startGame(True)

Все, что я хочу сделать, - это когда я нажимаю клавишу «c», игра должна перезапуститься с начальной точки, и для этого мне нужно заново создать новый объект класса «Game ()» и инициализировать игру

Код игрового класса - https://pastebin.com/abAiey34

1 Ответ

1 голос
/ 13 июня 2019

Избегайте игрового цикла в игровом цикле, это означает, что удалить цикл из 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...