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 hemen TusBasildi bö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 bir SureAzalt bö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ıklarsa ButonTiklandi bölümüne git ve oyunu yeniden başlat."

İşte oyunun asıl oynandığı yer burasıdır.

While
(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:

  1. 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.

  2. 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.

  3. Ç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.

  • OyunBaslat Odası: 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