from random import uniform
from ursina import (
Entity,
Text,
Ursina,
Vec3,
camera,
color,
destroy,
held_keys,
invoke,
time,
window,
)
app = Ursina()
# 1. ARKA PLAN VE KAMERA (Işıklandırmalar Silindi - Kesin Mavi Ekran)
window.title = "AirStrike 3D - Kesin Çözüm"
window.borderless = False
window.fullscreen = False
window.color = color.rgb(100, 180, 255) # Garanti mavi gökyüzü
camera.position = (0, 25, -20)
camera.rotation_x = 50
# 2. ZEMİN VE DAĞLAR (Sadece temel 'cube' kullanıldı)
ground = Entity(model="cube", scale=(80, 1, 300), color=color.rgb(40, 130, 40), position=(0, 0, 100))
river = Entity(model="cube", scale=(15, 1.2, 300), color=color.rgb(30, 100, 200), position=(0, 0, 100))
# 3. YEŞİL HELİKOPTER (Sadece temel 'cube' ve 'sphere' ile inşa edildi)
player = Entity(position=(0, 3, 0))
# Gövde (Yeşil)
body = Entity(parent=player, model="cube", color=color.green, scale=(1.5, 1.0, 3.0))
# Kokpit Camı (Mavi)
cockpit = Entity(parent=player, model="sphere", color=color.cyan, scale=(1.2, 0.8, 1.2), position=(0, 0.2, 1.0))
# Pervane (Siyah)
rotor = Entity(parent=player, model="cube", color=color.black, scale=(6.0, 0.1, 0.4), position=(0, 0.6, 0))
# Kuyruk (Yeşil)
tail = Entity(parent=player, model="cube", color=color.green, scale=(0.4, 0.4, 2.0), position=(0, 0.2, -2.0))
score = 0
score_text = Text(text=f"SKOR: {score}", position=(-0.85, 0.45), scale=2, color=color.white)
bullets = []
enemies = []
# 4. KIRMIZI FÜZELER (Koni/Silindir yerine hata vermeyen Küp kullanıldı)
def spawn_enemy():
enemy = Entity(position=(uniform(-15, 15), 3, player.z + 50))
# Füze Gövdesi (Kırmızı Küp)
Entity(parent=enemy, model="cube", color=color.red, scale=(1.2, 1.2, 3.5))
# Füze Ucu (Siyah Küp)
Entity(parent=enemy, model="cube", color=color.black, scale=(1.25, 1.25, 1.0), position=(0, 0, -1.5))
enemies.append(enemy)
invoke(spawn_enemy, delay=1.0)
spawn_enemy()
# 5. OYUN DÖNGÜSÜ VE FİZİKLER
def update():
global score
move_speed = 15 * time.dt
# Pervane dönüşü
rotor.rotation_y += 1500 * time.dt
# Hareket
if held_keys["a"] or held_keys["left arrow"]:
player.x -= move_speed
player.rotation_z = 20
elif held_keys["d"] or held_keys["right arrow"]:
player.x += move_speed
player.rotation_z = -20
else:
player.rotation_z = 0
if held_keys["w"] or held_keys["up arrow"]:
player.z += move_speed
if held_keys["s"] or held_keys["down arrow"]:
player.z -= move_speed
# Kamera takip
camera.x = player.x
camera.z = player.z - 20
# Mermiler
for b in bullets[:]:
b.z += 60 * time.dt
if b.z > player.z + 60:
bullets.remove(b)
destroy(b)
# Füzeler (Sana doğru geliyor)
for e in enemies[:]:
e.z -= 10 * time.dt
if e.z < player.z - 10:
enemies.remove(e)
destroy(e)
# Çarpışma / Vurma (Mesafeyi ölçerek garanti patlatma)
for b in bullets[:]:
for e in enemies[:]:
if (b.position - e.position).length() < 2.5:
score += 100
score_text.text = f"SKOR: {score}"
if e in enemies:
enemies.remove(e)
destroy(e)
if b in bullets:
bullets.remove(b)
destroy(b)
break
# 6. GARANTİLİ ATEŞ ETME (Her Space'e basışta tek mermi)
def input(key):
if key == "space":
b = Entity(model="sphere", color=color.yellow, scale=0.6, position=player.position + Vec3(0, 0, 1.5))
bullets.append(b)
app.run()