Oyun geliştirmede sınıf tasarımına doğru nesne yönelimli yaklaşım nedir?


31

XNA kullanarak, Windows 7 Phone için 2D sprite tabanlı bir oyun geliştirmenin ortasındayım. Bunun için mevcut eğitim ve öğreticiler oldukça faydalıdır, ancak karşılaştığım sorun, her birinin sınıf tasarımlarına farklı şekilde yaklaşması ve kodun özellikle iyi düşünülmemesi. Sonuç olarak, belirli bir sınıfa hangi sorumlulukları vermem gerektiğini iyi bir şekilde anlamak benim için zor oldu.

Örneğin, BaseSpritenasıl çizileceğini, çarpışmaları kontrol etmeyi vb. Bilen bir temel sprite sınıfına sahip olabilirim. Daha sonra AnimatedSpritesprite sayfasına, ExplodingSpritesınıfına ve benzerlerine nasıl gidileceğini bilecek bir sınıfa sahip olabilirdim . Bu teknik, Windows 7 Phone Jumpstart Session 2 materyallerinde Space Invaders örneğinde gösterilmiştir .

Alternatif olarak, oyunun sorumluluğunu oluşturma ve çalıştırmanın büyük kısmını bir GameScreensınıfa koyabilirim ; bu sınıf ve türetilmiş sınıfları sorumlulukları bakımından daha çok form veya web sayfası gibi davranırlar. Sprite sınıfları çok daha az mantıklı daha basit kaplardır.

Bu, Windows 7 Telefon Eğitim Seti'nin Alien Sprite oyununda ve diğer oyun yöneticisi örneklerinde kullanılan tekniktir .

Oyun geliştirmede sınıf tasarımına doğru nesne yönelimli yaklaşım nedir?

Yanıtlar:


26

Görsel, Çarpışma, Animasyon, Girdi, vb. Gibi bileşenlere sahip olan bir Sprite sınıfına sahip olacağınız daha bileşen odaklı bir yaklaşım kullanıyorum. Bu yaklaşımla derin bir sınıf hiyerarşisine sahip olmayacağım (ki bu iyi) .

Bileşen Odaklı Tasarım hakkında biraz bilgi için buraya bakın .


2
Bağlandığınız makaleyi + 1'lemek harikaydı. Saf OO tasarımına çok odaklanmıştım, bileşen / dekoratör tipi modelini tamamen göz ardı ettim.
Josh E,

1
Bileşen modeli gerçekten "daha az saf" değil. OO :)
Srekel

2
Aslında. OO genellikle kalıtım ile eşittir. Ancak kalıtım, OO'nun sunduğu tek bir araçtır, kompozisyon başka bir şeydir.
haffax

Sadece bu yüzden. İfadelerimde daha kesin olmalıydım; Demek istediğim, istediğim şeyi elde etmeme yardımcı olabilecek OO tasarım kalıplarını / diğer OO yönlerini düşünmek yerine, OO'nun kalıtımsal yönüne çok odaklanmam.
Josh E,

Kompozisyon temelli bir yaklaşım oldukça açık ve sıkça kullanılsa da, oluşturma bileşenini taşınabilir tutmak için henüz bir çözüm görmedim. Herhangi bir ipucu harika olurdu.
Andreas


6

KATI İlkeleri başka mesleğe olarak oyun kodu tasarımına kadar geçerlidir - Bir başlangıç noktası olarak ilk örneği kullanacağız diye, en azından sen, optimize gelene kadar.

Yine de daha ileri gideceğim, çünkü BaseSprite bir megaclass olma eğilimindeymiş gibi geliyor. Tek Sorumluluk İlkesi, bir sınıf hiyerarşisindeki bireysel girdiler yerine çarpışma, oluşturma ve gezinme işlemlerinin hepsinin bileşenler tarafından ele alınması gerektiğini belirtir. Tüm bu bileşenlerin tutma sınıfı, yalnızca aralarındaki dünya konumlarını zorlamalıdır.


5

Son birkaç proje için MVC tarzı bir yaklaşıma daha fazla eğildim.

İlk başta bunun işe yarayacağından emin değildik, ama mükemmel çalıştı.

model

Veri nesneleri Sadece saf veri. Davranış yok, render yok.

Veri Yöneticisi. Sadece veri nesnelerinin "listelerini" kullanmak. (Ayrıca havuzlamayı desteklemek için geliştirilebilir.)

Görünüm

Onlara üretici diyoruz. Her veri nesnesi türü için bir işleyici var. Bir yönetici ile birlikte çağrıldığında, o listedeki tüm nesneleri oluşturacaktır.

kontrolör

Oluşturucularla aynı, ancak davranışı denetler.

Örnek

ShipManager bir Gemi listesine sahiptir. ShipController Gemileri durumlarına göre hareket ettirecek. ShipRenderer, Gemileri durumlarına göre teslim edecek.

Niye ya

Bu şekilde görüş ve mantık kesinlikle ayrı tutulur. Yeni bir platforma taşımayı oldukça kolaylaştırır. XxxManager içindeki veri düzenini optimize etmek de çok kolaydır.


2
Seni oy kullanıyorum çünkü az ya da çok çıplak "MVC Kullan" ı kabul edilebilir bir cevap olarak görmekten bıktım. Herhangi bir modern platformda geliştiriyorsanız, zaten MVC'yi çoklu seviyelerde kullanıyorsunuz. Belirli bir cevap değil ve iyi bir cevap değil, çünkü aslında insanlara göreve / alana özgü olan sınıfları nasıl yapılandıracağını anlatmıyor. "Modal ... sınıf ...; class View ...; class Controller ..." yazan birçok insanla son buluyorsunuz. MVC, mevcut kod hakkında konuşurken çok iyi seviyede açıklayıcı gücü olan bir kalıp. Çok fazla iyi planlama gücüne sahip bir model değildir.

4
@Joe Ben senin fikrin olsun, ama gereksiz kaba kelime seçimi bul. Sadece nasıl yaptığımızı açıkladım. Yüksek seviye mimari seçimi, düşük seviye tasarım seçimini eski kıldığı için, bunun geçerli bir cevap olduğunu düşünüyorum.
Andreas,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.