Ahoj, vytvářím hru v javě a dostal jsem se k dalšímu problému a tím je detekce kolizí, pracuji s entitou hráče, poté mám pole entit nepřátel a arraylist vystřelených nábojů.
Detekci mezi hráčem a nepřáteli řeším klasicky přes getBounds(), který mi vrací Rectangle a poté je srovnám pomocí Intersects. Toto funguje v pořádku.
Problém nastává, když mám zavolat getBounds() nad vystřelenými náboji, nejsem si jistý, jak to vytáhnout z toho arraylistu.
Přikládám kod, jak prozatím detekuji kolize. Budu rád, za každou radu.
for (int i = 0; i < poleProtihracu.length; i++) {
if (poleProtihracu[i] != null) {
Rectangle okrajeHrace = player.getOkraje();
Rectangle okrajeNepratel = poleProtihracu[i].getOkraje();
// if (poleProtihracu[i].getOkraje().intersects(bullet.getOkraje())){
// poleProtihracu[i] = null;
//}
if (okrajeHrace.intersects(okrajeNepratel)) {
poleProtihracu[i] = null;
}
}
repaint();
}
Fórum › Java
Detekce kolizí
Javu nepouzivam, nechci znat, ale...
"nejsem si jistý, jak to vytáhnout z toho arraylistu."
"poleProtihracu[i] != null"
Ale, vzdyt tady porovnavas, zda ten hrac existuje. takze se k tomu poli dostanes. Podobne to mas pro kulku
cyklus (bullets) {
B = bullets[i] // = [x:123, y:123, w:5, h:5] // takze okraje pak jsou [x, y, x+w, y+h]
cyklus (players) {
P = players[i] // = [x:123, y:123, w:50, h:50] // takze okraje pak jsou [x, y, x+w, y+h]
funkce1();
funkce2();
funkce3();
v javascriptu (html) by se to porovnani napsalo takto
B.x >= P.x ...
B['x'] >= P['x'] //nebo
a ted je treba si vzit papir a nakreslit si to, abys videl, ktere souradnice musis porovnat. Nakreslit si tam ruzne smery, sklony, strel sikmo do hrany, sikmo do rohu...
Pripadne muzes kolem hrace udelat jeste zonu, kde kulka ho sice skrtne, ale neumre z toho.
Muzes si treba rici, ze zasah je povazovany jen tehdy, vnikne-li kulka uplne do hrace. Takze strela na okraji je ignorovana, vyhodnoti se az v dalsim kroku, pokud se zanori do hrace.
#1 PAJA
Nejsem si jistý jestli se ptáš na procházení, get, nebo remove. Toto by mohlo fungovat:
Rectangle okrajeHrac = player.getOkraje();
for (int i = 0; i < poleProtihracu.length; i++) {
if (poleProtihracu[i] == null) {
continue;
}
Rectangle okrajeProtihrac = poleProtihracu[i].getOkraje();
if (okrajeProtihrac.intersects(okrajeHrac)) {
poleProtihracu[i] = null;
}
for (int j = 0; j < kulky.size(); j++) {
if (kulky.get(j).getOkraje().intersects(okrajeProtihrac)) {
poleProtihracu[i] = null;
kulky.remove(j--);
}
}
}
Si vypis polohu.
V JS bych to udelal tak, ze si prednastavim x,y pred kolizi, vypisu obe pole. Necham provest posun. a opet vypisu obe pole a hodnoty promennych, co resi kolizi.
Napr, budu uvazovat, ze kulka musi byt jen uvnitr:
Bxw = Bx + Bw (JS tam ma mezitim pro objekt jeste tect, ale ty neresim ted)
Byh = Bx + Bh
// Px<Bx && Bx<Pxw ; Px<Bxw && Bxw<Pxw // pro X
// Py<By && By<Pyh ; Py<Byh && Byh<Pyh // pro Y
alert([
B.toSource(),"\n",P.toSource(),"\n",
Px<Bx, Bx<Pxw, Px<Bwx, Bwx<Pwx,
Py<By, By<Pyh, Py<Bhy, Bhy<Phy
]);
tak bych zjistil, jestli v poli/objektu P, B jsou spravna data a ktera z 8 podminek selhala.
Doporucuji zapisovat vetsitka mensitka takhle, abys videl, ze Bx porovnavas z venci na Px a Pxw.
Px<Bx && Bx<Pxw
#3 gna
Ano, pta se na pole, ale je zjevne, ze ani sam nevi, jaky vysledek zapis dava, ze si to nezobrazi. Takze vlastne nevi, zda vytahl z pole spravnou hodnotu, jestli ma skutecne okraje nebo jen prazdne pole.
Tak mu porad, jak zobrazit vysledek. V JS bych pouzil alert nebo alert(prom.toSource()). Jak se to dela v jave, to netusim. Co ma uvnitr te detekce, to tam taky nenapsal. Takze nelze rici, ze ten kod ma spravne, ikdyz si to mysli.
#10 peter
Ahoj všichni, tak hlásím, že jsem to vyřešil, byla to zase taková klasická pitomá chyba, neumím psát kod moc přehledně a přehlédl jsem, to, že jsem vlastně místo aktuální pozice letící kulky vracel pokaždé pozici počátečních souřadnic kulky, což je vlastně pozice hráče. Příště musím dávat bacha, jaké proměnné dosazuji :)
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Detekce ovládání myši skrz aplikaci v c#, detekce bota v c# — založil ejtix
Uhel odrazu pri kolizi dvou kruznic — založil _Radek_
Detekce JS — založil cheeester
Detekce QT — založil Standalf
Detekce kolize — založil Lukfi
Moderátoři diskuze