Oyun Programlama Kalıpları — State

ÜNOG
ÜNOG
Oct 22 · 4 min read

ÜNOG’a Katıl Bültenimize Abone OlGeçmiş Yayınlarımızı Oku

Image for post
Image for post

Bu sefer Ludum Dare’de kesinlikle birinci olacaksınız, kafaya koydunuz. Bunun için de tabi ki bir puzzle platformer yapmanız gerekiyor. Şimdi ise kahramanınızın kontrollerini yazıyorsunuz. İlk adım, tabi ki zıplamak! B’ye basıldı mı karakter zıplamalı. Basit bir şekilde yapabiliriz:

Image for post
Image for post
Zıplamanın yanısıra, karakterin uçmasını sağlayan bir kod parçası.

Ama bir bug var, fark ettiniz mi?

Karakterimizin havada uçmasını engelleyecek hiç bir şey yok — oyuncu her B tuşuna bastığında, yerde veya havada, karakter yükseklere doğru zıplamaya devam eder. Neyse ki bunu çözmenin basit bir yolu var, tek bir boolean bayrağına bakar.

Image for post
Image for post
Artık sadece eğer zaten zıplamıyorsak zıplayabiliyoruz.

Şimdi ise oyuncumuz ne zaman DOWN tuşuna basarsa o zaman karakterimizin eğilmesini istiyoruz, DOWN tuşunu bıraktığımızda da doğrulsun. Hızlıca bunu da ekleyelim:

Image for post
Image for post
Artık karakterimiz, eğilip doğrulabiliyor. Ama sıkıntı tam olarak zıplarken de doğrulabiliyor…

Ne yazık ki hala bir bug var…

Oyuncu bu kodumuz ile:

  1. DOWN tuşuna basılı tutup eğilir.
  2. B tuşuna basıp eğilmişken zıplayabilir.
  3. DOWN tuşunu burakıp havadayken doğrulabilir.

Bu da, zıplamanın ortasında doğrulma animasyonunu oynayacağımız anlamına gelir! Bir boolean daha ekleyelim…

Image for post
Image for post
Doğru zamanlarda eğildiğimizi garantilemek için isDucking boolean bayrağını eklememiz gerekti.

Şimdi ise diyelim bir DiveAttack, yani uçan tekme özelliği eklemek istiyoruz. Eğer oyuncu karakterimiz havadayken DOWN tuşuna basar ise karakter uçan tekme atmalı.

Image for post
Image for post
Artık zıplarken DOWN tuşuna basarsak karakterimiz uçan tekme atıyor. Ama hala bir problem var.

Artık tekme atabiliyoruz, ama bu son yazdığımız eklenti ile zıplama kodumuzu bozduk… Çünkü uçan tekme aşamasındayken oyuncu B tuşuna basar ise karakterimiz havada zıplayabilliyor. Bunun çözüm yolu da başka bir boolean bayrağı eklemek… Ama böyle giderse işin sonunda onlarca bayrağımız olacak ve daha karakterimiz yürümeye bile başlamadı! Bu gidişatın bizi zorlayacağı ortada. Aslında başarmak istediğimiz şey gerçekten basit:

Image for post
Image for post
Oyuna eklemek istediğimiz sistem basitçe bu.

Bu görseli çizerek aslıda çözüme çok yaklaştınız! Bu çözüme ise State Programlama Kalıbı deniyor veya diğer bir isim ile Finite State Machines.

Kısaca açıklamak gerekir ise:

  • Oyunda belli sayıda state’ler, yani durumlar var. Mesela bu örneğimizdeki stateler Ayakta, Zıplıyor, Uçan Tekme, ve Eğilmiş.
  • Sisteminiz her an sadece bir state içerisinde olabilir. Bu örnekte karakterimiz aynı anda hem Ayakta durup hem de uçan tekme atamaz. Bu problemi kolayca çözebilmek State Machine kullanmamızın başlıca nedenlerinden biri.
  • Sisteme seri şeklinde eventler veya inputlar yollanmalıdır. Örneğimizde inputlar tabi ki oyuncumuz bastığı tuşlar.
  • Her state, aynı zamanda belli bir geçiş ağına sahip. Doğru input geldiğinde, o input’a bağlı transition, yani geçiş aktive olur ve diğer bir state’e geçilir. Mesela karakterimiz Zıplıyor state’indeyken DOWN inputu gelir ise karakterimiz Uçan Tekme state’ine geçmeli.

State Kalıbı teoride bunlardan ibaret. En temeline elimizde state’ler, input’lar ve transition’lar var, ve bunların bir flowchart gibi çizmesi kolay. Peki bunu kod şeklinde nasıl yazmalıyız?

Şu anda karşılaştığımız problemlerden bir tanesi kimi boolean kombinasyonlarımızın hatalı olması. Mesela isJumping ve isDucking asla aynı anda doğru olmamalı. Bu durumda kullanmamız gereken sistem boolean değil ama enum.

Image for post
Image for post
Her bir state için bir enum belirledik.

Farklı farklı boolean bayrakları yerine karakterimiz artık sadece bir state değişkenine sahip olacak. Ve bunun yanı sıra, if sıramızda önce inputu kontrol etmek yerine artık state’i kontrol edicez. Bunun avatajı da aynı state altındaki kodun birbirinden ayrılmaması.

Image for post
Image for post
Çok daha temiz ve emin olun daha az bug’a yol açacak.

Artık kodumuzda farklı farklı boolean bayraklarını değerlendirmemize gerek yok, olayı tek bir state değişkeni ile çözebiliyoruz! Bu da kodumuzdaki bug sayısını gerçekten azaltıyor.

Bu sistem bir çok GameJam oyunu için yeterli olur. Ama eğer oyununuzun bu örnekte olduğundan çok daha komplike ise o zaman her state’in kendi sınıfı olması işinizi görecektir. Bu özel güç doldurmak gibi daha komplike özellikler eklemenize yardımcı olackatır. Sınıf bazlı state kodlamasını öğrenmeniz için size aşağıdaki videoyu öneriyoruz:

Bu yazımız ile umarım kodunuzu biraz sadeleştirebilmişizdir ama bu postumuz State Machine konusunun sadece bir başlangıcı! Eğer Hierarchical State Machines veya Pushdown Automata ile ilgili bilgi sahibi olmak istiyorsanız sizi temel kaynağımız olan Game Programming Patterns kitabı ile başbaşa bırakıyoruz:

Haftaya görüşmek üzere!

ÜNOG’a Katıl Bültenimize Abone OlGeçmiş Yayınlarımızı Oku

Image for post
Image for post

ÜNOG

Türkiyenin en güzel oyun geliştirme grubu. https://unog.dev

ÜNOG

Written by

ÜNOG

Türkiye’nin en güzel oyun geliştirme topluluğu. https://unog.dev

ÜNOG

ÜNOG

Profesyonel, bağımsız ve hatta öğrenci oyun geliştiricilerinin bir araya geldiği ÜNOG Oyun Geliştirici Topluluğu, bilgi ve tecrübe paylaşımına özendiriyoruz.

ÜNOG

Written by

ÜNOG

Türkiye’nin en güzel oyun geliştirme topluluğu. https://unog.dev

ÜNOG

ÜNOG

Profesyonel, bağımsız ve hatta öğrenci oyun geliştiricilerinin bir araya geldiği ÜNOG Oyun Geliştirici Topluluğu, bilgi ve tecrübe paylaşımına özendiriyoruz.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store