Bölüm 2 · Sunum 3
Uzayıp giden bir draw’ı, her biri tek iş yapan adlandırılmış parçalara böleceğiz.
draw fonksiyonunuz 60 satır oldu. Tahtanın rengini değiştirmek istiyorsunuz.İlgili satırı bulmak ne kadar sürer? Tahta, skor ve hedef kodu birbirine karışmışsa?
draw artık ne yaptığını bir liste gibi söylüyor.draw’a değil, tahtaCiz’e bakarsınız.Fonksiyon olsaydı düzeltilecek tek bir yer olurdu. Programcılar buna “kendini tekrar etme” ilkesi der.
rect(), fill(), dist(), random(). Onları biz çağırıyoruz.setup(), draw(), mousePressed(). Biz yazıyoruz, p5.js belirli anlarda kendisi çağırıyor.setup ve draw’ın akrabaları| Araç | Başta bir kez | Her frame |
|---|---|---|
| p5.js | setup() | draw() |
| Unity | Start() | Update() |
| Godot | _ready() | _process() |
| PICO-8 | _init() | _update() ve _draw() |
f(x) gibi: bir kara kutu
Girdi verirsiniz, içerideki kural çalışır, bir sonuç çıkar. dist(x1, y1, x2, y2) tam böyledir: formülü ezberlemeseniz de sonucu kullanırsınız.
| Kavram | Biçim | Anlamı |
|---|---|---|
| Tanım | function hedefCiz() { … } | Fonksiyonun adı ve gövdesi. Tek başına hiçbir şey çalıştırmaz. |
| Çağrı | hedefCiz(); | Tanımlanan bloğu şimdi çalıştırır. Parantezler şart. |
| p5.js yerleşik | setup(), draw() | p5.js belirli anlarda otomatik çağırır. |
| Adım | Çalışan | Not |
|---|---|---|
| 1 | draw() | p5.js tetikler |
| 2 | arkaPlanCiz() | draw içinden çağrılır |
| 3 | ortaCizgiCiz() | draw içinden çağrılır |
| 4 | (frame biter) | Sonraki frame’de 1’e dönülür |
tahtaCiz bir döngüde hucreCiz’i çağırır; her hucreCiz bitince kontrol tahtaCiz’e döner.function ad() { … } tanımları, dosyanın neresinde olursa olsun çalışmadan önce tanınır. Çağrı tanımdan önce yazılsa da çalışır.draw yerine cizimYap yazarsak ne olur?setup, draw ve mousePressed adlarını p5.js tanır ve belirli anlarda bu adlardaki fonksiyonları arar. cizimYap diye birini aramaz; onu çağıran olmaz.hedefCiz, skorGuncelle.hedefCiz tuvale çizer; bu bir yan etkidir ama görevi tek ve anlaşılır. Dosya, ağ, konsol gibi işler çoğunlukla başka katmanlara bırakılır.return ile sonuç vermektir; yine de olay fonksiyonlarında sık görülür.tahtaCiz’i yazarken diğeri skorYaz üzerinde çalışabilir.dist gibi.draw’ı bölündraw() seçin (örneğin Daire Tıklama).arkaplanCiz, skorYaz gibi.kirmiziDikdortgenCiz() ve maviDikdortgenCiz()… Peki ya on farklı renk ve konum olursa?
Tek fonksiyon, farklı değerlerle iki kez çağrılıyor. Üçüncü bir dikdörtgen eklemek tek satır.
function dikdortgenCiz(x, y, w, h)dikdortgenCiz(50, 50, 80, 60)50 x’e, ikinci 50 y’ye. Argüman eksikse karşılığı olmayan parametreler undefined olur; fazlaysa fazlası yok sayılır.Çimene tıklayın. Her tıklama aynı fonksiyonu farklı argümanlarla çağırır: x, y ve boy. Üstteki satır son çağrıyı gösterir.
dist() bize bir sayı veriyor. Kendi fonksiyonumuz da bir şey geri verebilir mi?sonuc kutusuna 8 girmesini istiyoruz.
return: sonucu çağırana geri gönderreturn ile geri gönderdiği sonuç. Çağrı ifadesinin yerine geçer.| Biçim | Anlamı | Örnek |
|---|---|---|
return; | Değer yok; fonksiyon hemen biter. | mousePressed içinde erken çıkış |
return değer; | Hesaplanan değeri çağırana verir. | return a + b; |
acikKareMiacikKareMi(3) → false, acikKareMi(6) → true. Dönen değer doğrudan if koşulunda kullanılıyor.
return: içinde mi?icindeMi(mouseX, mouseY, hedefX, hedefY, 40) ifadesi true ya da false üretir.
dist(...) < hedefYaricap satırının fonksiyona taşınmış hâli. Okuması kolay: if (icindeMi(…)).Bir fonksiyon başka bir fonksiyonu çağırabilir: icindeMi, mesafeHesapla’yı kullanıyor.
ustundeMi bir kez yazıldı, altı yerde kullanıldı: üç düğmenin rengi ve üç tıklama kontrolü. Kodun devamı (draw ve mousePressed) “Kopyala” ile alınır.
icindeMi fonksiyonuna taşıyın; eski yerlerde bu fonksiyonu çağırın.draw yalnızca iki satır: tahtayı çiz, merkez işaretini çiz.
tahtaCiz tahtayı gezer; her hücrenin konumunu hesaplayıp işi hucreCiz’e bırakır.
tahtaCiz farklı argümanlarla yeniden çağrılabilir; yalnızca boyut ve konum değişir. Bu yapı, ileride yazacağımız XOX oyununun zeminidir.
| satir | sutun | hucreCiz çağrısı | Hücre rengi |
|---|---|---|---|
| 0 | 0 | hucreCiz(0, 0, 50, 0, 0) | açık (toplam çift) |
| 0 | 1 | hucreCiz(50, 0, 50, 0, 1) | koyu |
| 1 | 0 | hucreCiz(0, 50, 50, 1, 0) | koyu |
| 1 | 1 | hucreCiz(50, 50, 50, 1, 1) | açık |
Her (satır, sütun) ikilisi için hucreCiz bir kez çağrılır. Toplam çağrı: satirSayisi * sutunSayisi.
| Görev | Örnek ad | Ne zaman çağrılır? |
|---|---|---|
| Çizim | tahtaCiz, hedefCiz | draw() içinde, her frame |
| Girdi | mousePressed (p5.js olayı) | Fare tıklanınca |
| Mantık | skorArtir, oyunBittiMi | Olay ya da draw() içinde |
| Yardımcı hesap | rastgeleKonum, icindeMi | İhtiyaç duyulduğunda |
draw işleri dağıtır: ağır çekimdraw() görevleri sırayla yardımcı fonksiyonlara devreder; tahtaCiz de her hücre için hucreCiz’i çağırır. Gerçekte bunların hepsi saniyenin altmışta birinde olup biter.
Aynı iki satır hem setup’ta hem mousePressed’te vardı. Artık tek bir yerde: yeniHedefKonumu().
Çalışan kodu davranışını bozmadan düzenlemeye refaktör denir.
tasCiz bir hücrenin ortasına “X” ya da “O” yazar.xoxTahtasiniCiz tahtayı gezer; boş hücrelerde tasCiz’i çağırmaz.tahta) ile görüntü (tasCiz) birbirinden ayrı.tahta[satir][sutun] yazımını diziler konusunda öğreneceğiz.draw3 × 3 tahta çizen kod tek bir draw() içinde 40 satıra ulaşmış. Tahtanın rengi değiştirilmek isteniyor ama ilgili satırlar bulunamıyor.
return; ile erken çıkış ve return değer; arasındaki fark ne?draw() içinde kaç yardımcı fonksiyon çağrısı makul sayılır?gunesCiz, insanCiz, agacCiz, evCiz, kusCiz isteyin. Hepsi (merkezX, merkezY) alsın, yalnızca temel şekillerle çizsin, sabit piksel adresi kullanmasın.let secili = "gunes" olsun. keyPressed tuşa göre değiştirsin: G güneş, I insan, A ağaç, E ev, K kuş.keyPressed’in içini bilmeniz gerekmiyor. Sözleşme belli: doğru tuşa basınca secili doğru metin olur. Bu bir kara kutu.secili’yi değiştirmek ideal mi? Yapay zekâ hangi şekli bozuk çizdi, neden?yildizCiz(x, y) yazın (basit bir artı işareti de olur). Tuvale 5 farklı yerde çağırın.kareAlan(kenar) yazın; alanı döndürsün. Sonucu ekrana yazdırın.buyukOlan(a, b) yazın; iki sayıdan büyük olanı döndürsün.tuvalIcindeMi(x, y) yazın; boolean döndürsün. Fare tuvalin içindeyken arka plan yeşil, dışındayken gri olsun.cicekCiz(x, y, yaprakSayisi). Yaprakları bir döngü, cos ve sin ile dizin.Hesap yapılıyor ama sonuç geri gönderilmiyor: return yok. return olmayan fonksiyon undefined verir.
h parametresi undefined kalırDört parametre var, üç argüman verildi. JavaScript hata vermez; eksik parametre undefined olur. Hata sessizdir.
can 0 olduğu için return çalışır ve fonksiyon orada biter. Yalnızca “A” yazılır.
setup, draw, mousePressed adları sabittir; p5.js onları kendisi çağırır.return; erken çıkar; return değer; sonucu çağırana verir.Sıradaki ders
x hangi x?Global ve yerel değişkenler, kapsam ve gölgeleme.