Particle Engine - 1
(730 kelime) (781 okuma) ![Yazdırılabilir Sayfa](images/print.gif)
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
|