Bir cümlelik özet
Scratch'te kuklalar birbirine doğrudan dokunmadan haberleşebilir; bir kukla "mesaj yayınlar", diğerleri "mesajı aldığında" harekete geçer ve sahnenin dekoru değişerek oyunun bölümleri arasında geçiş yaparız.
Neden önemli?
Bir oyun düşün: yeşil bayrağa tıklıyorsun, bir "Başla" ekranı çıkıyor, oyunu bitirdiğinde "Kazandın" ekranı beliriyor. Bu geçişleri kim yönetir? Şimdiye kadar her kuklaya kendi işini ayrı ayrı yazdık. Fakat gerçek bir oyunda kuklaların aynı anda ve birlikte hareket etmesi gerekir.
İşte mesaj yayınlama tam burada devreye girer. Bir kuklanın "hazırım" demesini ve diğerlerinin bunu duyup harekete geçmesini sağlar. Buna programlamada olay tabanlı iletişim denir: bir olay olur, ona abone olan herkes tepki verir.
Sahne yönetimi de bununla el ele gider. Bir oyunun menüsü, oynanış ekranı ve bitiş ekranı aslında farklı dekorlardır (backdrop). Dekoru değiştirerek tek bir projede birçok "ekran" oluşturabilirsin.
Kısa tanım: Mesaj (broadcast), bir kuklanın gönderdiği ve dinleyen tüm kuklaların duyduğu görünmez bir sinyaldir.
Mesajla haberleşme: "yayınla" ve "aldığında"
Scratch'te mesaj blokları Olaylar (Events) kategorisinde bulunur. İki temel blok vardır.
"… yayınla" bloğu
Bu blok bir sinyal gönderir. Sinyalin bir adı vardır; örneğin başla, kazandın veya düşman-değdi. Blok çalıştığı anda bu ismi tüm projeye duyurur.
yeşil bayrağa tıklandığında
"başla" yayınla
Yeni bir mesaj adı oluşturmak için blok üzerindeki açılır menüden "Yeni mesaj" seçersin ve ona anlamlı bir isim verirsin.
"… aldığında" bloğu
Bu blok bir dinleyicidir. Belirttiğin mesaj yayınlandığında altındaki kodu çalıştırır. Aynı mesajı birden fazla kukla dinleyebilir; hepsi aynı anda uyanır.
Örnek: Bir kedi kuklası oyunu başlatıyor, bir yıldız kuklası da bunu duyup görünür oluyor.
Kedi kuklasında:
yeşil bayrağa tıklandığında
"başla" yayınla
Yıldız kuklasında:
"başla" aldığında
göster
x: 100 y: 50 konumuna git
Gördüğün gibi iki kukla birbirine hiç dokunmadı; sadece aynı mesaj üzerinden anlaştılar. Bir tanesi seslendi, diğeri duydu.
"yayınla ve bekle" farkı
Normal "yayınla" bloğu mesajı gönderir ve beklemeden devam eder. "… yayınla ve bekle" bloğu ise mesajı dinleyen tüm kodlar bitene kadar bekler. Sıralı bir anlatım (önce şu bitsin, sonra bu başlasın) istediğinde "ve bekle" işine yarar.
Sahne ve dekor yönetimi
Sahne (Stage), oyunun arka planıdır. Sahneye eklediğin her arka plan görüntüsüne dekor (backdrop) denir. Dekor blokları Görünüm (Looks) kategorisindedir.
Dekoru değiştirmek
dekoru [menü] yap: Belirli bir dekora geçer (örneğin "kazandın-ekrani").sonraki dekor: Sıradaki dekora geçer.
Sahnenin kendi kod alanı da vardır. Sahne bir mesaj aldığında dekorunu değiştirebilir:
"kazandın" aldığında
dekoru "kazandin-ekrani" yap
Dekor değişince tetiklenen olay
Görünüm kategorisinde çok kullanışlı bir Olay bloğu daha var: dekor [menü] olduğunda. Bir dekor sahneye geldiğinde otomatik çalışır. Böylece "oyun-ekrani" belirdiğinde düşmanların hareket etmesini, "kazandin-ekrani" belirdiğinde alkış sesinin çalmasını sağlayabilirsin.
Örnek: Bitiş ekranı gelince kutlama.
Sahnede:
dekor "kazandin-ekrani" olduğunda
"Alkis" sesini çal
Örnek: Üç ekranlı bir oyun kurmak
Şimdi öğrendiklerimizi tek bir akışta birleştirelim. Üç dekorumuz olsun: menu-ekrani, oyun-ekrani, kazandin-ekrani.
1. Menüden oyuna geçiş
Sahnede oyun menü dekorunda başlar. Ekranda bir "Başlat" düğmesi kuklası duruyor. Ona tıklanınca oyun başlasın.
Sahnede:
yeşil bayrağa tıklandığında
dekoru "menu-ekrani" yap
Başlat düğmesi kuklasında:
bu kukla tıklandığında
"başla" yayınla
Sahnede:
"başla" aldığında
dekoru "oyun-ekrani" yap
2. Oyun sırasında puan toplama
Oyun ekranında bir oyuncu kuklası yıldızları topluyor. puan adında bir değişkenimiz var (bir önceki dersten hatırlıyorsun). Puan 10 olunca oyunu kazanıyoruz.
Oyuncu kuklasında:
"başla" aldığında
sürekli tekrarla
eğer <"yildiz" kukla dokunuyor> ise
"puan" değişkenini 1 artır
eğer <puan = 10> ise
"kazandın" yayınla
dur [bu betik]
3. Kazanma ekranına geçiş
"kazandın" mesajı yayınlanınca sahne bitiş dekoruna geçer ve oyuncu kuklası gizlenir.
Sahnede:
"kazandın" aldığında
dekoru "kazandin-ekrani" yap
Oyuncu kuklasında:
"kazandın" aldığında
gizle
Bu üç parça birlikte tam bir oyun döngüsü oluşturur: menü → oynanış → kazanma. Hepsini birbirine bağlayan şey görünmez mesajlardır.
Mini uygulama
Kendi "iki ekranlı" mini oyununu kur. Amaç: yeşil bayrakla açılan bir başlangıç ekranından, bir düğmeye tıklayınca oyun ekranına geçmek.
- Sahneye iki dekor ekle:
girisveoyun. - Yeşil bayrakta sahne dekorunu
girisyapsın. - Bir kukla ekle ve üstüne "Başla" yaz.
- Bu kukla tıklandığında
oyunu-baslatmesajını yayınlasın. - Sahne bu mesajı aldığında dekoru
oyunyapsın. - Ekstra: Oyun ekranı gelince (
dekor "oyun" olduğunda) bir karakter "Hazır mısın?" desin.
Çalıştığında düğmeye tıkla ve ekranın değiştiğini gör. Sonra kendine sor: Mesajın adını değiştirsem hem yayınlayan hem de dinleyen bloğu güncellemem gerekir mi?
Uygulama laboratuvarı: Mesaj Yayınlama ve Sahne Yönetimi
Mesaj Yayınlama ve Sahne Yönetimi konusunu kalıcı hâle getirmenin en iyi yolu, kavramı küçük ve ölçülebilir bir göreve dönüştürmektir. Bu çalışmada Mesajla haberleşme: "yayınla" ve "aldığında" ile "… aldığında" bloğu arasındaki ilişkiyi kullanarak çalışan bir Scratch sahnesi, blok düzeni ve test listesi hazırlayacaksın. Amaç yalnız sonucun çalışması değil; hangi kararı neden verdiğini, neyi test ettiğini ve hangi durumda tasarımı değiştireceğini açıklayabilmektir.
Görev senaryosu
Şu senaryoyu ele al: bir karakterin puana göre farklı tepki verdiği kısa oyun. Dersin ana hedefi “Mesaj yayınlayarak kuklalar arası haberleş ve dekor/bölüm geçişlerini yönet” olduğuna göre önce problemi tek cümleyle tanımla. Ardından sistemin alacağı girdiyi, uygulayacağı işlemi ve üreteceği çıktıyı ayrı ayrı yaz. Bilmediğin bir ayrıntı varsa onu varsayım olarak işaretle; varsayımı gerçek bilgi gibi kullanma.
- Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
- En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
- Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
- Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
- Tek değişiklik yap: Aynı anda birçok şeyi değiştirmek yerine bir kararı düzeltip testi yeniden çalıştır.
Başarı ölçütleri
- Yeşil bayrakla başlangıç durumu doğru kuruluyor mu?
- Olaylar yalnız gerektiğinde mi çalışıyor?
- Değişkenler anlaşılır adlarla mı kullanıldı?
- Klon veya döngü sayısı kontrol altında mı?
- Oyun yeniden başlatıldığında önceki durum temizleniyor mu?
“Mesaj Yayınlama ve Sahne Yönetimi” çalışmasını bitirdiğinde ürünü bir arkadaşına yalnız bölüm başlıklarıyla anlat. Arkadaşın bir karakterin puana göre farklı tepki verdiği kısa oyun senaryosundaki adımları ve karar nedenlerini takip edebiliyorsa anlatım yeterince açıktır. Anlaşılmayan noktayı daha fazla terim ekleyerek değil, Mesajla haberleşme: "yayınla" ve "aldığında" ve "… aldığında" bloğu ilişkisini daha küçük adımlara bölerek düzelt.
Sık yapılan hatalar
Mesaj adlarının uyuşmaması
Yayınlanan mesaj ile dinlenen mesaj tam olarak aynı olmalıdır. başla ile Başla Scratch için farklı olabilir; açılır menüden seçmek yazım hatasını önler. Elle yazma, menüden seç.
Dinleyen kimse olmaması
Mesaj yayınladın ama hiçbir kuklada "… aldığında" bloğu yok. Scratch hata vermez, sadece hiçbir şey olmaz. Yayınlayan kadar dinleyeni de yazmayı unutma.
Dekor ile kuklaları karıştırmak
Dekor sahneye aittir, kostüm ise kuklaya. sonraki dekor sahnenin arka planını değiştirir; kuklanın görüntüsünü değiştirmek için sonraki kostüm kullanılır.
"yayınla" yerine "yayınla ve bekle" gereken durum
Bir işin bitmesini beklemeden devam edersen ekranlar üst üste binebilir. Sıra önemliyse "… yayınla ve bekle" kullan.
Güvenlik notu
Bu ders tamamen ekran başında yapılır; fiziksel bir risk yoktur. Yine de iki şeye dikkat et. Ekran süreni dengede tut: her 20–30 dakikada bir kısa ara verip gözlerini dinlendir. Projeni Scratch'te paylaşmadan önce bir yetişkinle konuş; yorumlarda kişisel bilgilerini (okul adı, adres, telefon) paylaşma. İnternette güvenlik, tıpkı koddaki güvenlik gibi, önceden düşünmekle başlar.
Ders özeti
- Mesaj (broadcast), kuklaların birbirine dokunmadan haberleşmesini sağlayan görünmez bir sinyaldir.
- "… yayınla" sinyali gönderir, "… aldığında" o sinyali dinleyip kod çalıştırır.
- Aynı mesajı birden çok kukla dinleyebilir ve hepsi aynı anda tepki verir.
- Dekor (backdrop) sahnenin arka planıdır;
dekoru … yapvesonraki dekorile ekranlar arasında geçilir. - Mesajları ve dekorları birleştirerek menü, oynanış ve bitiş gibi bölümler kurulur.
Kontrol soruları
- "… yayınla" ve "… aldığında" blokları hangi kategoridedir ve her biri ne işe yarar?
- Bir mesajı en fazla kaç kukla dinleyebilir?
- "yayınla" ile "yayınla ve bekle" arasındaki fark nedir?
- Sahnenin arka planına ne ad verilir ve hangi blokla değiştirilir?
- Bir mesaj yayınladın ama hiçbir şey olmuyor. İlk kontrol edeceğin iki şey nedir?
Cevaplar
- Her ikisi de Olaylar (Events) kategorisindedir. "… yayınla" bir sinyal gönderir; "… aldığında" o sinyal geldiğinde altındaki kodu çalıştırır.
- Sınır yoktur; istediğin kadar kukla aynı mesajı dinleyebilir ve hepsi aynı anda çalışır.
- "yayınla" mesajı gönderip beklemeden devam eder; "yayınla ve bekle" mesajı dinleyen tüm kodlar bitene kadar bekler.
- Buna dekor (backdrop) denir;
dekoru … yapveyasonraki dekorblokuyla değiştirilir. - Önce yayınlanan mesaj adı ile dinlenen mesaj adının birebir aynı olup olmadığını, sonra o mesajı dinleyen bir "… aldığında" bloğu bulunup bulunmadığını kontrol et.
Kaynak ve doğrulama notu
“Mesaj Yayınlama ve Sahne Yönetimi” dersi için doğrulama odağı Mesajla haberleşme: "yayınla" ve "aldığında" ile "… aldığında" bloğu arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Blok adları Scratch’in güncel temel kategorileriyle uyumlu tutulmuştur. Proje davranışı; başlangıç, normal oyun, hata ve yeniden başlatma durumlarında ayrı ayrı denenmelidir.
Sonraki ders
Klonlar: Tek bir kukladan onlarca kopya üreterek yağmur damlası, mermi veya düşman sürüsü gibi çok sayıda nesneyi tek bir kodla yönetmek.