Ana Başlık 1. Çarpışma Temelleri ve Sekme
Amaç: Tuval sınırı, AABB, daire çarpışması ve sekme tepkisini öğreterek mini oyunlarda temel çarpışma testleri kurmak.
Öğrenme Çıktıları:
- Tuval sınırında konum ve hız tepkisini uygular.
- AABB ve dist tabanlı çarpışma testlerini ayırt eder.
- Sekme için hız bileşenini tersine çevirir.
- Basit fizik tepkisini hareketli nesneye bağlar.
Anahtar Sözcükler: çarpışma, AABB, dist, sekme, tuval sınırı
Giriş
Hareketli bir sketch’te nesne ekranda gezer; oyuna dönüşmesi için “değdi mi?” sorusu gerekir. Çarpışma algılama, iki şeklin kesişip kesişmediğini sınayan testlerdir. En basit hali tuval kenarıdır; ardından dikdörtgen (AABB) ve daire (dist) testleri gelir. Sekme, ilgili hız bileşenini tersine çevirerek fizik hissi verir.
Bu ana başlık temel testleri ve sekme tepkisini kurar. Hitbox ayrımı ile çoklu nesnede maliyet, İleri Teknikler kitabında ayrı bir ana başlıkta ele alınır; burada kurulan dil, durum makinesi ve XOX için yeterlidir. Bundan sonra gelen alt başlıklarda önce veri modeli, sonra hamle kuralı, en sonda çizim ve etkileşim kurulur. Her yeni fonksiyon mümkün olduğunca küçük bir örnekte çalıştırılır; böylece hatanın kaynağı daha kolay bulunur. Anlatımda önce ilgili yapının ne işe yaradığı açıklanır, ardından kod satır satır okunur. Terimler ilk geçtikleri yerde kısa bir tanımla verilir; gerekirse tablo veya görsel ile desteklenir. Örnek sketch’ler tek bir mekaniğe odaklanır; böylece yan konular okumayı dağıtmaz. Parametreleri değiştirip yeniden çalıştırmak, kuralın sınırını görmenin en hızlı yoludur. Bu ana başlığın çıktısı, sonraki oyunda yeniden kullanılabilecek bir iskelet oluşturur.
1.1. Çarpışma Algılama Nedir?
Tanım: Çarpışma algılama — İki veya daha fazla oyun nesnesinin (veya nesne ile sınırın) geometrik olarak kesişip kesişmediğini her frame (her draw() çağrısında) kontrol etme işlemidir.
Oyun döngüsünde tipik sıra:
Tablo 1.
| Adım | İş | Örnek |
|---|---|---|
| 1 | Girdi oku | keyIsDown, mouseIsPressed |
| 2 | Konumu güncelle | topX = topX + hizX * dt |
| 3 | Çarpışma kontrol et | Tuval kenarı, başka blok |
| 4 | Tepki uygula | Sekme, skor, oyun bitişi |
| 5 | Çiz | rect, ellipse, text |
Çarpışma görsel değil, mantıksal bir testtir: koşul true döndüğünde kod tepki verir; tuvalde otomatik bir efekt oluşmaz. Basit oyunlarda test genelde if ile yazılır. Aynı kontrolün (ör. AABB veya dist) birkaç yerde tekrarlanması gerekiyorsa, daha önce tanıtılan yardımcı fonksiyon yaklaşımıyla bu kontrol tek bir yere toplanabilir — fonksiyon true/false döndürür, draw içinde yalnızca if (dikdortgenlerCarpisiyor(...)) sorusu sorulur.
Dikkat: Çarpışma algılama, çarpışmanın fizik simülasyonu değildir. Gerçekçi sekme, sürtünme veya dönme ileri konulardır; burada yön tersine çevirmek (hizX = -hizX) yeterli bir basit tepkidir.
Oyunlarda neden bu kadar önemli?
Çarpışma olmadan çoğu oyun “boşlukta süzülen şekiller”e iner: raket topa değmez, mermi hedefi delip geçer, karakter duvardan yürür. Skor artışı, can kaybı, sekme, kapı açma veya ölme gibi kurallar çoğu zaman tam da bu test true olduğunda uygulanır. İlk bilgisayar oyunlarından (Pong, 1972) bugünün mobil hit’lerine kadar aynı iskelet tekrar eder: hareket et → değdi mi? → tepki ver.
Tablo 2.
| Bilinen oyun / tür | Çarpışma olunca ne olur? | Bu başlıktaki karşılık |
|---|---|---|
| Pong | Raket topa değer → yön değişir; kenar → sekme veya sayı | Sınır + daire/kutu sekmesi (§1.2, §1.5) |
| Breakout / Arkanoid | Top tuğlaya değer → tuğla kaybolur, skor artar | Daire ↔ dikdörtgen (veya AABB yaklaşımı) |
| Pac-Man | Hayalete değince can kaybı; duvara değince yol kesilir | Kutu / ızgara AABB |
| Super Mario Bros. benzeri | Zemine inme, düşmana üstten/yandan değme, coin alma | AABB; bazen ek olarak daire şeklinde çarpışma bölgesi |
| Flappy Bird | Boruya bir kez değmek → oyun biter | Sıkı AABB |
| Space Invaders / Galaga | Mermi uzaylıya değer → düşman yok olur | Küçük kutu veya daire ↔ daire |
| Angry Birds | Kuş / blok / domuz kesişince yıkım ve skor | Daire ↔ daire / kutu (fizik motoru arkada) |
| Pinball / bilardo tarzı | Top bumper veya kenara değer → sekme | Sınır + daire (§1.5’e yakın his) |
Bu tablodaki oyunların çoğunda ekranda süslü bir çizim (sprite) görülür; çarpışma ise çoğu zaman görünmez sade bir kutu veya daire ile yapılır. Bu görünmez bölgeye oyun dilinde hitbox (çarpışma kutusu / çarpışma bölgesi) denir — çizim ne kadar detaylı olursa olsun, “değdi mi?” sorusu genelde bu sade şekle sorulur.
Ticari oyunlarda bu soru çoğu zaman iki adımda sorulur. Kaba test ucuzdur: örneğin her nesnenin etrafındaki büyük AABB’ye bakılır; kutular birbirinden uzaksa “değmedi” denir ve iş biter. İnce test daha pahalıdır: yalnızca kutular örtüşünce devreye girer; çoklu hitbox, üçgen–üçgen veya piksel gibi daha sıkı bir kontrol yapılır. Amaç, uzak çiftlerde boşuna ağır hesap yapmamaktır. Bu ana başlıkta sınır, AABB ve dist gibi temel (çoğu zaman kaba) yöntemleri kuruyoruz; bunlar Pong’tan Flappy Bird’e kadar oyun hissinin omurgasıdır.
1.2. Tuval Sınırları
Tanım: Sınır (boundary) çarpışması — Hareketli nesnenin tuval kenarına (x = 0, x = width, y = 0, y = height) veya tanımlı bir oyun alanı sınırına değip değmediğinin kontrolüdür.
p5.js'te rect(x, y, w, h) sol üst köşe (x, y) ve genişlik/yükseklik kullanır. Daire için ellipse(x, y, d, d) merkez (x, y) ve çap kullanır; yarıçap r = d / 2 alınır.
Tablo 3.
| Şekil | Sol kenar | Sağ kenar | Üst kenar | Alt kenar |
|---|---|---|---|---|
Dikdörtgen (x, y, w, h) |
x |
x + w |
y |
y + h |
Daire merkez (cx, cy), yarıçap r |
cx - r |
cx + r |
cy - r |
cy + r |
Kod bloğu: Dikdörtgen kare — tuval dışına çıkmadan durdurma (Bölüm 3 Ana Başlık 4'teki constrain() alternatifi).
Kod 1.
let kareX = 100;let kareY = 80;const BOYUT = 40;const HIZ = 150; function setup() { createCanvas(400, 300); noStroke();} function draw() { background(35, 40, 55); let dt = deltaTime / 1000; if (keyIsDown(RIGHT_ARROW)) { kareX = kareX + HIZ * dt; } // Sağ kenar: sol üst x + genişlik tuvali aşmasın if (kareX + BOYUT > width) { kareX = width - BOYUT; } if (kareX < 0) { kareX = 0; } fill(100, 200, 255); rect(kareX, kareY, BOYUT, BOYUT);}Bilgi: Önceki ana başlıkta constrain(oyuncuX, 0, width - BOYUT) ile aynı sınır tek satırda uygulanmıştı. constrain() pratik bir kısayoldur; yukarıdaki if blokları sınırın neden ve ne zaman devreye girdiğini gösterir. Sekme gerektiğinde (top duvara çarpınca yön değişsin) constrain() tek başına yetmez; konumu düzelten açık if blokları ile hız tersine çevirme birlikte kullanılır.
Daire için kenar testi merkez ve yarıçap üzerinden yapılır: topX - r < 0 sol duvara değme; topX + r > width sağ duvara değme.
1.3. Dikdörtgen Çarpışması
Tanım: AABB (Axis-Aligned Bounding Box — eksen hizalı sınır kutusu) — Kenarları tuvalin X ve Y eksenlerine paralel dikdörtgen. p5.js rect() ile çizilen kutular AABB sayılır. Kutu rotate ile döndürüldüğünde kenarlar eksene paralel kalmaz; o zaman bu dört eşitsizlik tek başına yetmez (bu durum aşağıdaki Bilgi kutusunda ve ilgili YZ etkinliğinde ele alınır).
Bilgi — analitik geometri burada işe yarar: Çarpışma testi çoğu zaman lisedeki analitik geometri dilinin oyun koduna çevrilmiş hâlidir: nokta koordinatları (x, y), doğru/kenar eşitsizlikleri, iki nokta arası Öklid mesafesi (dist), dikdörtgenlerin eksenler üzerindeki izdüşümlerinin örtüşmesi. Formülleri ezberlemek değil; “ekranda gördüğüm şekil → hangi geometrik soru?” diye sormak yeterlidir.
İki dikdörtgen yalnızca hem X hem Y ekseninde aynı anda örtüşüyorsa çarpışır. Bir eksende aralarında boşluk varsa çarpışma yoktur.

Görsel 1 dört durumu gösterir: (1) hem X hem Y örtüşür → çarpışma; (2) yalnızca Y örtüşür → çarpışma yok; (3) hiçbir eksende örtüşme yok → çarpışma yok; (4) B, A’nın içinde (yine her iki eksende örtüşme) → çarpışma. A ve B’nin sekiz köşesi ayrı renklerle işaretlenir; hangi rengin hangi köşeye ait olduğu, panellerin altındaki renk anahtarında (gösterge) yazılır. Siyah düz çizgi örtüşme aralığını gösterir. Alttaki not, A ile B etiketlerinin yer değiştirmesinin sonucu değiştirmediğini (simetri) hatırlatır.
Dikdörtgen A: (ax, ay, aw, ah) — sol üst (ax, ay), genişlik aw, yükseklik ah.
Dikdörtgen B: (bx, by, bw, bh).
Tablo 4.
| Koşul | Anlam |
|---|---|
ax < bx + bw |
A'nın sol kenarı, B'nin sağ kenarından solda |
ax + aw > bx |
A'nın sağ kenarı, B'nin sol kenarından sağda |
ay < by + bh |
A'nın üst kenarı, B'nin alt kenarından yukarıda |
ay + ah > by |
A'nın alt kenarı, B'nin üst kenarından aşağıda |
Dört koşul da true ise çarpışma vardır.
Bilgi: A ile B’nin etiketlerini değiştirmek (hangisine “A”, hangisine “B” dendiği) sonucu değiştirmez: çarpışma varsa dikdortgenlerCarpisiyor(A, B) ile dikdortgenlerCarpisiyor(B, A) aynı değeri döndürür. Dört eşitsizlik bir bütün olarak simetriktir; örneğin ax < bx + bw, yer değişiminde bx < ax + aw olur ve bu, eski ax + aw > bx ile aynı örtüşme fikridir.
Kod bloğu: İki dikdörtgen çarpışma testi — yardımcı fonksiyon (önceki bölümler, fonksiyonlar).
Kod 2.
function dikdortgenlerCarpisiyor(ax, ay, aw, ah, bx, by, bw, bh) { return ax < bx + bw && ax + aw > bx && ay < by + bh && ay + ah > by;} let oyuncuX = 50;let oyuncuY = 120;const OYUNCU_BOYUT = 36;let engelX = 200;let engelY = 100;const ENGEL_W = 80;const ENGEL_H = 60; function setup() { createCanvas(480, 280); noStroke();} function draw() { background(28, 32, 48); let dt = deltaTime / 1000; if (keyIsDown(RIGHT_ARROW)) { oyuncuX = oyuncuX + 160 * dt; } if (keyIsDown(LEFT_ARROW)) { oyuncuX = oyuncuX - 160 * dt; } let carpisti = dikdortgenlerCarpisiyor( oyuncuX, oyuncuY, OYUNCU_BOYUT, OYUNCU_BOYUT, engelX, engelY, ENGEL_W, ENGEL_H ); fill(100, 200, 255); rect(oyuncuX, oyuncuY, OYUNCU_BOYUT, OYUNCU_BOYUT); // carpisti true/false → engel rengi (önceki bölümler: if / else) if (carpisti) { fill(255, 90, 90); // çarpışma var: kırmızımsı } else { fill(120, 120, 130); // çarpışma yok: gri } rect(engelX, engelY, ENGEL_W, ENGEL_H); fill(255); textSize(14); textAlign(LEFT, TOP); text("Ok: hareket | Çarpışma: " + carpisti, 12, 12);}carpisti ve if — ne oluyor?
dikdortgenlerCarpisiyor(...)dört örtüşme koşulunu hesaplar ve sonuç boolean döner:true(örtüşme var) veyafalse(yok). Bu değercarpistideğişkeninde saklanır.- Her
draw()turundaif (carpisti)sorusu sorulur — önceki bölümlerdeki koşullu ifadeyle aynı mantık: koşul doğruysaifgövdesi, değilseelsegövdesi çalışır. Burada tepki yalnızca görseldir: engel kırmızıya veya griye boyanır; skor veya sekme yoktur. - Ekrandaki
Carpisma: true/falsemetni de aynı boolean’ı yazdırır; böylece hem renk hem yazı testi doğrular.
Kısa yazım (isteğe bağlı): if/else ile fill seçmek yerine tek satırda koşullu (üçlü) operatör kullanılabilir — anlam aynıdır:
Kod 3.
fill(carpisti ? color(255, 90, 90) : color(120, 120, 130));koşul ? doğruysaDeğer : değilseDeğer okunuşu: “carpisti true ise kırmızı color, false ise gri color.” Yeni başlarken üstteki açık if/else daha okunaklıdır.
Algılama ≠ çözümleme: Bu örnekte oyuncu engelin içine girebilir; kod yalnızca “değdi mi?” diye sorar (algılama). Oyuncuyu dışarı itmek, hızı ters çevirmek veya hareketi iptal etmek (çözümleme / resolution) ayrı adımdır — §1.5’teki sekmede konum + hız düzeltilir. Önce algılamayı doğru yazmak, sonra tepki eklemek daha güvenlidir.
Bilgi — Processing ↔ p5.js (Jeff Thompson okurken): Kaynakta boolean hit = rectRect(...);, float s1x = 0;, void draw() { ... } gibi satırlar görülür. p5.js’te çoğu zaman let hit = ..., let s1x = 0, function draw() { ... } yazılır; boolean / float / void tür bildirimleri yoktur (let ve function yeterlidir). size(600, 400) yerine createCanvas(600, 400) kullanılır; fare için mouseX / mouseY aynıdır. AABB matematiği değişmez — yalnızca dil yazımı farklıdır. Çeviri pratiği bu ana başlığın YZ etkinliklerinde ele alınır.
Bilgi: Jeff Thompson'un dikdörtgen–dikdörtgen bölümü (https://www.jeffreythompson.org/collision-detection/rect-rect.php) aynı AABB mantığını görsel örneklerle anlatır (Processing sözdizimi).
1.4. Daire Çarpışması
Tanım: Daire–daire çarpışması — İki dairenin merkezleri arasındaki mesafe, yarıçapların toplamından küçükse daireler kesişir (iç içe geçer veya dışarıdan birbirine değer).

Görsel 2 merkezler arası mesafe d, yarıçaplar r1 ve r2 ile çarpışma koşulunu gösterir.
İki nokta (x1, y1) ve (x2, y2) arası Öklid mesafesi (kodda yazıldığı gibi; kare alma, ifadenin kendisiyle çarpılmasıdır):
Kod 4.
d = sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))Bu formül Pisagor teoremine dayanır: yatay fark dx = x2 - x1, dikey fark dy = y2 - y1; dik üçgende hipotenüs d = sqrt(dx * dx + dy * dy).
Tablo 5.
| Daire | Merkez | Yarıçap |
|---|---|---|
| 1 | (x1, y1) |
r1 |
| 2 | (x2, y2) |
r2 |
Çarpışma koşulu: d < r1 + r2 (tam dışarı değme için <= de kullanılabilir; oyunlarda < veya <= tercihi tutarlı olmalıdır).
Önceki bölümlerde tanıtılan dist(x1, y1, x2, y2) p5.js fonksiyonu bu mesafeyi hesaplar; karekök ve kare işlemini elle yazmaya gerek kalmaz.
Kod bloğu: İki daire — çarpışma testi. Yeşil daire sabittir; sarı/kırmızı daire ok tuşlarıyla (sol/sağ/yukarı/aşağı) yaklaştırılır — değince renk değişir.
Kod 5.
let daire1X = 120;let daire1Y = 150;const R1 = 35;let daire2X = 280;let daire2Y = 140;const R2 = 28; function setup() { createCanvas(440, 260); noStroke();} function draw() { background(25, 30, 45); let adim = 120 * deltaTime / 1000; if (keyIsDown(LEFT_ARROW)) { daire2X = daire2X - adim; } if (keyIsDown(RIGHT_ARROW)) { daire2X = daire2X + adim; } if (keyIsDown(UP_ARROW)) { daire2Y = daire2Y - adim; } if (keyIsDown(DOWN_ARROW)) { daire2Y = daire2Y + adim; } let mesafe = dist(daire1X, daire1Y, daire2X, daire2Y); let carpisti = mesafe < R1 + R2; // boolean: dikdörtgen testindeki if ile aynı fill(100, 200, 120); ellipse(daire1X, daire1Y, R1 * 2, R1 * 2); if (carpisti) { fill(255, 100, 100); } else { fill(255, 220, 80); } ellipse(daire2X, daire2Y, R2 * 2, R2 * 2); fill(255); textSize(14); textAlign(LEFT, TOP); text("mesafe: " + nf(mesafe, 0, 1) + " eşik: " + (R1 + R2), 12, 12); text("Çarpışma: " + carpisti, 12, 32); text("Ok tuşlarıyla sarı daireyi hareket ettirin", 12, 52);}Daire Tıklama oyununda dist(mouseX, mouseY, hedefX, hedefY) < hedefYaricap kullanılmıştı; fare konumu sabit yarıçaplı bir “nokta gibi” daire, hedef ise oyun dairesiydi. İki eşit statüdeki daire için koşul mesafe < r1 + r2 biçiminde genellenir — bu da analitik geometrideki “iki nokta arası uzaklık ≤ yarıçaplar toplamı” sorusunun ta kendisidir.
Bilgi: Jeff Thompson'un daire–daire bölümü (https://www.jeffreythompson.org/collision-detection/circle-circle.php) aynı dist mantığını görsel örneklerle anlatır; formülü doğrulamak için başvurulabilir. Daire–dikdörtgen (ileri): https://www.jeffreythompson.org/collision-detection/circle-rect.php
1.5. Sekme ve Basit Fizik Tepkisi
Tuval sınırına çarpan dairesel top için tipik tepki: konumu sınırın içine düzeltmek ve hız bileşeninin işaretini ters çevirmek (sekme).
Tanım: Hız vektörü — Nesnenin yatay (hizX) ve dikey (hizY) yönlerdeki saniye başına piksel cinsinden hızı. Konum güncellemesi: x = x + hizX * dt, y = y + hizY * dt.
Tablo 6.
| Olay | Konum düzeltmesi | Hız tepkisi |
|---|---|---|
Sol duvar (x - r < 0) |
x = r |
hizX = -hizX |
Sağ duvar (x + r > width) |
x = width - r |
hizX = -hizX |
Üst duvar (y - r < 0) |
y = r |
hizY = -hizY |
Alt duvar (y + r > height) |
y = height - r |
hizY = -hizY |
Önce konum sınırın dışına taşmış olabilir; sekmeden önce içeri itmek (clamp), topun duvarın içine gömülmesini azaltır.
Oyun kuralları (duvarlara çarpan top):
- Top sürekli hareket eder; hız
deltaTimeile uygulanır. - Dört tuval kenarına çarpınca ilgili hız bileşeni tersine döner.
- Ekranda anlık
hizXvehizYgösterilir.
Kod 6.
let topX;let topY;let hizX;let hizY;const YARICAP = 22;const HIZ = 220; function setup() { createCanvas(560, 360); noStroke(); topX = width / 2; topY = height / 2; hizX = HIZ * 0.7; hizY = HIZ * 0.5;} function draw() { background(22, 28, 42); let dt = deltaTime / 1000; topX = topX + hizX * dt; topY = topY + hizY * dt; if (topX - YARICAP < 0) { topX = YARICAP; hizX = -hizX; } if (topX + YARICAP > width) { topX = width - YARICAP; hizX = -hizX; } if (topY - YARICAP < 0) { topY = YARICAP; hizY = -hizY; } if (topY + YARICAP > height) { topY = height - YARICAP; hizY = -hizY; } fill(255, 190, 70); ellipse(topX, topY, YARICAP * 2, YARICAP * 2); fill(220); textSize(14); textAlign(LEFT, TOP); text("Duvarlara çarpan top", 12, 12); text("hizX: " + nf(hizX, 0, 1) + " hizY: " + nf(hizY, 0, 1), 12, 32);}Bu örnek klavye girdisi içermez; top kendi hızıyla hareket eder. Klavye kontrolü ve engel dikdörtgenleri sonraki projelerde birleştirilebilir.
Dikkat: Köşede iki duvara birden değildiğinde ilgili iki if bloğu birlikte çalışır ve hizX ile hizY aynı frame'de ters döner; bu beklenen davranıştır. Asıl dikkat edilmesi gereken nokta konum düzeltmesidir: topX = YARICAP gibi satırlar yazılmazsa top duvarın içinde kalır, aynı test ardışık frame'lerde yeniden true olur ve hız sürekli tersine çevrildiği için top kenara yapışıp titrer.
Bu başlıkta görülen çiftler → hangi test?
Çarpışma temelde bir çift üzerinden düşünülür: “A ile B değdi mi?” Bu ana başlıkta işlenen çiftler ve uygun testler:
Tablo 7.
| Çift (örnek) | Şekiller | Test | Bu başlıkta nerede? |
|---|---|---|---|
| Kare / top ↔ tuval kenarı | dikdörtgen veya daire ↔ sınır | Kenar if (sınır) |
§1.2, §1.5 |
| Blok ↔ blok | iki rect (AABB) |
Dört koşul örtüşme | §1.3 |
| Top ↔ top | iki ellipse |
dist + r1 + r2 |
§1.4 |
| Fare ↔ hedef daire | nokta ↔ daire | dist + yarıçap |
önceki bölümler Daire Tıklama (hatırlatma) |
Bu ana başlıkta “uzay gemisi / mermi” gibi yeni varlıklar tanımlanmamıştır; test seçimi önce bu tablodaki çiftler üzerinde pekiştirilir. İleride yeni bir nesne eklendiğinde aynı soru sorulur: şekil ne → sınır / AABB / dist?
Yapay Zekâ Etkileşimi: Sekme Yönü Tahmini süre: 15–20 dakika.
Amaç: Hız bileşeni ile sekme ilişkisini pekiştirmek.
Adım 1: Yatay duvara çarpan top için vx / vy değişimini yazın.
Adım 2: Yapay zekâdan aynı senaryoyu doğrulamasını isteyin.
Adım 3: Köşe çarpışmasında iki bileşenin birden tersine dönmesi riskini bir cümleyle not edin.
Özet
Tuval sınırı, AABB ve daire–daire (dist < r1 + r2) testleri mini oyunların omurgasıdır. Sekme çoğu zaman vx = -vx veya vy = -vy ile yapılır. Bu araçlar tek veya az sayıda nesne için yeterlidir.
Durum makinesi ve XOX, bu temel çarpışma dilinin üzerine kontrol akışı ekler. Görsel ile çarpışma kutusunu ayırma ve nesne sayısı artınca maliyet, sonraki kitapta hitbox ve çoklu nesne başlığında derinleşir.
Üç nokta bu ana başlığın sınırlarını çizer. Birincisi, algılama ile çözümlemenin ayrı adımlar olmasıdır: test yalnızca «değdi mi?» sorusunu yanıtlar, konumu düzeltmek veya hızı çevirmek ayrıca yazılır. İkincisi, testin şekle göre seçilmesidir; dikdörtgen için aralık örtüşmesi, daire için merkezler arası uzaklık kullanılır ve iki modeli karıştırmak yanlış sonuç üretir. Üçüncüsü, hızlı nesnelerde tek frame'lik sıçramanın engelin içinden geçmeye yol açabilmesidir; küçük adımlar veya daha büyük hitbox bu durumu azaltır.
Testin kendisi birkaç satırlık bir koşuldan ibarettir; asıl tasarım kararı, çarpışma gerçekleştiğinde oyunun ne yapacağıdır. Sekme, durma, can azaltma veya seviye geçişi aynı testin üzerine kurulur ve oyunun türünü belirleyen de bu tepkidir.
Neler Öğrendik?
Soru 1 AABB neyi test eder?
A) X ve Y aralıklarının örtüşmesini
B) Yalnızca rengi
C) DNS’i
D) Fontu
E) Git branch’i
Soru 2 İki daire çarpışmasında uygun koşul hangisidir?
A) dist < r1 + r2
B) width === height
C) key === 'a'
D) frameCount < 0
E) mouseX === mouseY
Soru 3 Duvardan sekmede tipik tepki nedir?
A) İlgili hız bileşeninin işaretini tersine çevirmek
B) Diziyi sıralamak
C) CSS yazmak
D) Tarayıcıyı kapatmak
E) createCanvas’ı draw içine almak
Soru 4 Tuval sınırı testinin pedagojik yararı nedir?
A) En basit “değdi mi?” senaryosunu somutlaştırmak
B) setup’ı silmek
C) HTML’i kapatmak
D) Ses kartını kalibre etmek
E) EPUB üretmek
Neler Öğrendik Yanıt Anahtarı
Soru 1: Doğru Cevap: A
- Çözüm: AABB eksen hizalı kutu örtüşmesidir.
- İlgili Konu: 1.3. Dikdörtgen Çarpışması
Soru 2: Doğru Cevap: A
- Çözüm: Merkez mesafesi yarıçaplar toplamıyla kıyaslanır.
- İlgili Konu: 1.4. Daire Çarpışması
Soru 3: Doğru Cevap: A
- Çözüm: vx veya vy negatife döner.
- İlgili Konu: 1.5. Sekme
Soru 4: Doğru Cevap: A
- Çözüm: Kenar teması çarpışmaya giriş kapısıdır.
- İlgili Konu: 1.2. Tuval Sınırları
Yararlanılan Kaynaklar
Bu içerik aşağıdaki kaynaklardan derlenerek hazırlanmıştır:
- McCarthy, L., Reas, C., & Fry, B. (2015). Make: Getting Started with p5.js. Maker Media.
- Moren, B. (n.d.). p5.collide2D. https://github.com/bmoren/p5.collide2D
- Nystrom, R. (2014). Game Programming Patterns. Genever Benning. https://gameprogrammingpatterns.com/
- p5.js Foundation. (n.d.). createGraphics(). https://p5js.org/reference/p5/createGraphics/
- p5.js Foundation. (n.d.). dist(). p5.js Reference. https://p5js.org/reference/p5/dist/
- p5play. (n.d.). p5.play. https://p5play.org/
- Shiffman, D. (n.d.). Code! Programming with p5.js. The Coding Train. https://thecodingtrain.com/tracks/code-programming-with-p5-js
- Thompson, J. (n.d.). Collision Detection. https://www.jeffreythompson.org/collision-detection/ (bölümler
.phpuzantılıdır; ör. rect-rect, circle-circle, circle-rect, line-line, içindekiler) - Wikipedia contributors. (n.d.). Collision detection. Wikipedia. https://en.wikipedia.org/wiki/Collision_detection (hitbox tanımı ve çoklu/parça hitbox fikri)