QT - Tvorba hry – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

QT - Tvorba hry – C / C++ – Fórum – Programujte.comQT - Tvorba hry – C / C++ – Fórum – Programujte.com

 

Franta
~ Anonymní uživatel
15 příspěvků
27. 3. 2018   #1
-
0
-

Dobrý večer,

Naskytl se mi takový problém, v programu Qt jsem si udělal hru a nemám ponětí jak zjistit kolizi mezi objekty které mám v Qlistech. 

QList<meteor*>meteory;
QList<bullet*>naboj;
 

pomocí ifů sem jim zadal požadavky a potřebuji zajistit kolizi naboje s meteorem.

kód:


for(int i=0;i<meteory.length();++i){
meteory[i]->move();
if(meteory[i]->x()>700){
meteory[i]->setX(0-meteory[i]->boundingRect().height());
meteory[i]->setY(qrand()%700);
}
if(meteory[i]->collidesWithItem(p)||meteory[i]->collidesWithItem(p2)){
meteory[i]->setY(qrand()%700);
meteory[i]->setX(-40);
}
if(!scene()->collidingItems(meteory[i]).isEmpty()){
meteory[i]->setY(qrand()%700);
meteory[i]->setX(-40);
}

}

for(int i=0;i<naboj.length();++i){
naboj[i]->move();
if(naboj[i]->y()>750||naboj[i]->y()<-50){
naboj[i]->setSpeed_y(0);
}
if(naboj[i]->collidesWithItem(p2)){
p2->setY(150);
p2->setX(330);
}
if(naboj[i]->collidesWithItem(p)){
p->setY(550);
p->setX(330);
}
 

Výsledek: 

if(meteory[i]->colidesWithItem(naboj[i]))

{

meteory[i]->setY(qrand()%700);
meteory[i]->setX(-40);

}

Nahlásit jako SPAM
IP: 109.234.41.–
gna
~ Anonymní uživatel
1208 příspěvků
27. 3. 2018   #2
-
0
-

Vždyť už tam používáš funkci pro zjištění všech kolidujících itemů i funkci pro zjištění, jestli dva itemy kolidují. V čem je problém? 

for (int i = 0; i < meteory.length(); ++i) {
	for (int j = 0; j < naboj.length(); ++j) {
		if (meteory[i]->collidesWithItem(naboj[j])) {
			// bum
		}
	}
}
Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3619 příspěvků
28. 3. 2018   #3
-
0
-

Naboj je ctverecek. Meteor taky. obdelnik [x1,y1,x2,y2]
A (naboj) uvnitr objektu B.
Bx1<Ax1 && Ax1<Bx2 &&
Bx1<Ax2 && Ax2<Bx2 &&
By1<Ay1 && Ay1<By2 &&
By1<Ay2 && Ay2<By2
To je, kdyz je naboj uplne uvnitr. Dobre je si to nakreslit na papir. Jestli te zajima styk z vnejsi hranici
Bx1<Ax1 && Ax1<Bx2 ||
Bx1<Ax2 && Ax2<Bx2 &&
By1<Ay1 && Ay1<By2 ||
By1<Ay2 && Ay2<By2
Cili, by melo stacit, jestli je aspon jedno z x, uvnitr a soucasne aspon jedno y uvnitr. A doufam, ze to mam spravne napsane. Nechce se mi to kreslit.
Jestli ma naboj 1 pixel, tak se ti to zjednodusi na
Bx1<Ax && Ax<Bx2 ||
By1<Ay && Ay<By2
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:89ff:85...–
peter
~ Anonymní uživatel
3619 příspěvků
28. 3. 2018   #4
-
0
-

Ups, samozrejme zavorky tam musi byt.
(Bx1<Ax1 && Ax1<Bx2) ||
(Bx1<Ax2 && Ax2<Bx2) &&
(By1<Ay1 && Ay1<By2) ||
(By1<Ay2 && Ay2<By2)
Jinak, je to samozrejme jednoduchy vzorec A v B. Jen doplnis x, y a u A navic 1, 2.
B1 < A < B2
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:89ff:85...–
peter
~ Anonymní uživatel
3619 příspěvků
29. 3. 2018   #5
-
0
-

Jeste je jeden zajimavy pripad, ktery jsem nezminil. Kdy ten objekt A (naboj) je vetsi nez B (meteor).
Takze by bylo mozna dobre provest jeste opacnou kontrolu. Zamenit tam A a B.
A[  B  ] - B je v A, souradnice Bxy, Ax1<Bx1<Ax2
B[  A  ] - A je v B, Ax1>Bx1>Ax2
Ted ti nereknu, jak jsem to nekde resil, ale tusim to jde napsat nejak zjednodusene. Ale je treba zacit tim, ze si napises uplne vsechny podminky pro vsechny pripady. Cili, nakreslis si 2 ctverecky, jeden mensi, udelas prekryti, vsechny strany, rohy. Pak velikosti otocis a udelas totez. Jake podminky plati pro x1, x2, y1, y2 pro A i B.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
29. 3. 2018   #6
-
0
-

#5 peter
Mi to připomíná analytickou geometrii. Možná by ve školních úlohách našel jak na to.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
3619 příspěvků
29. 3. 2018   #7
-
0
-

Na geometrie nevidim, neslysim :) Tudle jsem chvili psal do jakehosi math fora a dali mi ban, za to, ze prozrazuji skolni ulohy a ze si na mne jedna ucitelka zasedla, ze tam pry strasne skodim :) Pritom ona se k tazatelum obvykle chovala dost nevlidne. Ale kdyz uz neco resila, tak to bylo samozrejme na jednicku, to zas jo.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
MilanL+1
Expert
29. 3. 2018   #8
-
0
-

#5 peter
jde o to jak jsou objekty tvarované (koule/kruh, kvádr/obdélník, jiný tvar)

pro rychlost provádění asi nejlepší vložit 2D do kruhu a 3D do koule, pak v prvotní fázi kontrolovat vzdálenost středů na součet poloměrů, to jsou 2 výpočty, které ušetří spoustu výpočtů (vypadne podrobnější testování v update v průběhu letu než se k sobě dostanou dost blízko)

Nahlásit jako SPAM
IP: 91.139.9.–
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, 327 hostů

Podobná vlákna

Tvorba hry — založil Felen

Tvorba hry — založil Michal Dorazil

Tvorba 3D hry — založil johnny15

Tvorba hry - programy — založil Qui

Moderátoři diskuze

 

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