Kolize čtverců – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kolize čtverců – C / C++ – Fórum – Programujte.comKolize čtverců – C / C++ – Fórum – Programujte.com

 

Mafi
~ Anonymní uživatel
3 příspěvky
12. 1. 2013   #1
-
0
-

Zdravím všechny zkouším kolize čtverců , problém není u dvou čtverců to funguje ale problém nastává když mám pole čtverců (obrázků v bmp ) které vykresluji v allegru od  shora dolů a snažím se detekovat kolizi.Mám strukturu

 struct Enemy {

	bool akt;
	float x; // souřadnice 
	float y; // souřadnice 
	float speed; // rychlost 
	float w;  // výška spritu 
	float h;  // šířka spritu 


}PocetNepratel[POCET_NEPRATEL];

A takhle zkouším kolizi ale dělám to blbě nevíte někdo jak by to bylo správně děkuji  .

  

for(int i = 1; i < POCET_NEPRATEL ; i++)
	{
	if( ( PocetNepratel[0].x >= PocetNepratel[i].x - PocetNepratel[i].h ) &&
	( PocetNepratel[0].x <= PocetNepratel[i].x + PocetNepratel[i].w ) &&
	( PocetNepratel[0].y >= PocetNepratel[i].y - PocetNepratel[i].w ) &&
	( PocetNepratel[0].y <= PocetNepratel[i].y + PocetNepratel[i].h )) 
          {	     
            colision = true;
			   
           }
          else{ colision = false;}
            }
Nahlásit jako SPAM
IP: 88.101.197.–
zlz
~ Anonymní uživatel
634 příspěvků
12. 1. 2013   #2
-
0
-

V každém průběhu nastavíš colision na nějakou hodnotu, takže nakonec tam máš tu poslední. Pravděpodobně chceš jen otestovat jestli vůbec k nějaké kolizi došlo (nastavovat jen true) a zároveň je ti jedno s čím (není potřeba testovat dál, break). Takže takhle:

colision = false;
for (...)
{
    if (...)
    {
        colision = true;
        break;
    }
}

A samotný test kolize máš taky špatně, nakresli si ty čtverce na papír.

Nahlásit jako SPAM
IP: 80.188.216.–
Mafi
~ Anonymní uživatel
3 příspěvky
12. 1. 2013   #3
-
0
-

#2 zlz
Děkuji za radu :) 

Tento kod mi funguje na všechny strany , když mám samostatné 2 čtverce a pohybuji s nimi klávesama

if((pos_x > pos_x2 - 20) && ( pos_x < pos_x2 + 20) && 
   (pos_y > pos_y2 - 20 ) && (pos_y < pos_y2 + 20))

ale nefunguje to na pohyblivé čtverce nakreslil jsem si to ale jsem už z toho dneska magor :)

Nahlásit jako SPAM
IP: 88.101.197.–
zlz
~ Anonymní uživatel
634 příspěvků
12. 1. 2013   #4
-
0
-

No, ono to vlastně funguje správně. Problém by byl, kdyby to nebyly čtverce (u každé souřadnice počítáš s šířkou i výškou), nebo byly různě velké.

Nahlásit jako SPAM
IP: 80.188.216.–
Mafi
~ Anonymní uživatel
3 příspěvky
12. 1. 2013   #5
-
0
-

#4 zlz
Jsou to čtverečky 20 x 20 které padají dolů a chci zjistit kdy došlo ke kolizi jestě jsem něco dopsal sice to detekuje ale někdy nesmyslně takže někde je ještě bota, jak by jsi to vyřešil ,nemáš nějaký fígl ? :D  

for(int i = 0; i < POCET_NEPRATEL ; i++)
	{
		if(PocetNepratel[i].y > 0 )  // Pokud už je na obrazovce
		{
			if(PocetNepratel[i].akt)
			{

				    float pos_x = PocetNepratel[i].x;
				    float pos_y = PocetNepratel[i].y;

					if(( PocetNepratel[i].x > pos_x - 20) &&
					   ( PocetNepratel[i].x < pos_x + 20) &&
					   ( PocetNepratel[i].x > pos_y - 20) &&
					   ( PocetNepratel[i].x < pos_y + 20))
					{
						PocetNepratel[i].akt = false;

						colision = true;
						break;
						
					}
					else{ }
					
					
			}    
			

	} 

Nahlásit jako SPAM
IP: 88.101.197.–
zlz
~ Anonymní uživatel
634 příspěvků
13. 1. 2013   #6
-
0
-

Mám zmatek v tom, jak to má fungovat, ale každopádně se mi nezdá, že bys chtěl testovat, jestli se čtverec srazil sám se sebou.

float pos_x = PocetNepratel[i].x; // <-- i
float pos_y = PocetNepratel[i].y;

if(( PocetNepratel[i].x > pos_x - 20) && // <-- i
Nahlásit jako SPAM
IP: 80.188.216.–
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, 102 hostů

Podobná vlákna

Kolize — založil milanmichal

Kolize — založil "Andrje"

Kolize — založil Dusan

Md5 kolize — založil bortak

Kolize v Allegru — založil Dfire

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ý