Sahneyi Tasarlama (Dekor)
Kodun en başındaki kısım, oyunun oynanacağı dünyayı oluşturur. Bilgisayara şu emirleri veririz:
"Bize 600 piksel genişliğinde gökyüzü mavisi bir pencere aç."
"İçine sarı bir yuvarlak koy, bu bizim kuşumuz olsun."
"İki tane yeşil dikdörtgen koy, bunlar da borularımız olsun."
"Sol üste skor ve süre yazısı ekle."
Burada önemli olan şey; kuş, borular ve yazılar bilgisayarın hafızasında birer nesne (şekil) olarak kaydedilir. Yani hepsinin bir adı vardır (ustBoru, kus vb.).
Kurallar ve Kumanda (Olaylar)
Oyunun başında bilgisayara bazı özel görevler tanımlarız:
Klavye Takibi (
KeyDown): Bilgisayara deriz ki: "Oyuncu klavyede bir tuşa basarsa hemenTusBasildibölümüne git ve bak." Eğer basılan tuş Boşluk (Space) ise kuşun yukarı doğru hızlanmasını sağlarız.Zaman Takibi (
Timer): Bir kronometre çalıştırırız. Her 1 saniyede birSureAzaltbölümüne gidilir ve 100 saniyeden geriye doğru 1 sayı düşülür.Buton Takibi (
ButtonClicked): "Eğer oyuncu fareyle ekrandaki butona tıklarsaButonTiklandibölümüne git ve oyunu yeniden başlat."
İşte oyunun asıl oynandığı yer burasıdır. (Esnasında/Sürece) komutu, içindeki kodları oyun kapanana kadar saniyede yaklaşık 50 kez başa sarıp tekrar çalıştırır. Her döngüde şu 3 şey yaşanır:
While
Yerçekimi ve Hareket: Kuş sürekli aşağı doğru düşmek ister. Biz her döngüde onun dikey konumunu (
kusY) birazcık aşağı kaydırırız. Boruları da sürekli sola doğru (boruX = boruX - 3) kaydırırız.Sonsuz Boru Numarası: Boru ekranın solundan tamamen çıkıp kayboldu mu? Bilgisayar hemen o boruyu alıp gizlice tekrar ekranın en sağından içeri sokar ve boyunu rastgele değiştirir. Böylece biz binlerce boru varmış gibi hissederiz ama aslında sadece 2 tane boru vardır! Ayrıca her yeni boruda skora 1 puan ekleriz.
Çarpışma Kontrolü (Hayati Kısım): Bilgisayar her döngüde matematiksel bir hesaplama yapar: "Kuşun bulunduğu yer ile boruların bulunduğu yer üst üste bindi mi?" veya "Kuş yere çakıldı mı?" Eğer cevap Evet ise oyun biter.
Kodun en altında Sub ile başlayan yerler, sadece ihtiyaç duyulduğunda çağrılan özel görev odalarıdır.
OyunBaslatOdası: Kuşu tekrar ortaya koyar, boruları sağa çeker, süreyi 100, skoru 0 yapar. Yani her şeyi fabrika ayarlarına döndürür.
OyunBitir Odası: Kuş çarpınca veya süre bitince burası çalışır. Döngüyü durdurur, ekrana kırmızı harflerle "OYUN BİTTİ" yazar ve gizli olan Yeniden Oyna butonunu görünür yapar.
Kodların Tamamı:
' --- EKRAN AYARLARI ---
GraphicsWindow.Hide()
GraphicsWindow.Title = "Flappy Bird - 100 Saniye Sınırı"
GraphicsWindow.Width = 600
GraphicsWindow.Height = 400
GraphicsWindow.CanResize = "False"
GraphicsWindow.BackgroundColor = "SkyBlue"
' --- GÖRSEL ÖGELERİN OLUŞTURULMASI ---
GraphicsWindow.BrushColor = "Yellow"
kus = Shapes.AddEllipse(20, 20)
GraphicsWindow.BrushColor = "Green"
ustBoru = Shapes.AddRectangle(50, 400)
altBoru = Shapes.AddRectangle(50, 400)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.FontSize = 16
skorYazısı = Shapes.AddText("Skor: 0")
Shapes.Move(skorYazısı, 10, 10)
sureYazısı = Shapes.AddText("Süre: 100")
Shapes.Move(sureYazısı, 10, 35)
' Oyun bitti yazıları için sabit şekiller (Görünmez başlar)
GraphicsWindow.BrushColor = "Red"
GraphicsWindow.FontSize = 30
bitisYazisi = Shapes.AddText("")
Shapes.Move(bitisYazisi, 210, 140)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.FontSize = 18
toplamSkorYazisi = Shapes.AddText("")
Shapes.Move(toplamSkorYazisi, 230, 190)
' Yeniden Oyna Butonu
yenidenButon = Controls.AddButton("Yeniden Oyna", 240, 250)
Controls.HideControl(yenidenButon)
' Olay Tanımlamaları
GraphicsWindow.KeyDown = TusBasildi
Timer.Interval = 1000
Timer.Tick = SureAzalt
Controls.ButtonClicked = ButonTiklandi
' Her şey hazır olunca ekranı göster ve oyunu başlat
GraphicsWindow.Show()
OyunBaslat()
' --- ANA DÖNGÜ ---
While "True"
If oyunBitti = "False" Then
' 1. Kuşun Fizik Hareketleri
kusHiz = kusHiz + yercekimi
kusY = kusY + kusHiz
Shapes.Move(kus, 100, kusY)
' Tavan veya taban kontrolü
If kusY < 0 Or kusY > 380 Then
OyunBitir()
EndIf
' 2. Boruların Hareketi
boruX = boruX - 3
If boruX < -50 Then
boruX = 600
boruY = Math.GetRandomNumber(180) + 40
skor = skor + 1
Shapes.SetText(skorYazısı, "Skor: " + skor)
EndIf
' Boruları Konumlandır
Shapes.Move(ustBoru, boruX, boruY - 400)
Shapes.Move(altBoru, boruX, boruY + boruBoşluk)
' 3. Çarpışma Testi
If (boruX < 120) And (boruX + 50 > 100) Then
If (kusY < boruY) Or (kusY + 20 > boruY + boruBoşluk) Then
OyunBitir()
EndIf
EndIf
EndIf
Program.Delay(20)
EndWhile
' --- ALT PROGRAMLAR ---
Sub OyunBaslat
' Değişkenleri sıfırla
kusY = 150
kusHiz = 0
yercekimi = 0.4
zıplamaGucu = -6.5
boruBoşluk = 120
boruX = 600
boruY = 100
skor = 0
kalanSure = 100
' Yazıları sıfırla ve eski bitiş yazılarını gizle
Shapes.SetText(skorYazısı, "Skor: 0")
Shapes.SetText(sureYazısı, "Süre: 100")
Shapes.SetText(bitisYazisi, "")
Shapes.SetText(toplamSkorYazisi, "")
Controls.HideControl(yenidenButon)
oyunBitti = "False" ' En son bu aktif olmalı
Timer.Resume()
EndSub
Sub OyunBitir
oyunBitti = "True"
Timer.Pause()
' Ekrana bitiş yazılarını set et
If kalanSure <= 0 Then
Shapes.SetText(bitisYazisi, "SÜRE BİTTİ!")
Else
Shapes.SetText(bitisYazisi, "OYUN BİTTİ!")
EndIf
Shapes.SetText(toplamSkorYazisi, "Toplam Skor: " + skor)
Controls.ShowControl(yenidenButon)
EndSub
Sub TusBasildi
If GraphicsWindow.LastKey = "Space" And oyunBitti = "False" Then
kusHiz = zıplamaGucu
EndIf
EndSub
Sub SureAzalt
If oyunBitti = "False" Then
kalanSure = kalanSure - 1
Shapes.SetText(sureYazısı, "Süre: " + kalanSure)
If kalanSure <= 0 Then
OyunBitir()
EndIf
EndIf
EndSub
Sub ButonTiklandi
If Controls.LastClickedButton = yenidenButon Then
OyunBaslat()
EndIf
EndSub
.png)







