IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Maxfx
Tvůrce
Avatar
Maxfx:12.1.2013 18:40

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
Tvůrce
Avatar
Maxfx:12.1.2013 22:17

ž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:12.1.2013 22:48

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
https://www.facebook.com/peasantsandcastles/
Avatar
Maxfx
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Maxfx:12.1.2013 23:24

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
Odpovídá na Maxfx
Drahomír Hanák:12.1.2013 23:29

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
12.1.2013 23:29
Avatar
Odpovídá na Maxfx
Luboš Běhounek Satik:13.1.2013 10:10

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
13.1.2013 10:10
https://www.facebook.com/peasantsandcastles/
Avatar
Maxfx
Tvůrce
Avatar
Maxfx:13.1.2013 16:01

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
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Maxfx:13.1.2013 16:36

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:13.1.2013 19:41

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
13.1.2013 19:41
https://www.facebook.com/peasantsandcastles/
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.