Реализация меню в игре с использованием Pygame - PullRequest
1 голос
/ 03 февраля 2020

Я пытался создать меню для своей игры. Он работает в первый раз, когда я открываю игру, и когда игрок умирает, он входит в menu(), как и ожидалось. Но когда я нажимаю «начать игру» после того, как игрок умер один раз, он выполняет main() менее секунды, а затем возвращается к menu(). Вот как я сделал меню

def menu():
    controls = pygame.image.load(r"C:\Users\rahul\OneDrive\Documents\A level python codes\final game\controls.png").convert()
    controls.set_colorkey((0, 0, 0))
    controls = pygame.transform.scale(controls, (1200, 600))
    back_rect = pygame.Rect(800, 550, 400, 50)
    back_rect_border = pygame.Rect(800, 550, 400, 50)
    start_rect = pygame.Rect( 400, 200, 400, 100)
    start_rect_border = pygame.Rect( 400, 200, 400, 100)
    controls_rect = pygame.Rect(400, 310, 400, 100)
    controls_rect_border = pygame.Rect(400, 310, 400, 100)
    x = 1200
    loop = True
    display_controls = False
    while loop:
        D.fill((255,173,96))
        events = pygame.event.get()
        mouse_pos = pygame.mouse.get_pos()

        for event in events:
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

        if not display_controls:
            if start_rect.collidepoint(mouse_pos):
                start_color = (200, 150, 0)
                for event in events:
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        loop = False
                        run_menu = False


            else:
                start_color = (100, 200, 150)

            if controls_rect.collidepoint(mouse_pos):
                control_color = (200, 150, 0)
                for event in events:
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        display_controls = True

            else:
                control_color = (100, 100, 150)

            pygame.draw.rect(D, start_color, (start_rect))
            pygame.draw.rect(D, control_color, (controls_rect))
            pygame.draw.rect(D, (0, 0, 0), (start_rect_border), 3)
            pygame.draw.rect(D, (0, 0, 0), (controls_rect_border), 3)
            write(50, "START  GAME", (255, 255, 255), 404, 220)
            write(50, "CONTROLS", (255, 255, 255), 404, 330)



        if display_controls:
            D.blit(controls, (x, 0))
            x -= 10
            if x<= 0:
                x = 0

            if back_rect.collidepoint(mouse_pos):
                back_color = (200, 180, 182)
                for event in events:
                    if event.type == pygame.MOUSEBUTTONDOWN:
                        display_controls = False
                        x = 1200

            else:
                back_color = (254, 219, 183)

            pygame.draw.rect(D, back_color, (back_rect))
            pygame.draw.rect(D, (0, 0, 0), (back_rect_border), 3)
            write(25, "BACK TO MAIN MENU", (255, 255, 255), 802, 555)



        win.flip()

Теперь в моем if __name__ == "__main__": я запустил меню и основную функцию, как это

if __name__ == "__main__":
    pygame.init()
    menu()
    main()

main() это просто набор вызовов функций :

def main():

        def handle_events(events):
            for event in events:
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()

                if event.type ==  pygame.MOUSEBUTTONDOWN:
                    game.bullets.append(Bullet())

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                            if not  game.fireballs:
                                    game.fireballs.append(Fire_ball())

        while True:

             events = pygame.event.get()

             handle_events(events)

             D.fill((254, 219, 183))

             game_map.draw()

             player.draw()

             player.move()

             player.camera()

             player.boundries()

             player.jetpack()

             game.fall_player()

             player.draw_jet_bar()

             player.draw_health_bar()

             player.dead()

             game.shoot_bullet()

             game.shoot_fireball()

             game.destroy_bullet()

             game.spawn_enemy()

             game.move_enemy()

             check_fireball_hit()

             game.destroy_fireballs()

             check_bullet_hit()

             print_stats()

             mouse.update()

             scroll[0] += 1

             win.flip()

Функция player.dead() в main() должна вызывать меню после смерти игрока (а это часть, которая не работает), и выглядит это так:

 def dead(self):
        if self.hp  <= 0:
            menu()

Я впервые создаю меню для игры, поэтому я не уверен, что будет лучшим способом сделать это. Она перестала работать после смерти игрока, что означает, что проблема в функции player.dead(), которая вызывает меню. Любая помощь будет оценена. Спасибо

Редактировать: я понял, потому что у игрока все еще 0 или меньше 0 в следующий раз, когда я нажимаю кнопку запуска игры, из-за чего меню запускается. Теперь мой вопрос: как мне сбросить всю статистику в игре после смерти игрока? Есть ли какой-нибудь способ начать свободное sh выполнение основного заново после смерти игрока?

1 Ответ

3 голосов
/ 04 февраля 2020

Для такого рода вещей общим подходом является набор состояний и (возможно) переходов. Часто вы видите их в виде диаграмм:

state-transition-diagram

По общему признанию, это довольно простой набор состояний. Но, возможно, у вас также будут игровые состояния, например (возможно) «загрузка», «уровень1», «уровень2» и т. Д. c.

Таким образом, текущее состояние сохраняется в переменной, и main l oop использует значение, чтобы решить, что делать. Если программа находится в состоянии «меню», меню окрашивается, и клавиши со стрелками изменяют выделенный выбор. Принимая во внимание, что если игра находится в «игровом» состоянии, для перемещения персонажа игрока используются клавиши со стрелками и т. Д. c.

menu_state = 1
current_state = "menu"
while current_state != "exit":

    # paint the screen
    if ( current_state == "menu" ):
        drawMenu()
    elif ( current_state == "game" ):
        drawGame()

    # Handle Events
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            current_state = "exit"
        elif ( event.type ==  pygame.MOUSEBUTTONDOWN ):
            mouse_pos = pygame.mouse.get_pos()
            if ( current_state == "menu" ):
                current_state = handleMenuClick( mouse_pos )
            elif ( current_state == "game" ):
                game.bullets.append( Bullet() )

    # Handle continuous-key-presses, but only in menu mode
    if ( current_state == "menu" ):
        keys = pygame.key.get_pressed()
        if ( keys[pygame.K_UP] ):
            menuSelectPrevious()
        elif ( keys[pygame.K_DOWN] ):
            menuSelectNext()
        elif ( keys[pygame.K_ENTER] ):
            current_state = menuDoOption()

    print_stats()
    win.flip()

Это дает простой метод, позволяющий функциям всегда «знать» состояние игры, и какие состояния разрешено изменять с текущего состояния. Это помогает распутать все возможные варианты, скажем, обработки события. Это также означает, что вам нужно только одно событие l oop, что значительно упрощает выполнение программы.

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