Почему действие on_click не работает на ursina?Python

Программы на Python
Ответить
Anonymous
 Почему действие on_click не работает на ursina?

Сообщение Anonymous »

Я попробовал заставить зеленые кубики запускать код при нажатии, и это сработало:

Код: Выделить всё

python
from ursina import *

nav = [None, 0, 0]

# Configurable variables
movement_speed = 0.1  # Speed of movement when holding WASD
rotation_speed = 40   # Speed of rotation (degrees per frame)
camera_distance = 15  # Distance of the camera from the player
target_threshold = 0.5  # Distance threshold to stop moving when reaching the target
control_mode = 0  # 0 = Move with click, 1 = Move with WASD

def click():
global nav
nav = [(mouse.hovered_entity.x, mouse.hovered_entity.y + mouse.hovered_entity.scale[1] / 2, mouse.hovered_entity.z), 1, 0]

def normalize_direction_vector(x_a, y_a, x_b, y_b):
global nav
dx = x_b - x_a
dy = y_b - y_a
magnitude = math.sqrt(dx**2 + dy**2)
try:
i = dx / magnitude
if magnitude < target_threshold:
nav[2] = 1
except:
i = 0
nav[2] = 1
try:
j = dy / magnitude
if magnitude < target_threshold:
nav[2] = 1
except:
j = 0
nav[2] = 1
return [i, j]

u = Ursina(fullscreen=1, development_mode=1)

a = Entity(model="cube", position=Vec3(0, 0, 0), scale=Vec3(1, 1, 1))

for i in range(10):
for j in range(10):
block = Entity(model='cube', color=color.green, position=Vec3(i, -1, j), scale=Vec3(1, 1, 1), collider="box", on_click=click)

cam = camera

while True:
if held_keys["escape"]:
break

try:
hov.color = color.green
except:
pass

if control_mode:  # WASD Movement
if held_keys["w"]:
a.x += movement_speed
a.z += movement_speed
if held_keys["s"]:
a.x -= movement_speed
a.z -= movement_speed
if held_keys["a"]:
a.x -= movement_speed
a.z += movement_speed
if held_keys["d"]:
a.x += movement_speed
a.z -= movement_speed

if not control_mode and nav[1]:  # Click-to-move
c = normalize_direction_vector(a.x, a.z, nav[0][0], nav[0][2])
if nav[2]:
nav = [None, 0, 0]
else:
a.x += c[0] * movement_speed
a.z += c[1] * movement_speed

a.look_at((mouse.x * 5 + a.x, 0, mouse.y * 5 + a.z,))
cam.x = a.x - camera_distance
cam.y = a.y + camera_distance
cam.z = a.z - camera_distance
cam.look_at((mouse.x * 5 + a.x, 0, mouse.y * 5 + a.z,))

try:
hov = mouse.hovered_entity
mouse.hovered_entity.color = color.black
except:
pass

a.rotate(Vec3(0, rotation_speed, 0))
u.step()

но когда я изменил свой код вот так:

Код: Выделить всё

python
from ursina import *
class platfoarm(Entity):
def __init__(self,model=None):
pass

def click():
global nav
nav = [(mouse.hovered_entity.x, mouse.hovered_entity.y + mouse.hovered_entity.scale[1] / 2, mouse.hovered_entity.z), 1, 0]

def runner():

nav = [None, 0, 0]

# Configurable variables
movement_speed = 0.1  # Speed of movement when holding WASD
rotation_speed = 40   # Speed of rotation (degrees per frame)
camera_distance = 15  # Distance of the camera from the player
target_threshold = 0.5  # Distance threshold to stop moving when reaching the target
control_mode = 0  # 0 = Move with click, 1 = Move with WASD

def normalize_direction_vector(x_a, y_a, x_b, y_b):
global nav
dx = x_b - x_a
dy = y_b - y_a
magnitude = math.sqrt(dx**2 + dy**2)
try:
i = dx / magnitude
if magnitude < target_threshold:
nav[2] = 1
except:
i = 0
nav[2] = 1
try:
j = dy / magnitude
if magnitude <  target_threshold:
nav[2] = 1
except:
j = 0
nav[2] = 1
return [i, j]

u = Ursina(fullscreen=1, development_mode=1)

a = Entity(model="cube", position=Vec3(0, 0, 0), scale=Vec3(1, 1, 1))
platfoarm()
for i in range(10):
for j in range(10):
block = Entity(model='cube', color=color.green, position=Vec3(i, -1, j), scale=Vec3(1, 1, 1), collider="box", on_click=click)

cam = camera

while True:
if held_keys["escape"]:
break

try:
hov.color = color.green
except:
pass

if control_mode:  # WASD Movement
if held_keys["w"]:
a.x += movement_speed
a.z += movement_speed
if held_keys["s"]:
a.x -= movement_speed
a.z -= movement_speed
if held_keys["a"]:
a.x -= movement_speed
a.z += movement_speed
if held_keys["d"]:
a.x += movement_speed
a.z -= movement_speed

if not control_mode and nav[1]:  # Click-to-move
c = normalize_direction_vector(a.x, a.z, nav[0][0], nav[0][2])
if nav[2]:
nav = [None, 0, 0]
else:
a.x += c[0] * movement_speed
a.z += c[1] * movement_speed

a.look_at((mouse.x * 5 + a.x, 0, mouse.y * 5 + a.z,))
cam.x = a.x - camera_distance
cam.y = a.y + camera_distance
cam.z = a.z - camera_distance
cam.look_at((mouse.x * 5 + a.x, 0, mouse.y * 5 + a.z,))

try:
hov = mouse.hovered_entity
mouse.hovered_entity.color = color.black
except:
pass

a.rotate(Vec3(0, rotation_speed, 0))
u.step()
runner()
это больше не работает. Я не хочу менять свой код (например, используя app.run и обновление def, которое я хочу сохранить в цикле while) class platfoarm() (с орфографической ошибкой) все еще не является частью кода
Я спросил в чате, но не получил полезных ответов

Подробнее здесь: https://stackoverflow.com/questions/793 ... -on-ursina
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»