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

Kolizje kwadrat-prostokąt

Ostatnio zmodyfikowano 2015-01-10 21:03
Autor Wiadomość
Malina94
Temat założony przez niniejszego użytkownika
Kolizje kwadrat-prostokąt
» 2015-01-09 22:19:01
Witam! Opisałam w poniższy sposób kolizję prostokąta z kwadratem (piłka narysowana na kwadratowej bitmapie). Czy te kolizje są dobrze opisane? Ogólnie to działa, piłka się odbija, ale czasami gdy zahaczy o rogi innych prostokątów, to raczej przelatuje i nic z nimi nie robi. Próbowałam opisać kolizję na rogach prostokąta, ale wyszło mi to marnie i w trakcie testów nie widać różnicy. Czy ktoś mógłby mi podpowiedzieć, jak wziąć się za te rogi? :P
C/C++
if( pilkaY + Yspeed <= prostokatY + wysokosc &&
pilkaY + promien + Yspeed >= prostokatY &&
pilkaX + promien + Xspeed >= prostokatX &&
pilkaX + Xspeed <= prostokat + szerokosc ) {
   
    if( pilkaY + promien + Yspeed >= prostokatY && //gorna krawedz
    pilkaY + Yspeed < prostokatY ) {
        //jakies funkcje
    }
    else if( pilkaY + Yspeed > prostokatY + wysokosc / 2 &&
    pilkaY + promien + Yspeed >= prostokatY + wysokosc ) { //dolna krawedz
        //jakies funkcje
    }
    else if( pilkaX + Xspeed < prostokatX &&
    pilkaX + promien + Xspeed >= prostokatX ) { //lewa krawedz
        //jakies funkcje
    }
    else if( pilkaX + Xspeed + promien > prostokatX + dlugosc &&
    pilkaX + Xspeed <= prostokatX + dlugosc ) { //prawa krawedz
        //jakies funkcje
    }
}

Przykład mojej implementacji jednego z narożników prostokąta:
C/C++
if( pilkaX + promien + Xspeed >= prostokatX &&
pilkaY + promien + Yspeed >= prostokatY ) {
    //jest to lewy gorny rog prostokata
    //jakies funkcje
}
P-124529
NopeDotAvi
» 2015-01-09 22:38:22
C/C++
sf::RectangleShape x, y;
if( x.getGlobalBounds().intersects( y.getGlobalBounds() )
{
    //kolizja
}
po co wynajdywać koło na nowo?
@@ahh nigdzie nie pisze ze to sfml, potem dam edita
P-124530
pekfos
» 2015-01-09 22:42:46
@@ahh nigdzie nie pisze ze to sfml, potem dam edita
Strzelam, że wszystko tylko nie SFML. Hmmm, SDL..?
P-124533
Malina94
Temat założony przez niniejszego użytkownika
» 2015-01-09 23:16:13
No w SDLu piszę :)
P-124543
Piastlis
» 2015-01-09 23:37:28
Rozumiem że to ma działać tak:
1 Sprawdź czy kulka zachodzi na kwadrat w następnej sekwencji
2 sprawdź czy jest to górna krawędź
 jak tak to zareaguj
3 jak nie to sprawdź czy jest to dolna krawędź
 itd.
Ale dlaczego w dolnej krawędzi dzielisz wysokość na 2?
P-124545
Malina94
Temat założony przez niniejszego użytkownika
» 2015-01-10 00:05:27
Hmm... ostatnio trochę kombinowałam w kodzie i wtedy wydawało mi się, że tak będzie ok. Ale z tego co widzę, to ta połowa wysokości jest tam zbędna.

Tak, to działa w ten sposób. W klamerkach mam zawarte zmiany kierunku ruchu dla piłki.
P-124547
Piastlis
» 2015-01-10 00:14:00
Test jest tak skonstruowany że jak prędkość jest większa od promienia to przeleci...
Przekombinowałeś.
Wystarczy przekopiować pojedyńcze warunki z 1 instrukcji.

P-124548
Malina94
Temat założony przez niniejszego użytkownika
» 2015-01-10 16:39:09
I jeden warunek na ścianę? To wystarczy? U mnie ta piłka lata całkiem dobrze, ale na tych rogach jest właśnie problem :P W sumie z tego co jeszcze patrzałam, to na nich wyłapuje tylko ogólną kolizję.
P-124573
« 1 » 2
  Strona 1 z 2 Następna strona