Игра Ursina Engine не работает должным образом

avatar
B3CTOR
1 июля 2021 в 18:16
697
1
1

Я разрабатываю небольшую игру с Урсиной, и по какой-то причине она не показывает все элементы и игнорирует обновление. В игре нужно нажимать случайно сгенерированные точки. Это мой код:

  • menu.py (основной файл)
from ursina import *
from point import *
from game import play, play_2

class Menu(Entity):
    def __init__(self, **kwargs):
        super().__init__(parent = camera.ui, ignore_paused = True)

        self.main_menu = Entity(parent = self, enabled = True)
        # More menus

        Text(text = 'Main Menu', parent = self.main_menu, y=0.4, x=0, origin=(0,0))

        def starting(): # Game starts
            self.main_menu.disable()
            play()
            def update(): # The program ignores this update, so the following line isn't executed
                play_2()

        ButtonList(button_dict = {
            'Start':Func(starting),
            'Settings':Func(print, 'Settings was clicked')
            }, y = 0, parent = self.main_menu)


app = Ursina(fullscreen = True)
menu = Menu()
app.run()
  • point.py
from ursina import *

class Point(Entity):
    def __init__(self, position = (0,0,0), parent = camera, **kwargs):
        super().__init__(
            parent = parent,
            model = 'sphere',
            scale = .04,
            position = position,
            collider = 'sphere'
            )

    def input(self, key):
        global generate
        global score
        global missed

        if key == 'left mouse down' and self.hovered:
            score += 1
            self.disable()
            generate = True
        if key == 'left mouse down' and self.hovered == False:
            missed += 1


generate = False
score = 0
missed = 0
  • game.py
from ursina import *
from point import Point, generate, score, missed
from random import uniform

score_text = Text(text = 'h')
missed_text = Text(text = 'h')
points = []

def play(): # Generates all the needed things and an init point
    global score_text
    global missed_text

    camera.position = (0,0,-4)
    camera.rotation_x = 10
    board = Entity(parent = camera, model = 'quad', scale = 2, color = color.rgb(0,0,0), position = (0,0,3))
    score_text.scale = 1
    score_text.position = (.66,.43)
    missed_text.scale = 1
    missed_text.position = (.66,.4)
    point = Point(parent = board)

def play_2(): # The actual game starts
    global generate
    global score
    global missed
    global score_text
    global missed_text
    global points

    if generate == True:
        point = Point(position = (uniform(-.44,.44), uniform(-.265,.265),-.1))
        points.append(point)
        generate = False

    score_text.text = f'Score: {score}'
    missed_text.text = f'Missed: {missed}'

Вывод такой: This is the main menu. It is the first thing to appear.

This is the game. It will start when you click the Start button.

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

Любая помощь приветствуется.

Источник
Jan Wilamowski
2 июля 2021 в 03:50
0

Пожалуйста, предоставьте минимальный воспроизводимый пример вместо публикации всего кода. Удаление ненужных частей может даже помочь вам найти проблему.

Ответы (1)

avatar
pokepetter
2 июля 2021 в 08:02
1

ursina вызывает обновление для каждой сущности с функцией обновления. Таким образом, вы должны назначить функцию Entity.

B3CTOR
2 июля 2021 в 08:40
0

Я не знаю, что вы имеете в виду, обновление находится в классе Menu, который наследуется от Entity. как мне это сделать?

pokepetter
2 июля 2021 в 13:33
0

def update(self): на том же уровне отступа, что и __init__(self):. В настоящее время вы определяете функции внутри __init__, поэтому они не принадлежат вашему классу.