Arcade — Preset Oyun Motoru
import "arcade", tame üzerine kurulu bir preset motorudur.
Entity, çarpışma, bölüm ve skor tanımlarsınız; motor döngüyü,
fiziği, çarpışma dağıtımını, HUD’u, duraklat menüsünü, oyun-bitti ekranını,
dokunmatik kontrolleri, yıldızları ve rozetleri yürütür. Oyunlar genelde 20–60
satırdır. Her şey çift dillidir (Türkçe + İngilizce takma adlar).
Bir oyunun iskeleti
Section titled “Bir oyunun iskeleti”import "arcade";
func setup() { player(300, 220, 28, 28, BLUE); item(120, 120, 20, 20, GOLD);}func on_pickup() { kill(other()); score_add(10); }
scene(640, 480, "Oyunum"); // pencereyi açon_start(setup); // dünyayı kur (başta + her yeniden başlamada çalışır)on_hit(TAG_PLAYER, TAG_ITEM, on_pickup);play(); // döngüyü motora bırak| Çağrı | İngilizce | Amaç |
|---|---|---|
sahne(w, h, title) | scene | Pencereyi aç; title aynı zamanda rekor anahtarıdır. |
baslangicta(fn) | on_start | Dünyayı kur. Başta ve her yeniden başlamada / bölüm yüklemesinde çalışır. |
her_kare(fn) | on_frame | İsteğe bağlı kendi kare mantığınız (özel hareket, zamanlayıcı). |
ciz_ustune(fn) | on_draw | Entity’lerin üstüne isteğe bağlı ek çizim. |
oyna() | play | Oyunu çalıştır. |
Entity’ler
Section titled “Entity’ler”Entity’ler bir id (bir handle — asla dizi indeksi olarak kullanmayın, hep motora geri verin) döndüren preset üreticilerle oluşturulur:
| Üretici | İngilizce | Etiket + hareket |
|---|---|---|
oyuncu(x,y,w,h,color) | player | TAG_PLAYER, top-down (ok tuşları / dokunma) |
oyuncu_p(x,y,w,h,color) | platformer | TAG_PLAYER, yerçekimi + zıplama |
dusman(x,y,w,h,color) | enemy | TAG_ENEMY, otomatik hareketsiz |
esya(x,y,w,h,color) | item | TAG_ITEM |
duvar(x,y,w,h,color) | wall | TAG_WALL (katı) |
mermi(x,y,w,h,color,vx,vy) | bullet | TAG_BULLET, kendi hızıyla hareket |
uret(x,y,w,h,color,tag,mv) | spawn | Tamamen özel: etiket + hareket presetini seçin |
Hareket presetleri: MV_TOPDOWN, MV_PLATFORM, MV_VELOCITY, MV_NONE.
Etiketler: TAG_PLAYER, TAG_ENEMY, TAG_ITEM, TAG_WALL, TAG_BULLET (kendi
etiketleriniz için 6+ küçük tam sayılar da kullanabilirsiniz).
Entity’leri değiştirme (hepsi bir id alır):
hiz_ver(id, vx, vy) konumla(id, x, y) hiz_ayarla(id, s)renk_ata(id, c) resim_ata(id, tex) oldur(id)x_of(id) y_of(id) vx_of(id) vy_of(id) tag_al(id) yasiyor(id)İngilizce takma adlar: set_vel, set_pos, move_speed, set_color,
set_sprite, kill, get_x, get_y, get_vx, get_vy, tag_of, alive.
Sayma: entity_sayisi(), canli_sayisi() (live_count), tag_sayisi(tag)
(tag_count — bir etiketli canlı entity’ler, ör. “tüm eşyalar toplandı mı?”).
Çarpışmalar
Section titled “Çarpışmalar”Bir etiket çifti için bir işleyici kaydedin; bu tür iki entity çakışınca motor onu çağırır:
func on_pickup() { kill(other()); // dokunduğumuz eşya score_add(10);}on_hit(TAG_PLAYER, TAG_ITEM, on_pickup); // TR: carpisincaİşleyici içinde me() (ben) ilk-etiket entity’si, other() (oteki)
ikinci-etiket entity’sidir. overlaps(a, b) (degiyor) herhangi iki id’yi anında
test eder.
Fizik (platformer)
Section titled “Fizik (platformer)”gravity(1400); // TR: yercekimi — aşağı yönlü ivmejump_power(640); // TR: ziplama — zıplama hızıplatformer(60, 300, 28, 28, BLUE);wall(0, 440, 640, 40, DARKGRAY); // katı zeminTAG_WALL entity’leri katıdır: motor çarpışmaları minimum-öteleme-vektörü itmesiyle
çözer (üste in → yere basılı; yana çarp → engellenir). Varsayılan olarak entity’ler
dünyaya kırpılır; clamp_to_world(false) bunu kapatır.
Skor, HUD ve oyun-bitti
Section titled “Skor, HUD ve oyun-bitti”score_add(n) score() set_score(n) // skor_ekle / skor / skor_atagame_over() // oyun_bitti — oyunu bitiriris_over() is_won() // bitti_mi / kazandin_mibest_score() // en_iyi_skor — sahne başlığına göre kalıcıhud("Altin: ") hide_hud() // skor satırını özelleştir / gizlecontrols("Ok tuslari hareket, Space zipla") // bilgi — bir ipucu şeridigame_over() otomatik olarak ekran sarsıntısı, flash, kayıp tonu, haptik ve rekor
kontrolü ekler — her oyun bu “juice”i bedava alır. Profesyonel oyun-bitti örtüsü
(skor, en iyi, Tekrar Oyna / Menü butonları) motor tarafından çizilir.
Bölümler
Section titled “Bölümler”Çok bölümlü oyunlar motorun işidir — akışı asla yeniden yazmazsınız:
func setup() { player(300, 220, 28, 28, BLUE); } // her bölümden önce çalışırfunc lvl1() { item(120, 120, 20, 20, GOLD); }func lvl2() { item(120, 120, 20, 20, GOLD); item(500, 340, 20, 20, GOLD); }
func on_pickup() { kill(other()); score_add(10); if (tag_count(TAG_ITEM) == 0) { next_level(); } // bolum_gec}
on_start(setup);level(1, lvl1); // TR: bolumlevel(2, lvl2);on_hit(TAG_PLAYER, TAG_ITEM, on_pickup);next_level() ilerletir (son bölümde kazanır); kare sonuna ertelenir, yani bir
çarpışma işleyicisinden çağırmak güvenlidir. Skor bölümler arası korunur.
level_no() / level_count() (bolum_no / bolum_sayisi) ile sorgulayın.
Yıldızlar ve rozetler
Section titled “Yıldızlar ve rozetler”İlerleme otomatik ve kalıcıdır. Launcher’da (aşağı bakın) bölümlü bir oyuna
dokununca bir bölüm seçim ekranı açılır; her bölüm geçtiğiniz an kendi altın
yıldızını kazanır ve eski bölümler tekrar oynanabilir. Kartlar tamamlanan / tüm
gösterir.
Sonsuz oyunlar (hiç level(...) çağrısı yok) bunun yerine skor eşiği tanımlar:
star_goals(100, 400, 1000); // TR: yildiz_hedef — en iyi skora göre 1★ / 2★ / 3★Beş kalıcı rozet oynadıkça açılır: İlk Zafer, Rekortmen, Üç Yıldız, Koleksiyoncu (toplam 15 yıldız) ve Usta (30) — launcher menüsündeki kupa düğmesinin arkasında, yeni kazanınca bir toast ile. Hiçbir şey asla kilitli değildir.
Kontrol şemaları (mobil)
Section titled “Kontrol şemaları (mobil)”Motor ekran-üstü dokunmatik kontrolleri otomatik çizer ve okur. Oyuna uyan şemayı
control_scheme(...) (TR kontrol_semasi) ile seçin:
| Değer | Gösterilen kontrol |
|---|---|
"joystick" | Yüzen analog çubuk (8 yön) |
"dpad" / "yon4" | 4 yönlü D-pad |
"yatay" / "horizontal" | Yalnız ◀ ▶ butonları |
"dikey" / "vertical" | Yalnız ▲ ▼ butonları |
"tilt" / "egim" | İvmeölçerle yönlendirme |
"none" / "yok" | Kontrol yok (yalnız dokunma oyunları) |
| (ayarsız) | Otomatik — oyunun okuduğu yönlerden çıkarılır |
Hareketi motor üzerinden okuyun ki klavye ve dokunma birlikte çalışsın:
left(), right(), up(), down() (TR sol/sag/yukari/asagi); aksiyonlar
action_pressed() / fire_pressed() (aksiyon_basildi / ates_basildi);
tüm-ekran dokunuşları tapped() (dokunuldu); jestler swiped("left")
(kaydirildi). Masaüstü klavye değişmeden çalışmaya devam eder.
Efektler (juice)
Section titled “Efektler (juice)”explode(x, y, color) // patlama — parçacık patlamasıexplode_n(x, y, color, n) // patlama_n — özel parçacık sayısıylashake() // sars — kısa ekran sarsıntısıflash() // parla — beyaz flaşgame_over() zaten sarsıntı + flash + rekor kontrolü tetikler, yani sade bir oyun
bile canlı hisseder.
Ses, haptik ve dil
Section titled “Ses, haptik ve dil”sound_on(true) music_on(true) haptics_on(true) show_fps(true)language("en") // dil — "en" veya "tr"; motor HUD'unu yeniden çevirirBunlar yerleşik Ayarlar ekranında da açığa çıkar ve otomatik kalıcıdır.
Launcher — birçok oyun, tek uygulama
Section titled “Launcher — birçok oyun, tek uygulama”Birkaç oyunu tek pencerede (ve tek APK’da) launcher ile toplayın:
import "arcade";// ... her oyun, scene()/play() ÇAĞIRMAYAN ama sahne/bölüm/çarpışma kaydeden// 0-arg bir setup fonksiyonu olarak ...
launcher_title("BENIM ARCADE'IM"); // menu_basligiadd_game("Topla", topla_setup); // oyun_ekleadd_game("Zipla", zipla_setup);scene(640, 480, "Arcade");launcher(); // menü ↔ oyun ↔ ayarlar ↔ rozetler makinesiadd_game(name, setup) bir oyun kaydeder; launcher() duyarlı bir kart ızgarası,
oyun-başına yıldızlar, ayarlar dişlisi ve rozet kupasını çizer ve oyunlar arası
geçiş yapar. Yayınlanan Tulpar Arcade uygulaması tek launcher arkasında 13
oyundur.
İsteğe bağlı: global liderlik tablosu
Section titled “İsteğe bağlı: global liderlik tablosu”leaderboard_url("http://10.0.2.2:3000") // skor_tablosu_url — bir Wings sunucusuplayer_name("Ada") // oyuncu_adiAyarlanınca her oyun oyun-bitişinde skorunu gönderir ve global top-5’i gösterir. Varsayılan kapalı (URL yok → ağ yok).
Pencere açmadan test
Section titled “Pencere açmadan test”Motorun headless adım API’si vardır — pencere açmadan simülasyonu bir tık ilerletir, regresyon testleri için idealdir:
step(0.016); // TR: adim — bir kare fizik + çarpışma çalıştırArcade regresyon paketleri bölüm akışını, çarpışmaları, yıldızları ve rozetleri CI’da ekran olmadan böyle doğrular.
Yayına hazır mısınız? Derleme ve Yayınlamaya geçin.