from random import uniform
from ursina import (
Entity,
Text,
Ursina,
Vec3,
camera,
color,
destroy,
held_keys,
invoke,
time,
window,
)
app = Ursina()
# 1. EKRAN VE GÖKYÜZÜ
window.title = "AirStrike 3D - Klasik Harita"
window.borderless = False
window.fullscreen = False
window.color = color.azure # Klasik mavi gökyüzü
camera.position = (0, 28, -20)
camera.rotation_x = 55
# 2. AİRSTRİKE 3D KLASİK HARİTASI (Nehir ve Vadi)
# Ana Yeşil Vadi Zemini
ground = Entity(
model="plane",
scale=(120, 1, 400),
color=color.rgb(35, 110, 40),
position=(0, 0, 100)
)
# Ortadan Akan Klasik Nehir Yatağı
river = Entity(
model="plane",
scale=(22, 1.1, 400),
color=color.rgb(20, 95, 180),
position=(0, 0.05, 100)
)
# Haritanın Sağ ve Sol Kenarlarındaki Dağlar (Vadi Hissi)
for z in range(-30, 300, 20):
# Sol Dağlar
Entity(model="cone", color=color.rgb(75, 60, 45), scale=(18, 25, 18), position=(-32, 0, z))
# Sağ Dağlar
Entity(model="cone", color=color.rgb(70, 55, 40), scale=(18, 25, 18), position=(32, 0, z))
# 3. YUVARLAK VE DETAYLI HELİKOPTER
player = Entity(position=(0, 3, 0))
# Ana Gövde (Yeşil)
body = Entity(parent=player, model="sphere", color=color.green, scale=(1.8, 1.2, 3.8))
# Kokpit Camı (Mavi)
cockpit = Entity(parent=player, model="sphere", color=color.cyan, scale=(1.4, 0.9, 1.5), position=(0, 0.3, 1.2))
# Kuyruk (Silindir)
tail = Entity(parent=player, model="cylinder", color=color.green, scale=(0.3, 3.0, 0.3), position=(0, 0.1, -2.5), rotation_x=90)
# Ana Pervane Sistemi
rotor_base = Entity(parent=player, position=(0, 0.8, 0))
blade1 = Entity(parent=rotor_base, model="sphere", color=color.black, scale=(7.5, 0.05, 0.3))
blade2 = Entity(parent=rotor_base, model="sphere", color=color.black, scale=(0.3, 0.05, 7.5))
# 4. SKOR VE DEĞİŞKENLER
score = 0
score_text = Text(text=f"SKOR: {score}", position=(-0.85, 0.45), scale=2, color=color.yellow)
bullets = []
enemies = []
shoot_cooldown = 0.0
# 5. AERODİNAMİK DÜŞMAN FÜZELERİ
def spawn_enemy():
enemy = Entity(position=(uniform(-18, 18), 3, player.z + 70))
# Kırmızı Silindir Gövde
Entity(parent=enemy, model="cylinder", color=color.red, scale=(1.0, 3.5, 1.0), rotation_x=90)
# Siyah Sivri Burun
Entity(parent=enemy, model="cone", color=color.black, scale=(1.0, 1.5, 1.0), position=(0, 0, -2.0), rotation_x=-90)
# Gri Motor Kısmı
Entity(parent=enemy, model="sphere", color=color.gray, scale=(0.8, 0.8, 0.8), position=(0, 0, 1.7))
enemies.append(enemy)
invoke(spawn_enemy, delay=0.8)
spawn_enemy()
# 6. OYUN DÖNGÜSÜ
def update():
global score, shoot_cooldown
move_speed = 18 * time.dt
# Pervaneyi döndür
rotor_base.rotation_y += 2000 * time.dt
# Hareket kontrolleri (A/D ile yana yatarak dönme)
if held_keys["a"] or held_keys["left arrow"]:
player.x -= move_speed
player.rotation_z = 25
elif held_keys["d"] or held_keys["right arrow"]:
player.x += move_speed
player.rotation_z = -25
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
# Harita Sınırları (Dağların dışına çıkmayı engeller)
player.x = max(-22, min(22, player.x))
# Kamera Takibi
camera.x = player.x
camera.z = player.z - 22
# SERİ ATEŞ ETME (Space Tuşuna Basılı Tut)
shoot_cooldown -= time.dt
if held_keys["space"] and shoot_cooldown <= 0:
b1 = Entity(model="sphere", color=color.yellow, scale=0.6, position=player.position + Vec3(-1.2, -0.2, 1.5))
b2 = Entity(model="sphere", color=color.yellow, scale=0.6, position=player.position + Vec3(1.2, -0.2, 1.5))
bullets.extend([b1, b2])
shoot_cooldown = 0.12
# Mermileri ileri uçur
for b in bullets[:]:
b.z += 80 * time.dt
if b.z > player.z + 70:
bullets.remove(b)
destroy(b)
# Füzeleri üstüne doğru uçur
for e in enemies[:]:
e.z -= 15 * time.dt
if e.z < player.z - 15:
enemies.remove(e)
destroy(e)
# VURMA KONTROLÜ
for b in bullets[:]:
for e in enemies[:]:
if (b.position - e.position).length() < 3.0:
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
app.run()