Šta je novo?

Java Paint, Timer

Nuclear

Slavan
Učlanjen(a)
14.11.2006
Poruke
949
Poena
320
правим игру, базираној на некој друштвеној игри, и потребно ми је, да имам картице које ће се померати по табли, по потреби.
смислио сам да то буде преко тајмера, који ће на сваких 5 милисекунди да повећа координате картице, и затим да прикаже приказ на екрану, тј да се стекне утисак као да картица заиста клизи по екрану.

то сам успео, међутим, пошто је тајмер нит, он се извршава паралелно са остатком кода, што ми никако не одговара. потребно ми је да он уради шта има, а затим да се остатак кода изврши. како бих ово могао да постигнем? успут, приликом "померања картица", слике које их представљају трепере, и иако не смета за игру, није лепо да се види. користим BufferedImage, мислио сам да ће то бити довољно.


имам још једно питање, али прво да решим ове ствари.. значи треба ми нека врста deadlock механизма, која каже док тајмер не заврши, остатак кода чека.
 
1) 5ms je 200fps. sto nema smisla.
2) meni se cini da nije dobra praksa da ti crtanje frejma odgovara ili ne... model igre i njen graficki prikaz bi trebalo da su odvojene stvari.
3) ako bas insistiras na trenutnom dizajnu verujem da postoji resenje ugradjeno u biblioteku/framework il' kako vec to zovete. s tim u vidu raspitao bih se i da li postoji neka praksa za 2D animaciju koja bi ti olaksala posao, da ne izmisljas toplu vodu. sem ako bas to nije poenta. :)
 
Pa nista, samo sinhronizuj to. U niti koja treba da ceka uradis wait() nad nekim objektom, i notify() u toj dugoj niti kad se zavrsi.
 
Veruj mi da ne zelis deadlock... Mnogi ljudi se toliko trude da do njega ne dodje, smisljaju razne algoritme prevencije i raszresavanja u slucaju nastanka a ti bi da ga prouzrokujes :). Salu na stranu Sinter ti je lepo rekao da ti je potrebna samo sinhronizacija niti.
Bahati ti je isto lepo rekao da pokusavas neki preterani framerate, jer si bas nagazio tajmer. Ako ti sporo izgleda taj rendering(mnogo laguje), probaj da nadjes neko bolje resenje koje bi brze radilo a ne sili toliko taj tajmer jer ces pomeranjem nekoliko spritova da pokocis neciji komp :D. Nisam bas upucen u Java pravljenje igara, ali koliko sam nesto video na netu postoji JavaFX koja bas izlgeda sluzi pravljenju tih igara i radu sa grafikom. Verovatno tamo ima i dobrih biblioteka i svega, probaj to malo da istrazis...
 
Podeli lopp na dva dela.. Update i Draw. U Update() pomeri koordinate kartica i odradi game logiku a u Draw() iscrtaj stanje igre.
Praksa je da se u Update salje trenutno vreme (t) i delta vreme (dt) (u odnosu na prethodni frame) tako da animaciju mozes da sinhronizujes i da bude identicna na svim masinama. Pojedine funkcije za animiranje zavise od t a pojedine od dt.
Drugi nacin je da imas "globalni" objekat gameClock, koji sadrzi metode za upit tacnog vremena i delta vremena od poslednjeg update-a. Game logika, simulacija fizike i animacija citaju trenutno vreme iz gameClock-a. gameClock za vreme izvrsavanja jednog frejma uvek ima istu vrednost.

http://dewitters.koonsolo.com/gameloop.html
 
Nazad
Vrh Dno