Kolizje
Ostatnio zmodyfikowano 2013-02-17 16:24
polkom21 Temat założony przez niniejszego użytkownika |
Kolizje » 2013-02-14 20:51:30 Witajcie. Wiem było już bardzo dużo tematów tego typu ale mam taki mały problem, że nie wiem czemu mi to nie wychodzi. Robię grę typu arkanoid i potrzebuję kolizje piłki z kafelkami do zbijania. Z kolizją u góry i na dole kafelka udało mi się zrobić bez większego problemu natomiast jeżeli chodzi o boki to już jakoś mi nie wychodzi. Mam coś takiego: if( ballx >(( pozycjaWSiatce.x * 50 ) + 49 ) && ballx <(( pozycjaWSiatce.x * 50 ) + 99 ) && bally <(( pozycjaWSiatce.y * 25 ) + 61 ) ) diry = diry *( - 1 ); else if( ballx >(( pozycjaWSiatce.x * 50 ) + 49 ) && ballx <(( pozycjaWSiatce.x * 50 ) + 99 ) && bally >(( pozycjaWSiatce.y * 25 ) + 61 ) ) diry = diry *( - 1 );
else if( bally >(( pozycjaWSiatce.y * 25 ) + 49 ) && bally <(( pozycjaWSiatce.y * 25 ) + 49 ) && ballx ==(( pozycjaWSiatce.x * 50 ) + 49 ) ) dirx = dirx *( - 1 );
Dla prawej krawędzi nie ma tu bo akurat sprawdzałem co innego. Wymiary kafelka to 50 x 25 i dostępne pole jest z lewym i górnym marginesem na 49px. Jak zrobić te kolizje z prawej i lewej strony? |
|
mostrom |
» 2013-02-15 18:47:38 Usuń else przed ifami Edit: else if( bally >(( pozycjaWSiatce.y * 25 ) + 49 ) && bally <(( pozycjaWSiatce.y * 25 ) + 49 ) && ballx >(( pozycjaWSiatce.x * 50 ) ) ) dirx = dirx *( - 1 );
Lewa krawędź jest najbardziej z lewej strony kafelka ;] przypatrz się warunkowi ballx > (( pozycjaWSiatce.x * 50 ) - 45 ). Nie wiem czy margines należy odjąć, czy nie, ale źle ustalasz lewą krawędź. |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2013-02-16 00:13:03 No dobra napisałem kolizje żeby sprawdzało każdą krawędź tego klocka if( bally <( pozycjaWSiatce.y * 25 ) + 74 && ballx >=( pozycjaWSiatce.x * 50 ) + 49 && ballx <=( pozycjaWSiatce.x * 50 ) + 99 ) diry = diry *( - 1 );
else if( bally >=( pozycjaWSiatce.y * 25 ) + 74 && ballx >=( pozycjaWSiatce.x * 50 ) + 49 && ballx <=( pozycjaWSiatce.x * 50 ) + 99 ) diry = diry *( - 1 );
else if( ballx >( pozycjaWSiatce.x * 50 ) + 49 && bally >=( pozycjaWSiatce.y * 25 ) + 49 && bally <=( pozycjaWSiatce.y * 25 ) + 74 ) dirx = dirx *( - 1 );
else if( ballx ==( pozycjaWSiatce.x * 50 ) + 99 && bally >=( pozycjaWSiatce.y * 25 ) + 49 && bally <=( pozycjaWSiatce.y * 25 ) + 74 ) dirx = dirx *( - 1 );
i jest taka lipa, że nie działa mi kolizja z lewej i z prawej strony. |
|
DarkYoung |
» 2013-02-16 14:07:48 Nie działa w sensie, że nie wykrywa kolizji, czy że źle się odbija? |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2013-02-16 14:54:49 nie wykrywa wcale kolizji z prawej i lewej strony. |
|
RazzorFlame |
» 2013-02-17 12:01:28 Kurde też mnie to wkurza. Zmień kolejność sprawdzania kolizji tzn najpierw sprawdzaj czy wystąpiła kolizja z lewej albo prawej strony, ale wtedy z góry i z dołu nie będzie wykrywać. Fajnie by było gdyby jacyś bardziej zaawansowani w tej dziedzinie się wypowiedzieli, bo sam miałem z tym problem i nadal nie został rozwiązany ;/ |
|
SeaMonster131 |
» 2013-02-17 12:16:22 Mogę zarzucić kod kolizji do napisanego przeze mnie Arkanoida. if( (( this.y >= box[ i ].y && this.y <= box[ i ].y + 32 ) ||( this.y + 22 >= box[ i ].y && this.y + 22 <= box[ i ].y + 32 ) ) &&( this.x >= box[ i ].x || this.x + 22 >= box[ i ].x ) &&( this.x <= box[ i ].x + 64 || this.x + 22 <= box[ i ].x + 64 ) ) { }
this.x, this.y to zmienne pozycji piłeczki, natomiast box[ i ].x, box[ i ].y to zmienne klocków które się zbija (trzymam je w tablicy). 22x22 to wymiar piłeczki. 64x32 to wymiar jednego klocka. |
|
polkom21 Temat założony przez niniejszego użytkownika |
» 2013-02-17 16:24:46 No właśnie w tym problem, że jak zmienię kolejność wystąpienia kolizji to za każdym razem bez różnicy czy to jest kolizja dolnej krawędzi czy której kolwiek to zawsze odbija mi na osi x. SeaMonster131 z tego co widzę to Twój kod wykrywa tylko czy jest kolizja a ja muszę mieć jeszcze wykryte na który rant klocka, z którym występuje kolizja. Napisałem coś takiego: if( ballx >( pozycjaWSiatce.x * 50 ) + 50 && ballx <( pozycjaWSiatce.x * 50 ) + 98 ) diry = diry *( - 1 ); else dirx = dirx *( - 1 );
i działa to niesamowicie dobrze tylko, że jest problem przy innej prędkości kulki. Prędkość będzie od 1px do 8px. Przy co którejś prędkości występuje taki problem, że albo nie wykrywa kolizji z prawej albo z lewej strony kafla. Jak to wykorygować aby taki błąd nie występował? |
|
« 1 » |