from ursina import *
import random

app = Ursina()
window.title = "上帝视角跑酷（玩家清晰可见）"
window.fps_counter.enabled = True

# 跑道
road = Entity(
    model="plane",
    scale=(12, 1, 300),
    color=color.dark_gray,
    position=(0, 0, -120)
)
# 车道黄线
for z in range(-300, 50, 10):
    Entity(model="cube", scale=(0.2, 0.1, 8), color=color.yellow, position=(-4, 0.05, z))
    Entity(model="cube", scale=(0.2, 0.1, 8), color=color.yellow, position=(4, 0.05, z))

# 超大高亮玩家，辨识度拉满
player = Entity(
    model="cube",
    color=color.cyan,
    scale=(2.2, 3.2, 1.6),
    position=(0, 1, 0)
)

# 【核心修复】拉近相机、降低高度，镜头死死对准玩家
camera.position = (0, 16, -22)
camera.look_at(player)  # 镜头直接锁定玩家，永远不会丢失

score = 0
game_over = False
speed = 0.2
entity_list = []

score_text = Text(f"Score: {score}", position=(-0.8, 0.45), scale=2)
gameover_text = Text("GAME OVER\nSPACE Restart", position=(0,0), scale=3, color=color.red, enabled=False)

# 障碍物
class Obstacle(Entity):
    def __init__(self):
        super().__init__(
            model="cube",
            color=color.red,
            scale=(2,3,2),
            position=(random.choice([-6,0,6]), 1, -150)
        )
    def update(self):
        global score, game_over, speed
        if game_over:
            return
        self.z += speed
        if distance(self, player) < 3:
            game_over = True
            gameover_text.enabled = True
        if self.z > 10:
            destroy(self)
            score += 10
            speed = min(speed + 0.002, 0.6)
        score_text.text = f"Score: {score}"

# 金币
class Coin(Entity):
    def __init__(self):
        super().__init__(
            model="sphere",
            color=color.yellow,
            scale=1.4,
            position=(random.choice([-6,0,6]), 1.5, -150)
        )
    def update(self):
        self.z += speed
        self.rotation_y += 2
        if distance(self, player) < 3:
            global score
            score += 50
            destroy(self)
        if self.z > 10:
            destroy(self)

spawn_timer = 0
def update():
    global spawn_timer, game_over, speed, score
    if game_over:
        if held_keys["space"]:
            for e in entity_list:
                destroy(e)
            entity_list.clear()
            player.position = (0,1,0)
            speed = 0.2
            score = 0
            game_over = False
            gameover_text.enabled = False
        return

    spawn_timer += time.dt
    if spawn_timer > 1.2:
        spawn_timer = 0
        if random.random() < 0.3:
            new_e = Coin()
        else:
            new_e = Obstacle()
        entity_list.append(new_e)

    # 左右移动
    move = 8 * time.dt
    if held_keys["left arrow"] and player.x > -6:
        player.x -= move
    if held_keys["right arrow"] and player.x < 6:
        player.x += move

    # 跳跃重力
    if held_keys["up arrow"] and player.y <= 1.05:
        player.y += 6 * time.dt
    if player.y > 1:
        player.y -= 8 * time.dt
    if player.y < 1:
        player.y = 1

app.run()