[ toxi_programer @ 28.11.2006. 17:50 ] @

-------------------------------
Nadam se nekom malo opsirnijem objasnjenju od strane nekog korisnika, dakle na srpskom( nadam se da ce neko izdvojiti malo vremena da me "uputi" jer ja uvek pomognem kad mogu a ova mi informacija bas treba).
-------------------------------
Radi se o sledećem.
Odma da kazem da me Game Maker i sl. ne zanima. Znam C, C++ i ucim MC++( i ipak sam pocetnik).... U knjizi "Visual C++ .NET" (od Chapmana) sam naisao na poglavlje koje se bavi radom sa GDI+ i procitao ga... O OpenGL i DirectX pojma nemam.A ni o multithread...
Ono sto ja zelim da uradim(za pocetak, jel)( i da bude koriščenjem GDI+a) je da napravim prostu i jednostavnu igru "lepeći kontrole u formu" pa da one rade tamo nešto...
U vezi tog "tamo nečeg": Mislim da koliziju( a volim da kazem "koluziju", mada znam da je nepravilno) mogu da odradim... Problem je kretanje 2D sprajtova. Kako da ga ostvarim? Pomoću timera? Deluje glupo i neostvarivo mada nisam probao...

1. Ne tražim kod, niti kakav link, već da mi neko objasni kako da postignem da, ako imam klasu koja definiše recimo neku kuglicu( metak) koji treba da se po svom postanku počne kretati pozitivno po npr. X osi. Dakle, u konstruktoru te klase treba da se odradi direktiva za to kretanje. Samo "skakutanje", koriscenje sprajtova i slicno znam da uradim i to nije problem vec... Hm, imam f-ju koja odradi "korak" objekta u odredjenom smeru medjutim ne znam kako da periodicno pozivam tu funkciju za gomilu objekata koji treba da se pomere( a broj tih objekata nije stalan vec se dinamicki menja)...
(imam par ideja kako da ovo uradim ovo sa timer-om ali bih voleo da me vi malo "prosvetlite")

2. Još jedna stvar, recimo da se dogodi kolizija i sad metak treba da nestane... Kako da ga uklonim sa "lica" forme? Znam da je ovo glupavo i (previse) jednostavno pitanje ali, eto, u MC++ to ne znam...

Unapred, hvala!
[ yooyo @ 29.11.2006. 01:07 ] @
Osnovni deo code-a koja ti treba je game loop. On izgleda najprostije ovako:
Code:

DWORD pocetnoVreme = timeGetTime(); 
DWORD prethodnoVreme = 0;
while (!bQuit)
{
 DWORD vreme = timeGetTime() - pocetnoVreme; 
 Update(vreme, vreme - prethodnoVreme);
 Render();
 prethodnoVreme = vreme;
}


U Update metodi, proveri stanje ulaznih uredjaja (mis, tastatura, joystick,...) animiraj sve objekte, koliziju,...
U Render metodi iscrtaj sve vidljive objekte na koordinatama koje si izracunao u Update metodi.

vreme i prethodnoVreme su promenljive pomocu kojih animiras objekte. Obzirom na to da racunari rade na
razlicitim frekvencijama, moras osigurati da ce igra raditi istom brzinom na svim masinama. Zato animacju
svih objekata vezi za vreme ili za delta-vreme (vreme - prethodnoVreme). U gornjem slucaju... vremenska jedinica
je ms (milisekunda). Update metoda prima trenutno vreme i delta vreme. Za neke annimacije mozes iskoristiti
trenutno vreme, a za neke druge delta-vreme.
[ toxi_programer @ 29.11.2006. 16:06 ] @
Da vidim dal' sam shvatio: Unutar Update() funkcije proveravam dal je prošlo dovoljno vremena (preko deltaVreme) i ako jesto izračunam sve potencijalne kolizije i pomeranja itd... A u Render() samo "pomerim" sta se treba pomeriti...?

Ali, while će da "vrti" stalno pa će komp da se optereti 100%... Jel da? Ako bih stavio npr. Sleep(1) jel bi se događalo da korisnik recimo pritisne neki od tastera na tastaturi a da isti ne bude "uhvaćen" jer je u tom trenutku program bio "uspavan"? Mada mi deluje ne logično da neko mož' tako brzo da pritisne taster
[ yooyo @ 29.11.2006. 20:10 ] @
Ne nego u Update pomeris sve sto treba, a u Render iscrtas objekte na novim (malopre pomerenim) koordinatama.
Ovaj loop ce zaista pojesti 100% procesora bas kao i sve ostale igre. Mozes da stavis Sleep(1) ali ce taj sleep
da traje od 15-40 ms u zavisnosti od CPU-a, OS-a i sta se trenutno od programa vrti u pozadini.
[ hardcastle @ 29.11.2006. 21:22 ] @
Postaviš beskonačnu petlju tj staviš while(true) i neće provjeravati vrednost bQuit;
[ toxi_programer @ 30.11.2006. 16:38 ] @
Pa koja je razlika? Opet će opterećenje biti maximalno...?
[ Filip Strugar @ 30.11.2006. 21:20 ] @
Citat:
yooyo: Ne nego u Update pomeris sve sto treba, a u Render iscrtas objekte na novim (malopre pomerenim) koordinatama.
Ovaj loop ce zaista pojesti 100% procesora bas kao i sve ostale igre. Mozes da stavis Sleep(1) ali ce taj sleep
da traje od 15-40 ms u zavisnosti od CPU-a, OS-a i sta se trenutno od programa vrti u pozadini.

Da sitnicarimo, trajace oko 10ms u vecini slucajeva (na XP-u na primer), osim ako nesto drugo ne jede procesor. :)
(Inace, to se moze hack-promeniti (smanjiti na 1ms) sa timeBeginPeriod/timeEndPeriod, win32 jelte)

Citat:
toxi_programer: Pa koja je razlika? Opet će opterećenje biti maximalno...?

To predlozeno neproveravanje bQuita nece promeniti nista.
Isprobaj Sleep(x) pa koristi za x sta ti odgovara.

Inace, sto se pritiska tastera tice, ako radis na Windowsu, njih dobijas kao windows poruke koje trebas procesirati u main loopu, nadji neki primer na netu (npr http://www.mvps.org/directx/articles/writing_the_game_loop.htm) tako da ih ne mozes 'ne uhvatiti', bez brige :)
[ bkaradzic @ 01.12.2006. 02:20 ] @
Zapravo dovoljno je staviti ::Sleep(0) u main loop (deo koji ne obrađuje poruke) i ostali procesi će dobiti dovoljno vremena.

p.s. LOL za while(true) "optimizaciju"... ;)
[ masetrt @ 01.12.2006. 09:46 ] @
Koliko sam razumeo toxi koristi menaged c++ pa evo jos i jednog nepopularnog resenja lakog za realizaciju. Da mu se main loop izvrsava u jednom, a input "bufferuje" u drugom thredu. Sa Thread::Sleep(miliseconds) ce moci uspavati thread na tacno vreme koje zeli. Opet kazem da resnje nije bas najbolje ali je lako za realizaciju i moze da vrsi poso. Sto se tice nestajanja "metka" cisto visible setuj na false, ali nemoj da dispozujes taj image objekat jel ga mozes kasnije opet upotrebiti.
[ yooyo @ 01.12.2006. 10:57 ] @
Da se ne gusimo oko timera.. Sleep nikad nece odspavati onoliko koliko mu kazes, ali je dovoljno da ostali procesi dobiju parce CPU vremena.
Cak je i procesiranje windows poruka u main-loop-u dovoljno da i ostali procesi "dishu" a zauzece ce biti ~100%.
[ toxi_programer @ 03.12.2006. 15:58 ] @
Ljudi, hvala vam. Ako negde stanem eto mene opet
Pozz