Detekce kolizí – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Detekce kolizí – Java – Fórum – Programujte.comDetekce kolizí – Java – Fórum – Programujte.com

 

PAJA
~ Anonymní uživatel
25 příspěvků
28. 11. 2016   #1
-
0
-

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();
                }

Nahlásit jako SPAM
IP: 85.207.251.–
peter
~ Anonymní uživatel
4014 příspěvků
28. 11. 2016   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:a098:85...–
gna
~ Anonymní uživatel
1891 příspěvků
28. 11. 2016   #3
-
0
-

#2 peter
S polem nemá problém a ptá se na ArrayList. Kolizi zjevně testuje tím intersects(). Jsi debil?

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
28. 11. 2016   #4
-
0
-

#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--);
		}
	}
}
Nahlásit jako SPAM
IP: 213.211.51.–
PAJA
~ Anonymní uživatel
25 příspěvků
28. 11. 2016   #5
-
0
-

#4 gna
Ahoj díky , ano, zapomněl jsem tam přidat to get(j), ale i tak to nakonec nepomohlo, kulky normálně proletí "přes" nepřátele a nic se nestane.

Nahlásit jako SPAM
IP: 85.207.251.–
PAJA
~ Anonymní uživatel
25 příspěvků
28. 11. 2016   #6
-
0
-

#2 peter
Ahoj, s přístupem k poli problém nemám, problém bude někde, kde zpracovávám ArrayList.

Nahlásit jako SPAM
IP: 85.207.251.–
gna
~ Anonymní uživatel
1891 příspěvků
29. 11. 2016   #7
-
0
-

#5 PAJA
Zkus si tam dát breakpoint, nebo ladící výpis, jestli to opravdu správně detekuje kolizi.

Pokud ano, tak toto jen odstraní tu kulku z listu. Co máš dál v kódu netuším.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
4014 příspěvků
29. 11. 2016   #8
-
0
-

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

Nahlásit jako SPAM
IP: 2001:718:2601:26c:49f8:c9...–
peter
~ Anonymní uživatel
4014 příspěvků
29. 11. 2016   #9
-
0
-

#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.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:49f8:c9...–
peter
~ Anonymní uživatel
4014 příspěvků
29. 11. 2016   #10
-
0
-

#3 gna
Ale, jak rikam, javu neznam, nevim ,jake ma pred-programovane funkce. Musel bych to zgooglovat a zjistit, ze tam treba existuje intersects a jak se pouziva. Ze to neni user-defined funkce.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:49f8:c9...–
PAJA
~ Anonymní uživatel
25 příspěvků
29. 11. 2016   #11
-
0
-

#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 :)

Nahlásit jako SPAM
IP: 85.207.251.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 31 hostů

Podobná vlákna

Detekce JS — založil cheeester

Detekce QT — založil Standalf

Detekce kolize — založil Lukfi

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý