[ vladaboy93 @ 04.10.2007. 20:44 ] @
Posto ne planiram da radim 3D (ne uskoro) zanima me isplativost ucenja celog DirectX-a ako bi samo radio 2D dali bi bilo bolje da recimo radim na SDL-u? i dali uopste moze da se radi 2D igra na DirectX-u ( znam da moze ali dali je preporucljivo ).
[ bkaradzic @ 04.10.2007. 21:29 ] @
Da. Koristi SDL dok ne završiš igru. Kasnije možeš da je prebaciš na DX ako je stvarno neophodno.
[ vladaboy93 @ 05.10.2007. 19:53 ] @
Kako mislis "prebacim"... pa zazr to nisu 2 totalno razlicite stvari... SDL je baziran na OpenGL-u a prebacivanje sa OpenGL-a na DX ne znam dali je izvodljivo. osim ako si mislio da ponovo pisem ceo kod :)
[ tosa @ 06.10.2007. 05:24 ] @
Prvo napišeš interfejs između tvoje igre i tvoje biblioteke za crtanje (SDL ili DX).
Šta će se kasnije naći u tvojoj biblioteci za crtanje nije bitno za igru.

[ glorius @ 03.11.2007. 00:37 ] @
Hmm... ja sam probao neshto ovako...

Imam klasu Engine... Na pocetku sam radio sa obicnim GUI-jem pa sam posle zeleo da odradim u DirectX-u...

Kako najbolje da se implementira ta modularnost?

Code:


CActor
{
     virtual void Draw(CEngine * pEngine);

     // Sta raditi sa ovim?????
     CPoint pos; // za mfc
     D3DXVECTOR pos; // za DirectX  

// mozda moze pomocu define-a

#ifdef 2D
     CPoint pos;
#else 
     D3DXVECTOR pos;
#endif

}

....

CEngine
{
  // bla bla
}

CGUIEngine : public CEngine
{
  // bli bli
}

CDirectXEngine : public CEngine
{
 // blu blu
}



Velika je razlika izmedju GUI-a i DirectX-a... Sta bi onda trebalo da stoji u CActor::Draw() ??

Glavno pitanje... Kako dizajnirati ovo da se postigne potpuna ( ako je to moguce ) modularnost?

Some ideas??
[ bkaradzic @ 03.11.2007. 05:59 ] @
Najbolje je da kreiraš sopstvenu vector ili point klasu (zavisi koliko želiš da budeš matematički korektan ;) i da te CGUIEngine i CDirectXEngine znaju da to prebace u njihovu reprezintaciju. Takođe preporučujem ti da Draw metod iz CActor klase prebaciš u CEngine klasu da bi imao što manje koda specifičnog za neku platformu u CActor klasi. Ako ostaviš Draw u CActor klasi trebaćeš da kreiraš apstrakciju engine-a na veoma niskom nivou koja obično nije efikasna (tipa drawprimitive, settexture, setshader, itd.), ili da imaš dosta koda specifičnog za svaku platformu za koju praviš igru u samoj CActor klasi.
[ reject @ 03.11.2007. 12:44 ] @
Ajde ovako (mada su ti sve ovo isto rekli i tosa i bkaradzic):

Klasa Actor (agent, character, sta god) ima podatke o sebi koji su vezani za gameplay (energija, iskustvo, sta god...),
kao i minimalan, a dovoljan broj informacija o crtanju sebe (ime/id texture gde su mu frejmovi, trenutna pozicija na nivou,
trenutno stanje (trci, skace, puca, umro je...) i slicno), kao i podataka vezanih za "fiziku" (sirina, visina, masa...).

Klasa TextureManager (ili slicno) se bavi ucitavanjem i drzanjem textura u memoriji, kao i njihovih id-ova/imena, a od nje
render uzima i crta iste. Potrebne texture bi trebalo da budu popisane u fajlu koji predstavlja nivo igre, a treba ti i neki
fajl gde su popisane osnovne, uvek potrebne texture.

Klasa Camera uzima poziciju od lika (stvari, cega kod) kog trenutno pratimo i od nivoa uzima samo vidljive delove ekrana
(ili samo gleda gde su gornji levi i donji desni tajl pozadine) i vidljive likove u trenutnom frejmu.

Klasa Render uzima podatke od kamere (koje tajlove treba da iscrta), od likova koji se vide sve podatke
potrebne za render (koji frejm je aktivan, gde su na ekranu, koji efekat je aktivan i u kom je frejmu...), a od texturemanagera
texture koje treba da iscrta i onda samo redom nacrta sve sta treba.

Samo apdejtuj sve ovo (osim texture managera koji na startu igre/nivoa ucita sta mu treba i samo daje pointere na
texture kad mu render trazi) u svakom (ili kako ti vec za koga odgovara) frejmu i to bi bilo otprilike to (fali jos gui i nesto
sto bi brinulo o samoj igri (o neprijateljima i skriptama...), ali to je druga prica).

Sta je fora? Actor nema pojma da li ga renderuje directX, openGL ili nesto trece, samo zna gde je i kako mu se textura
zove. Camera takodje nema pojma o nacinu crtanja. Ovako su Texture Manager i Render jedini koji su vezani za nacin
crtanja i ukoliko se sa openGL-a prelazi na directX ili nesto drugo, samo se oni menjaju. Takodje mozes sebi jasno da
nacrtas na papiru koja klasa je vezana sa kojom i kako.

Ukoliko bi Actor drzao svoju texturu i pri apdejtu sam gledao da li je u ekranu, pa zatim crtao sam sebe, onda on ne bi
bio odvojen od crtanja i bilo kakve promene u crtanju bi zahtevale promene i na njemu. To sve postaje veoma konfuzno
kad imas gomilu razlicitih klasa koje se manje/vise crtaju isto ili slicno (propovi (drvece) su pozadina, ali imaju dosta
stvari srodnih sa likovima, iako se ne krecu po nivou i vezani su za tajl gde su postavljeni na nivou, mogu da imaju animaciju
i efekte(kad se zapali) recimo).
[ reject @ 03.11.2007. 12:59 ] @
Evo jos jednog primera zasto je bolje ovako nego onako.
Recimo da imas od 1 do 4 igraca. Onda imas i 1 do 4 kamere. I sve se to apdejtuje, a render (zavisno od broja aktivnih kamera)
deli ekran na 2,3 ili 4 dela i renderuje likove/propove/pozadinu u razlicitoj velicini.
Ovo bi bilo malo komplikovano naraviti da bude jednostavno :D ako bi likovi crtali sami sebe jer bi onda lik morao da zna i broj
aktivnih igraca i kako se trenutno deli ekran i kako ce sad da se crta u kojoj velicini. Onda bi i klasa koja drzi nivo morala da zna
broj igraca i sve ostalo jer sama crta svoje tajlove.
Boze koliko sam zaludan kad sam na bolovanju... :D
[ yaelo @ 03.11.2007. 18:57 ] @
Možda bi bilo dobro da nadješ neku uvodnu knjigu o DirectX-u. Na primer Introduction to 3D game programming with DirectX 9 od Frank Luna. Takodje bih preporučio nešto za OOP i design patterns - Design Patterns: Elements of Reusable Object-Oriented Software. Srećno.