Bölüm 3 · Sunum 4
Basılı tutunca yürümek, bir kez basınca zıplamak. İkisi aynı şey değil.
Sağ oka basılı tutuyorsunuz: karakter yürümeye devam ediyor. Boşluğa basılı tutuyorsunuz: karakter durmadan zıplıyor mu?
| Girdi | Sürekli (basılı tutma) | Tek seferlik (basma anı) |
|---|---|---|
| Fare | mouseIsPressed, mouseX / mouseY | mousePressed() |
| Klavye | keyIsDown(…) | keyPressed() |
Tanıdık bir ayrım: Daire Tıklama’da skoru mouseIsPressed ile değil mousePressed() ile saymıştık. Klavyede de aynı iki katman var.
| Araç | Ne zaman çalışır? | Tipik kullanım |
|---|---|---|
draw() + keyIsDown() | Tuş basılı olduğu sürece, her frame | Sürekli yürüme, hızlanma |
keyPressed() | Tuşa basıldığı an, bir kez | Zıplama, ateş, menü seçimi, turu yenileme |
keyReleased() | Tuş bırakıldığı an, bir kez | Şarj biriktirip bırakınca ateş etme |
keyPressed ve keyReleased, p5.js’in kendisinin çağırdığı olay fonksiyonlarıdır. setup ve draw gibi tam olarak böyle yazılmalıdır.keyIsDown(): şu an basılı mı?keyIsDown(tuş)Verilen tuş o frame’de basılıysa true, değilse false döndürür. draw() içinde çağrılır.| Tuş | Yazımı |
|---|---|
| Sol ok | keyIsDown(LEFT_ARROW) |
| Sağ ok | keyIsDown(RIGHT_ARROW) |
| Yukarı ok | keyIsDown(UP_ARROW) |
| Aşağı ok | keyIsDown(DOWN_ARROW) |
| Harf (A, D) | keyIsDown(65), keyIsDown(68) |
Ok tuşları için hazır sabitler var. Harf tuşlarında keyIsDown bir sayı ister; nedenini birazdan göreceğiz.
Tuvale tıklayıp sağ ve sol oka basılı tutun. Hız yine deltaTime ile: saniyede 180 piksel.
keyPressed() içine yazarsak kare nasıl hareket eder?Sağ oka basılı tutuyorsunuz…
keyPressed() “tuşla ilgili her şeyin yazıldığı yer” gibi görünür. Ama yalnızca basma anında bir kez tetiklenir.draw() içinde, keyIsDown() ile.Dört ayrı if birbirinden bağımsızdır. Sağ ve yukarı aynı anda basılıysa ikisi de çalışır: kare çapraz gider. else if yalnızca tek yön seçilecekse uygundur.
| Basılı tuşlar | x | y | Etki |
|---|---|---|---|
| Yalnızca → | + | 0 | Yatay |
| Yalnızca ↑ | 0 | − | Dikey |
| → ve ↑ | + | − | Çapraz, sağ üst |
İki eksende de HIZ kadar ilerleyince köşegen, Pisagor’a göre √2 ≈ 1.41 kat daha uzun olur.
Rekabetçi oyunlarda hız normalize edilir: iki bileşen birim vektöre göre ölçeklenir, sonra HIZ ile çarpılır. Basit örneklerimizde buna gerek yok.
keyPressed() ve keykeyBasılan tuşun karakter değerini tutan değişken: 'a', 'R', ' ' (boşluk). Yalnızca olay fonksiyonu çalıştığı anda anlamlıdır."r" ile "R" farklı karakterlerdir. Caps Lock açık olabilir; ikisini de kontrol edin.
keyPressed() ile mousePressed() aynı mantığı izler: olay bir kez tetiklenir. Zıplama, tek atış, menüde seçim gibi “her basışta bir eylem” işlerine uygundur.
Tuvale tıklayıp boşluğa basın. Basılı tutsanız da renk bir kez değişir. red() bir rengin kırmızı bileşenini okur.
keyReleased(): basılı tut, şarj et, bırak, ateşleMega Man’in şarjlı atışı gibi: basılı tutma keyIsDown, bırakma anı keyReleased. Mermiler de bir dizide duruyor.
| Tuş | Yöntem | Eylem |
|---|---|---|
| Ok / WASD | keyIsDown + draw() | Sürekli hareket |
| SPACE | keyPressed() | Tek mermi |
| R | keyPressed() | Turu sıfırla |
| ESC | keyPressed() | Menüye dön |
Ok tuşlarını da WASD’yi de birlikte desteklerseniz farklı alışkanlıklara sahip oyuncular aynı oyunu oynayabilir.
keyPressed()?keyPressed()Niyet açıkça görünür: “bu tuşa basılınca şu olsun.” p5.js, “önceki frame’de basılı değildi, şimdi basılı” karşılaştırmasını sizin yerinize yapar.keyIsDown + bayrakdraw() içinde bir “önceki durum” değişkeni tutarak aynı şey elle yapılabilir. Bazı ileri senaryolarda gerekir; ama fazladan değişken ve karşılaştırma ister.Basit ve orta düzey oyunlarda doğrudan keyPressed() tercih edilir.
keyIsDown(65) yazınca A tuşu algılanıyor. 65 nereden geliyor?Bilgisayar “A” harfini aslında nasıl saklıyor olabilir?
| Aralık | Karakterler | Anlamı |
|---|---|---|
| 48 … 57 | '0' … '9' | Rakamlar |
| 65 … 90 | 'A' … 'Z' | Büyük harfler |
| 97 … 122 | 'a' … 'z' | Küçük harfler |
| 32 | boşluk | Space |
Harf ve rakam tuşlarında key doğrudan karakteri verir: 'A', 'w'. Numarasını görmek için charCodeAt.
'5' ile sayı 5 aynı şey değil: karakterin numarası 53.key mi, keyCode mu?keyHangi karakter?Harf, rakam ve sembol tuşlarında okunabilir bir karakter verir: 'a', '5', ' '.keyCodeHangi fiziksel tuş?Basılan tuşun sayısal kodu. Ok tuşları, SHIFT, CTRL gibi karakteri olmayan tuşlar bununla tanınır.Harf için key === "w"; ok tuşu için keyCode === LEFT_ARROW. p5.js ok tuşlarının sayılarını ezberlemeyin diye sabitleri hazır verir.
keyCode’u 37. ASCII tablosunda 37 ise % işareti.Sol oka basınca ekrana % mi yazılıyor? Bu bir çelişki mi?
| Tuş | keyCode | p5.js sabiti | ASCII’de? |
|---|---|---|---|
| Sol ok | 37 | LEFT_ARROW | Yok |
| Yukarı ok | 38 | UP_ARROW | Yok |
| Sağ ok | 39 | RIGHT_ARROW | Yok |
| Aşağı ok | 40 | DOWN_ARROW | Yok |
Ok tuşları birer karakter değil, özel tuştur; ASCII’de karşılıkları yoktur. 37, tarayıcıların ayrı bir tuş-numara listesinden gelir.
%.LEFT_ARROW yazın. console.log(keyCode) yalnızca merak ve hata ayıklama içindir.LEFT ile LEFT_ARROW aynı şey değilkeyIsDown(LEFT) çalışmazLEFT, RIGHT, UP, DOWN hizalama sabitleridir: textAlign(LEFT). Değerleri metindir ('left'). keyIsDown ise sayı bekler.Harfler için de sayı gerekir: A 65, D 68, W 87, S 83.
| Tuş | Tipik kullanım |
|---|---|
| Oklar | keyIsDown(LEFT_ARROW) ya da keyCode === LEFT_ARROW |
| Harf, sürekli | keyIsDown(65) |
| Harf, olayda | key === "w" || key === "W" |
Gri tuvale tıklayın, sonra ↑ ve W’ye basın. Mesajlar tuvalde değil, altındaki konsolda görünür.
|| ile “sol ok ya da A basılıysa” deriz. İki alışkanlık, tek hareket.
\n ve \t| Yazımı | ASCII | Adı | Ne yapar? |
|---|---|---|---|
\n | 10 | LF (line feed) | Yeni satıra geçer |
\t | 9 | TAB (sekme) | Yatayda birkaç boşluk kadar ilerler |
| boşluk | 32 | Space | Görünür boşluk |
\ “sonraki karakter özel anlam taşıyor” demektir. \n iki karakterle yazılır ama bellekte tek bir satır sonu karakteridir.0–31 arasındaki denetim kodları ekrana harf gibi basılmaz; programda böyle yazılır.
\n pratiktir.\t’nin genişliği yazı tipine göre değişir. Tuvalde düzgün sütun için ayrı text(…, x, y) çağrıları daha öngörülebilirdir. Konsolda console.log("skor\t" + skor) iş görür.\n ve \t ise ekrana yazılan içeriktir.'A' ikisinde de 65.let skorŞuAn = 0; çoğu tarayıcıda çalışır. Yine de adlarda ASCII harfleri tercih ediyoruz (skorSuAn): karakter bozulması riski azalır, İngilizce kaynaklarla eşleşmek kolaylaşır, klavye düzeni farkı sorun çıkarmaz.text("Kazandınız!"). Kısıt ekran yazılarında değil, adlardadır.Hareket draw içinde ve sürekli; R ile sıfırlama keyPressed içinde ve tek seferlik. İki katman aynı sketch’te.
constrain(deger, min, max)Değeri alt ve üst sınır arasında tutar. Kare tuvalin dışına taşmaz.color(r, g, b)Bir renk değeri üretir; değişkende saklanır. red(), green(), blue() bileşenlerini okur.floor(n)Aşağı yuvarlar. Burada fare koordinatını tam sayı göstermek için.constrain, konumu sınırda kilitleyen bir engeldir. Duvara çarpınca yön değiştiren sekme tepkisini bir sonraki bölümde açık if ile yazacağız.
| Sorun | Olası neden | Denenecek |
|---|---|---|
| Tuşlar hiç çalışmıyor | Tuval odakta değil | Önizlemeye tıkla |
| Hareket çok yavaş ya da hızlı | HIZ ya da deltaTime | HIZ * dt formülünü kontrol et |
| R tuşu yanıt vermiyor | keyPressed tanımsız | Fonksiyon adının yazımına bak |
| Kare ekrandan çıkıyor | constrain eksik | Sınır satırını ekle |
| Çapraz hareket fazla hızlı | x ve y birlikte değişiyor | Basit oyunda sorun değil; istenirse normalize et |
| Bir tuş bazen çalışıyor | Klavye düzeni, büyük/küçük harf | keyCode ya da iki harfi birden kontrol et |
İlk soru hep aynı: bu davranış sürekli mi olmalı, tek seferlik mi?
1986’da Gradius’un NES sürümünde ortaya çıktı; Contra’da 30 can verdiği için efsaneleşti. Kodu bir dizide, keyPressed içinde tek tek kontrol ediliyor.
keyIsDown), hangileri tek seferlik (keyPressed) olacak? Tabloya yazın.LEFT_ARROW kullanımını not edin.keyIsDown(SHIFT).zipla() kaç kez çağrılır?60 FPS × 2 saniye. Zıplama tek seferlik bir eylemdir; yeri keyPressed().
keyIsDown(LEFT)key === "left"keyIsDown(LEFT_ARROW)keyIsDown("%")LEFT hizalama sabitidir. Ok tuşlarının karakteri yoktur; keyCode ve LEFT_ARROW ile tanınırlar.
text("A\nB\tC", 20, 40) tuvalde nasıl görünür?\n satır kırar, \t yatayda sekme boşluğu bırakır.
keyIsDown() basılı olduğu her frame doğrudur: sürekli hareket, draw içinde.keyPressed() basma anında, keyReleased() bırakma anında bir kez çalışır.key karakteri, keyCode tuşun sayısal kodunu verir.LEFT_ARROW gibi sabitler; LEFT hizalama içindir.\n satır kırar, \t sekme koyar.constrain değeri iki sınır arasında tutar.Sıradaki bölüm
Top duvardan sekecek, oyun menüden başlayacak.