Прокрутка бесконечного фона в Pygame - PullRequest
1 голос
/ 15 января 2020

Привет. Я пытаюсь отобразить menu_background на экране меню, где отображаются пункты меню. Когда я запускаю свой код, все, что я получаю, это прокрутка изображения, но мои пункты меню и звук не воспроизводятся и не отображаются. Кто-нибудь может помочь написать код, который заставит его работать там, где воспроизводится звук и отображаются параметры моего меню?

import pygame, sys, random, time, os, math
from pygame.locals import *

fps = pygame.time.Clock()

global screen
screen = pygame.display.set_mode((WIDTH, HEIGHT),pygame.FULLSCREEN)
display = pygame.Surface((400,250))

def menu_background():
    menu_bg = pygame.image.load("assets/images/menu_bg.png").convert()
    x = 0

    while True:

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

        rel_x = x % menu_bg.get_rect().width
        screen.blit(menu_bg, (rel_x - menu_bg.get_rect().width, 0))
        if rel_x < WIDTH:
                screen.blit(menu_bg, (rel_x, 0))
        x -= 1
        pygame.display.update()
        fps.tick(120)

def menu():
    bg = menu_background()
    menu_options = ['Play','Controls','Highscores','Settings','Credits','Quit']
    menu_choice = 0
    in_menu = True

    pygame.mixer.music.load('assets/audio/mainmenu.wav')

    while in_menu:
        bg(display)

        n = 0
        for option in menu_options:

        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                if event.key == K_UP:
                    menu_choice -= 1
                    if menu_choice < 0:
                        menu_choice = len(menu_options)-1
                if event.key == K_DOWN:
                    menu_choice += 1
                    if menu_choice >= len(menu_options):
                        menu_choice = 0
                if event.key == K_SPACE:
                    choice = menu_options[menu_choice]
                    if choice == 'Play':
                        play()
                    if choice == 'Controls':
                        controls()

        screen.blit(pygame.transform.scale(display,(WIDTH,HEIGHT)),(0,0))
        pygame.display.update()
        fps.tick(60) 

1 Ответ

1 голос
/ 15 января 2020

Основная проблема заключается в том, что вы реализовали 2 основных цикла приложения. Циклы выполняются один за другим. (Кстати, первый из этих циклов никогда не заканчивается)

Поместите всю реализацию в один l oop. Приложение l oop должно

  • обрабатывать события и состояния изменения

  • рисовать фон

  • Нарисуйте сцену и меню

  • Обновите отображение

Например:

def menu():

    x = 0
    menu_bg = pygame.image.load("assets/images/menu_bg.png").convert()

    menu_options = ['Play','Controls','Highscores','Settings','Credits','Quit']
    menu_choice = 0
    in_menu = True

    # load and play music
    pygame.mixer.music.load('assets/audio/mainmenu.wav')
    pygame.mixer.music.play()

    while in_menu:
        fps.tick(120)

        # handle events
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
                if event.key == K_UP:
                    menu_choice -= 1
                    if menu_choice < 0:
                        menu_choice = len(menu_options)-1
                if event.key == K_DOWN:
                    menu_choice += 1
                    if menu_choice >= len(menu_options):
                        menu_choice = 0
                if event.key == K_SPACE:
                    choice = menu_options[menu_choice]
                    if choice == 'Play':
                        play()
                    if choice == 'Controls':
                        controls()

        # draw background
        rel_x = x % menu_bg.get_rect().width
        screen.blit(menu_bg, (rel_x - menu_bg.get_rect().width, 0))
        if rel_x < WIDTH:
                screen.blit(menu_bg, (rel_x, 0))
        x -= 1

        # draw menu
        #n = 0
        #for option in menu_options:
        #    [...]

        # update disaplay
        pygame.display.update()

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