U vezi kolizije pitanje.

toxi

Zainteresovan član
Poruka
379
Hoću da pravim neku malu igricu i sad mi treba pomoć...
Ja sam uvideo da za svaki objekat( lopta, kuća, čovek idr...) treba da napišem klasu jer je tako lakše da se "manipuliše" celim "sklopom", i mislim da u tome ne grešim.
Npr. neka postoji jedna kuglica( koja pretstavlja igrača i igrač je može pomerati u svim smerovima), i dva pravougaonika koji pretstavljaju objekte različitih klasa( npr. kuće).
Logično je da loptica ne sme da se kreće po tim kućama( odnosno pravougaonicima).
Pored te 3 klase postoji i klasa koja pretstavlja "svet", odnosno u njoj se nalaze pomenuti objekti.

E sad, ne znam kako da odredim da li je došlo do kolizije kuglice sa pravougaonicima.
U prethodnoj maloj igri koju sam pravio ja sam objektu koji se kreće predavao kao argumente lokaciju pretmeta sa kojim može da se ostvari kolizija( sa samo jednim je mogla) ali sada ima previše predmeta sa kojim bi mogla da se sudari i sve deluje previše za'ebano...

Palo mi na pamet da napravim dvodimenzionalni array tipa bool, ovako npr:
Kod:
bool slika[800][600];
i da sada svako polje ovog arraya pretstavlja jedan piksel na ekranu( dakle rezolucija je 800x600) i sva su polja default postavljena na false. Ako bih npr. postavio jedan pixel na lokaciji recimo X = 100, Y = 200 onda bih podesio da bude :
Kod:
slika[100][200]  = true;
Znači ako na datoj lokaciji postoji neki objekat onda to mogu da provalim preko ovog array-a i mogao bi da znam da li je došlo do kolizije ili ne. Pa jel bi valjalo da uradim ovako? Sigurno postoji neki bolji način...?
 
Ne razumem koja je razlika između jednog i više objekata? Negde imaš sigurno listu svih objekata i ne vidim šta je problem da jedan po jedan objekat šalješ objektu loptica da proveri da li je sa njim u koliziji ili ne. Znači već sve imaš napravljeno. Sem toga možeš da napraviš i metodu koja će prihvatati listu objekata u okviru klase loptica i onda će ta metoda da zove postojeću koja proverava za jedna objekat (koju već imaš).
 
Hm... Ako imam recimo 50 objekata sa kojima loptica može da se sudari, i radim kako bojan kaže, trebalo bi 50 * 'broj loptica na ekranu' da zovem istu f-ju u toku svakog prolaza kroz "Game Loop"(negde sam prčitao da se tako zove "ona" beskonačna petlja koju sadrži skoro svaka igra :-) ), to deluje malo slow :-/

OK, a jel ne valja ovo sa array-em što sam pomenuo gore?
 
Deluje ti da je sporo ili si probao pa je sporo. To nije isto. U svakom slučaju ne bi trebalo da budem problem da izmeriš koliko traje jedno pozivanje pomenute metode koja utvrđuje da li je došlo do kolizije ili ne, pa onda to pomnoži sa brojem objekata kako bi video koliko to traje za pomenutih 50 objekata.

Ideja koju si predložio može da posluži ako ovo logično rešenje koje već imaš bude zaista presporo. U tom slučaju imaš još jedan objekat koji mora da se ažurira polse svake promene pozicije bilo kog elementa, tako da nisam siguran koliko je vremenska ušteda.

Napravi prvo da radi, pa onda ubrzavaj... ukoliko je potrebno.
 
ovo sa nizom...ne bacaj toliku memoriju ! Neka svaki piksel bude jedan bit pa slazi u bajtove.Tako si dobio odredjene blokove od po 1x8 piksela. A onih 800 je u stvari 100 polja sa bajtom. Kuglicinu x koordinatu isto tako podeli sa 8 i uradi OR blokova 'kuglice' sa blokovima sveta na kojima se ona nalazi (ovo ces lako izracunati). A 'kuglicu' isto tako smesti kao niz bitova, tj.blokova, da bi lakse radio OR:

00111100
01111110
11111111
11111111
11111111
11111111
01111110
00111100
(nesto takvo, samo vece)

A kad treba da se proveri, uradis prvo shift levo/desno (sa dodavanjem keca ili nule s kraja, kako gde) zavisno od kretanja kugle za po x mod 8, pa OR-ujes samo one blokove koji pokrivaju spoljnu ivicu kugle...opet ces imati znatan broj operacija (zavisi od dimenzija kuglice) ali ce ove valjda biti brze
 

Back
Top