Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kolizje

Ostatnio zmodyfikowano 2013-02-17 16:24
Autor Wiadomość
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:
C/C++
if( ballx >(( pozycjaWSiatce.x * 50 ) + 49 ) && ballx <(( pozycjaWSiatce.x * 50 ) + 99 ) && bally <(( pozycjaWSiatce.y * 25 ) + 61 ) ) diry = diry *( - 1 ); // gorna krawedz
else if( ballx >(( pozycjaWSiatce.x * 50 ) + 49 ) && ballx <(( pozycjaWSiatce.x * 50 ) + 99 ) && bally >(( pozycjaWSiatce.y * 25 ) + 61 ) ) diry = diry *( - 1 ); // dolna krawedz
//else if() std::cout << "kolizja\n"; // prawa krawedz
else if( bally >(( pozycjaWSiatce.y * 25 ) + 49 ) && bally <(( pozycjaWSiatce.y * 25 ) + 49 ) && ballx ==(( pozycjaWSiatce.x * 50 ) + 49 ) ) dirx = dirx *( - 1 ); // lewa krawedz

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?
P-76300
mostrom
» 2013-02-15 18:47:38
Usuń else przed ifami

Edit:
C/C++
else if( bally >(( pozycjaWSiatce.y * 25 ) + 49 ) && bally <(( pozycjaWSiatce.y * 25 ) + 49 ) && ballx >(( pozycjaWSiatce.x * 50 ) ) ) dirx = dirx *( - 1 ); // lewa krawedz


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ź.
P-76359
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
C/C++
//gora
if( bally <( pozycjaWSiatce.y * 25 ) + 74 && ballx >=( pozycjaWSiatce.x * 50 ) + 49 && ballx <=( pozycjaWSiatce.x * 50 ) + 99 ) diry = diry *( - 1 );
//dol
else if( bally >=( pozycjaWSiatce.y * 25 ) + 74 && ballx >=( pozycjaWSiatce.x * 50 ) + 49 && ballx <=( pozycjaWSiatce.x * 50 ) + 99 ) diry = diry *( - 1 );
//lewa
else if( ballx >( pozycjaWSiatce.x * 50 ) + 49 && bally >=( pozycjaWSiatce.y * 25 ) + 49 && bally <=( pozycjaWSiatce.y * 25 ) + 74 ) dirx = dirx *( - 1 );
//prawa
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.
P-76388
DarkYoung
» 2013-02-16 14:07:48
Nie działa w sensie, że nie wykrywa kolizji, czy że źle się odbija?
P-76404
polkom21
Temat założony przez niniejszego użytkownika
» 2013-02-16 14:54:49
nie wykrywa wcale kolizji z prawej i lewej strony.
P-76405
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 ;/
P-76431
SeaMonster131
» 2013-02-17 12:16:22
Mogę zarzucić kod kolizji do napisanego przeze mnie Arkanoida.
C/C++
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 )
)
{
    // kolizja
}

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.
P-76434
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:
C/C++
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ł?
P-76449
« 1 »
  Strona 1 z 1