Particle Engine - 1

Particle Engine 1

Nedir?

“Particle Engine” belki türkçeye parçacık motoru şeklinde geçirilebilir. Kısaca bu ve bundan sonraki yazılarda PE olarak bahsedeceğim. PE parçacık efektleri yaratmakta kullanılır. Duman, ateş, bulut, patlama, ve aklıma adı gelmeyen daha pek çok efekt PE ile yapılır. Başta belki “engine” kelimesi yüzünden zor bir işmiş gibi gözükse de, aksine bir PE yapmak oldukça kolay. Parçacık efektleri oyunların tuzu biberidir. Bir oyunda efekt olmaması doğal olarak düşünülemez. Biz de deneyelim o zaman.

Bu yazıda, basit bir PE tasarımını anlatacağım. Kullanacağım dil c++. Bu ilk yazıda, temel c++ bilgisi yeterli olacak, ama ilerledikçe (diğer yazılarda) tasarım, template sınıflar, STL gibi orta veya ileri seviye sayılabilecek kavramlara da hazırlıklı olmanızı tavsiye ederim. Grafik API olarak da OpenGL kullanıyorum, ama DirectX'ciler de okumayı sürdürsünler, çünkü şimdilik pek OpenGL ile işimiz olmayacak. Üç beş satırlık GL kodunu DX fonksiyonlarına çevirebilirsiniz kolayca.

Nasıl?

PE bir grup parçacığın, bizim belirlediğimiz kurallara göre hareket edip yine belli bir şekilde ekrana basılması ile gerçekleştirilir. Yani bir adet parçacık sınıfına ihtiyacımız var. Bu sınıfta, tek bir parçacığın sahip olabileceği verileri belirleyelim. Bu parçacık zamanla hareket edecek, yani bir pozisyonu ve hızı olabilir. Mesela bir ömrü olabilir, böylece belli bir süre geçtikten sonra, parçacık yok olabilir. Bir patlama efektinde, parçacıklar, patlamanın olduğu noktada doğarlar, rastgele bir noktaya göre rastgele sayılabilecek bir hızda hareket ederler, ve bir süre sonra da gözden kaybolurlar. Ayrıca her parçacığın, bir rengi olabilir. Bu bahsettiğimiz veriler, her bir parçacıkta farklı değerlere sahip farkettiyseniz. Bu değerler zamanla değişecek, ve bir de parçacık ekrana basılacak. Sınıfın tanımlanması şöyle olabilir;

#include "Vector3.h"

class XParticle
{
protected:
	bool m_bAlive;
	float m_Life;
	float m_Fade;
	Color m_Color;
	Vector3 m_Pos;
	Vector3 m_Velocity;
public:
	void Update(float elapsed_time);
	void Draw();
	XParticle(void);
	~XParticle(void);
};


Update() ile parçacığımızı geçen zamana göre güncelliyoruz, ve Draw() ile de çizim işini yapıyoruz.


Bir de, parçacıkların bir grup olarak yaratıldığı, tutulduğu ve daha önemlisi kontrol edildiği bir sınıfa ihtiyacımız var. Bu sınıf, parçacıklarımızın ortak özelliklerini tutacak, ve bu özelliklere göre hareketlerini kontrol edecek. Örneğin, parçacıklarımızın ortak bir dokusu (texture) olabilir. Bu sınıf, dokuyu tutacak, ve çizim esnasında sadece bir kez dokuyu karta yollayacak ve teker teker parçacıkların Draw() fonksiyonunu cağıracak. Tüm parçacıklar tek tek aynı dokuyu, boş yere karta yollamaya çalışmayacak, unutmayalım state (durum) değişiklikleri her zaman, hem DX hem GL için pahalı işlemler. Ya da ileride mesela, alev efekti yapacaksınız diyelim, alevin merkezine yakın bölgenin farklı bir doku ile, dışarıdaki bölgenin (parçacıkların) başka bir doku ile kaplanmasını isteyeceksiniz. İşte bu kontrol sınıfı tüm bunları (ve daha fazlasını) halletmek ile görevli olacak.


#include "XParticle.h"

class XParticles
{
	XParticle* m_pParticles;
	int m_nParticles;
public:
	void Create(int nParticles);
	void Render();
	void Update(float time);
	XParticles(void);
	~XParticles(void);
};

Create() ile istediğimiz sayıda parçacık yaratıp, Render() ile çizim işlerini kontrol edip, Update() ile de güncellemeyi hallediyoruz. Bu ilk yazıda, doku, renk, ya da göz alıcı herhangi birşey kullanmıyorum. Belki ilerideki yazılarda... XParticles sınıfının fonksiyonları pek birşey yapmıyor şimdilik, döküman ile gelen örnek kodlara bakabilirsiniz.

Sonra?

Gördüğünüz gibi bir PE yapmak oldukça kolay. Bu temel mantığı kullanarak pek çok etkileyici efekt yaratmanız mümkün. Ancak, her zamanki gibi performans bizim için çok önemli. Elimizde binli rakamlarda XParticle nesnesi olacak herhangi bir efekt için. Onları optimize bir şekilde hafızada tutabilmeli, ve performansdan ödün vermeden güncelleme ve çizim işlemlerini yapabilmeliyiz. Yeter mi? Yetmez! Ayrıca, sadece tek bir efekt değil aynı yapı içinde, minimum tekrar kod yazımı ile yeni efektleri kolayca eklemek istiyoruz ileride. Hatta mümkünse, biz programcılar başka işlerle uğraşirken, tasarımcılar, bizim hazırladığımız bir PE editöründe, sahip oldukları görsel yetenekleri kullanarak, yeni parçacık efektlerini yaratsınlar, biz bir satır program yazmak zorunda kalmadan.

Ancak bir başlangıç yazısında tüm bunlardan bahsetmek pek uygun değil. Şimdilik, örnek kodu inceleyin, ve bu kodda az önce bahsettiğim kriterlere göre nasıl geliştirmeler yapılabileceğini, nelerin baştan yanlış olduğunu bulmaya çalışın.

Örnek Kod

Bu döküman ve örnek VC++ 7.0 proje kütüklerine [ buradan ] ulaşabilirsiniz. Örnek programı SDL ve VC++7 kullanarak hazırladım. Ama herhangi bir c++ derleyicisinde de kolaylıkla derleyebilirsiniz. Sadece çalıştırmak için, sisteminizde henüz yoksa www.libsdl.org adresinden sdl.dll'i indirmeyi unutmayın.

Bu yazı ile ilgili, hatalar, görüşleriniz, eleştirileriniz için mentat@cfxweb.net adresini kullanabilirsiniz. Ve tabi www.oyunyapimi.org forumlarını. Umarım yazdıklarım işinize yarar.

mentat :: 27.09.2003 :: www.oyunyapimi.org





Bu yazının bulunduğu site: OyunYapimi.org
http://www.oyunyapimi.org

Bu yazı için adres:
http://www.oyunyapimi.org/modules.php?name=Sections&op=viewarticle&artid=43