from random import uniform
from ursina import (
Entity,
Text,
Ursina,
Vec3,
camera,
color,
destroy,
held_keys,
invoke,
time,
window,
)
app = Ursina()
# 1. EKRAN VE MAVİ GÖKYÜZÜ
window.title = "AirStrike 3D - Yeşil Helikopter & Füzeler"
window.borderless = False
window.fullscreen = False
window.color = color.rgb(100, 175, 240) # Açık Mavi Gökyüzü
# Kamera Açısı
camera.position = (0, 26, -20)
camera.rotation_x = 50
# 2. ÇEVRE VE VADİ
# Yeşil Ova
ground = Entity(
model="plane",
scale=(100, 1, 300),
color=color.rgb(45, 130, 55),
position=(0, 0, 100),
)
# Ortadan Geçen Nehir
river = Entity(
model="plane",
scale=(20, 1.1, 300),
color=color.rgb(25, 115, 210),
position=(0, 0.05, 100),
)
# Yan Dağlar
for z in range(-20, 250, 20):
Entity(
model="cone",
color=color.rgb(85, 70, 55),
scale=(18, 22, 18),
position=(-32, 0, z),
)
Entity(
model="cone",
color=color.rgb(80, 65, 50),
scale=(18, 22, 18),
position=(32, 0, z),
)
# 3. DETAYLI YEŞİL 3D HELİKOPTER
player = Entity(position=(0, 3, 0))
# Ana Gövde (Yeşil)
body = Entity(
parent=player,
model="cube",
color=color.rgb(35, 120, 45),
scale=(1.6, 1.0, 3.0),
)
# Kokpit Camı
cockpit = Entity(
parent=player,
model="sphere",
color=color.azure,
scale=(1.3, 0.8, 1.2),
position=(0, 0.2, 1.0),
)
# Yeşil Kuyruk Gövdesi
tail = Entity(
parent=player,
model="cube",
color=color.rgb(30, 100, 40),
scale=(0.4, 0.4, 2.6),
position=(0, 0.2, -2.2),
)
# Dikey Kuyruk Kanadı
tail_fin = Entity(
parent=tail,
model="cube",
color=color.rgb(35, 120, 45),
scale=(0.2, 1.2, 0.6),
position=(0, 0.5, -1.0),
)
# Dönen Ana Pervane
rotor = Entity(
parent=player,
model="cube",
color=color.black,
scale=(7.0, 0.05, 0.3),
position=(0, 0.7, 0),
)
# Yan Silah Kanatları
wing_left = Entity(
parent=player,
model="cube",
color=color.rgb(25, 85, 35),
scale=(1.2, 0.2, 0.6),
position=(-1.2, -0.1, 0),
)
wing_right = Entity(
parent=player,
model="cube",
color=color.rgb(25, 85, 35),
scale=(1.2, 0.2, 0.6),
position=(1.2, -0.1, 0),
)
# 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. DÜŞMAN FÜZELER (Kırmızı Kutular Yerine)
def spawn_enemy():
enemy = Entity(position=(uniform(-18, 18), 3, player.z + 50))
# Kırmızı Füze Gövdesi
Entity(
parent=enemy,
model="cylinder",
color=color.red,
scale=(0.8, 3.2, 0.8),
rotation_x=90,
)
# Füze Ucu (Siyah Koni)
Entity(
parent=enemy,
model="cone",
color=color.black,
scale=(0.9, 1.2, 0.9),
position=(0, 0, -1.8),
rotation_x=-90,
)
# Füze Kanatları
Entity(
parent=enemy,
model="cube",
color=color.dark_gray,
scale=(2.0, 0.1, 0.6),
position=(0, 0, 1.2),
)
Entity(
parent=enemy,
model="cube",
color=color.dark_gray,
scale=(0.1, 2.0, 0.6),
position=(0, 0, 1.2),
)
enemies.append(enemy)
invoke(spawn_enemy, delay=0.9)
spawn_enemy()
# 6. OYUN DÖNGÜSÜ
def update():
global score, shoot_cooldown
move_speed = 15 * time.dt
# Pervaneyi Döndür
rotor.rotation_y += 1400 * time.dt
# Oyuncu Hareketi ve Yana Yatma
if held_keys["a"] or held_keys["left arrow"]:
player.x -= move_speed
player.rotation_z = 22
elif held_keys["d"] or held_keys["right arrow"]:
player.x += move_speed
player.rotation_z = -22
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
# Dağlar Arasında Kalma Sınırı
player.x = max(-18, min(18, player.x))
# Kamera Takibi
camera.x = player.x
camera.z = player.z - 20
# SERİ ATEŞ ETME (Space Tuşuna Basılı Tutunca)
shoot_cooldown -= time.dt
if held_keys["space"] and shoot_cooldown <= 0:
b1 = Entity(
model="sphere",
color=color.yellow,
scale=0.5,
position=player.position + Vec3(-1.2, -0.1, 1.5),
)
b2 = Entity(
model="sphere",
color=color.yellow,
scale=0.5,
position=player.position + Vec3(1.2, -0.1, 1.5),
)
bullets.extend([b1, b2])
shoot_cooldown = 0.14
# Mermileri İlerlet
for bullet in bullets[:]:
bullet.z += 60 * time.dt
if bullet.z > player.z + 55:
bullets.remove(bullet)
destroy(bullet)
# Düşman Füzelerin Gelmesi
for enemy in enemies[:]:
enemy.z -= 8 * time.dt
if enemy.z < player.z - 10:
enemies.remove(enemy)
destroy(enemy)
# VURMA KONTROLÜ (Çarpışma Hesabı)
for bullet in bullets[:]:
for enemy in enemies[:]:
if (bullet.position - enemy.position).length() < 2.3:
score += 100
score_text.text = f"SKOR: {score}"
if enemy in enemies:
enemies.remove(enemy)
destroy(enemy)
if bullet in bullets:
bullets.remove(bullet)
destroy(bullet)
break
app.run()