Как мне создать экран меню с помощью Ursina Python?

#python

#python

Вопрос:

Обычно я бы создал функцию или оператор if, например:

 def home_screen():
     # code
     if condition:
         game()

def game():
    # code

home_screen()
 

или что-то вроде:

 game = 1

if game == 1:
     # code for home screen
     if condition:
          game = 2

if game == 2:
    # code for game

if game == 3:
    # so on 
 

Для последнего нужна глобальная переменная с классом, что для меня нормально. Однако в Ursina ни одна из них не работает, либо функция обновления останавливается на первом, либо color.red, color.blue и т. Д. Перестают работать из ниоткуда, либо второй оператор if просто не выполняется. У кого-нибудь есть альтернатива? Я подумываю о том, чтобы просто создать home_screen.py файл полностью, но это не принесет большой пользы, и я все равно не уверен, как это можно реализовать.

Редактировать: циклы while также, похоже, не работают

Ответ №1:

Создать функциональное игровое меню на самом деле не так просто.

Вы могли бы создать функцию, которая загружает все игровые модели с уровня, функцию, которая показывает меню, и последнюю, которая показывает экран загрузки.

Загрузить уровень :

 def loadLevel():
  global loading_screen
  ground = Entity(model='quad', scale=10, y=-2, collider='box') # dummy entities
  player = FirstPersonController()
  player_model = Entity(model='player', parent=player)
  building = Entity(model='building', collider='box')
  destroy(loading_screen) # delete the loading screen when finished
 

Показать меню :

 def showMenu():
  play = Button('Play', on_click=showLoadingScreen) # A play button that show the loading menu when clicked
 

Показать экран загрузки :

 from direct.stdpy import thread # we need threading to load entities in the background (this is specific to ursina, standard threading wouldn't work)

def showLoadingScreen():
  global screen
  screen = Entity(model='quad', texture='loading_image')
  thread.start_new_thread(function=loadLevel, args='') # load entities in the background
 

Остальная часть файла :

 from ursina import *

if __name__ == '__main__':
  app = Ursina()

  screen = None # for global statement
  showMenu()
  
  app.run()
 

Редактировать : базовый пример доступен здесь.