Diskuze: Kolize čtverců

C++ C a C++ Kolize čtverců

Avatar
Maxfx
Redaktor
Avatar
Maxfx:

Zdravím jen jsem chtěl vyzkoušet kolize dvou čtverců což není problém ale problém nastane když udělám pole čtverců

struct Enemy {

        bool akt;
        float x;
        float y;
        float speed;
        float bitmap_x;
        float bitmap_y;
        float w;
        float h;


}PocetNepratel[POCET_NEPRATEL];

začnu je vykreslovat od z hora dolů tak mi nefunguje kolize.Neví někdo jak to rozchodit ? Kolizi mám takhle nejspíš to bude uplně blbě :D

for(int i = 1; i < POCET_NEPRATEL ; i++)
        {
  if( ( PocetNepratel[0].x + PocetNepratel[0].bitmap_x >
        PocetNepratel[i].x - PocetNepratel[i].bitmap_x) &&
      ( PocetNepratel[0].x - PocetNepratel[0].bitmap_x <
        PocetNepratel[i].x + PocetNepratel[i].bitmap_x) &&
      ( PocetNepratel[0].y + PocetNepratel[0].bitmap_y >
        PocetNepratel[i].y - PocetNepratel[i].bitmap_y) &&
      ( PocetNepratel[0].y - PocetNepratel[0].bitmap_y <
        PocetNepratel[i].y + PocetNepratel[i].bitmap_y))
       {

         colision = true;
       }
       else{ colision = false;}

Děkuji za návrhy :)

Odpovědět 12.1.2013 18:40
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
Maxfx
Redaktor
Avatar
Maxfx:

že by nikdo nevěděl jak na to ?

Nahoru Odpovědět 12.1.2013 22:17
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
Luboš Běhounek (Satik):

Porovnáváš všechny nepřátele jen s nultým nepřítelem, musíš mezi sebou porovnávat všechny - budeš potřebovat dva vnořené cykly :)

Nahoru Odpovědět 12.1.2013 22:48
:)
Avatar
Maxfx
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Maxfx:

Udělal jsem to takhle ale stojí to za prd máš nějaký figl :D

colision = false;
        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;
                                                //return true;
                                        }
                                        else{
                                        }


                        }

                }

        }
Editováno 12.1.2013 23:24
Nahoru Odpovědět 12.1.2013 23:24
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Maxfx
Drahomír Hanák:

Být tebou, tak si to zapouzdřím do nějaké funkce nebo ještě lépe do objektu :) Já si v JS třeba udělal objekt rectangle, na kterém mám metodu intersects (https://github.com/…Rectangle.js#…). Pak můžu udělat něco jako:

var objekt = new Rectangle(0, 0, 40, 40);
var druhyObjekt = new Rectangle(20, 40, 100, 100);

if (objekt.intersects(druhyObjekt)) {
   // kolize
}
 
Nahoru Odpovědět  +1 12.1.2013 23:29
Avatar
Odpovídá na Maxfx
Luboš Běhounek (Satik):

Jak píše Drahoš - udělej si na test kolizí funkci, které předáš ty dva nepřátele, které chceš otestovat, jestli kolidují.

Pak už můžeš v dvojitém cyklus vůči sobě otestovat všechny nepřátele jednoduše, třeba takhle:

for (int enemy1=0; enemy1<enemycount; enemy1++)
  for (int enemy2=0; enemy2<enemycount; enemy2++)
    if (enemy1<enemy2) // abys netestoval kolize mezi dvojicí nepřátel dvakrát a netestoval kolizi objektu sama se sebou
  {
    if (Collides(nepratele[enemy1], nepratele[enemy2]))
      collision = true;
  }
Nahoru Odpovědět  +1 13.1.2013 10:10
:)
Avatar
Maxfx
Redaktor
Avatar
Maxfx:

nejde mi porovnat pole nepřátel , když mám dva čtverce tak to funguje ale jak jich tam mám 50 tak vůbec nic

Editováno 13.1.2013 16:02
Nahoru Odpovědět 13.1.2013 16:01
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
Maxfx
Redaktor
Avatar
Odpovídá na Luboš Běhounek (Satik)
Maxfx:

Tak zkusil jsem tenhle kod a nic asi jsem něco udělal špatně :(

colision = false;
        for( int i = 0; i < POCET_NEPRATEL - 1 ; i++ )
                {
                for( int j = 0 ; j < POCET_NEPRATEL - 1; j++)
                        {
                        if((PocetNepratel[i].x == PocetNepratel[j].x) &&
                           (PocetNepratel[i].y == PocetNepratel[j].y) && (i != j))
                                {
                                colision = true;
                                break;
                                //return true;
                                }
                        else{
                                }

                        }
Nahoru Odpovědět 13.1.2013 16:36
Být ovládán znamená být sledován, pod dohledem, špehován, veden, uzákoněn, reglementován, ohrazen, indoktrinován, pře...
Avatar
Odpovídá na Maxfx
Luboš Běhounek (Satik):

Napiš si funkci, která porovná nějaký obecný dva nepřátele, který dostane parametrem, jestli kolidují.

bool Collides(Enemy e1, Enemy e2)
{
  // tady jen porovnej e1 a e2, jestli kolidují, asi na to může použít poupravenou verzi té tvojí kontroly z tvého prvního příspěvku (nekontroloval jsem, jestli je to dobře)
}

a pak ji použiješ v těch cyklech:

colision = false;
for( int i = 0; i < POCET_NEPRATEL - 1 ; i++ )
{
    for( int j = 0 ; j < i; j++)
    {
        if (Collides(PocetNepratel[i], PocetNepratel[j]))
        {
            colision = true;
            break;
        }
    }
}

if (kolize)
{
  // tady pak máš nějaký kód, který něco dělá, pokud nastala nějaká kolize
}
Nahoru Odpovědět  +1 13.1.2013 19:41
:)
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.