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

Obliczanie wierzchołków na obiekcie, warunek odpowiadający za kolizję.

Ostatnio zmodyfikowano 2012-05-06 14:23
Autor Wiadomość
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-03 00:49:59
O o ten zapis chodziło xD

C/C++
s1_x = s1_x + 10;

teraz działa ;)

dzięki za pomoc.
P-55836
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-04 15:42:37
Witam !

Napisałem kod który wykrywa kolizję. Jednak działa on piksel w piksel. 
Zrobiłem mały rysunek:
http://odsiebie.pl/cgfndutgbzlc/kolizja_forum1.jpg.html

Co muszę pozmieniać, aby kolizję wykrywały się również gdy samochodem 1  uderzę w samochód 2 np. lewym górnym rogiem (kx7,ky8) ?

Oto kawałek kody który odpowiada za kolizje:

C/C++
//-----------------KOLIZJE------------------------------------------------------
//samochod 1

int ky1 = 0, kx2 = 0, kx3 = 0, ky4 = 0, kx5 = 0, ky6 = 0, kx7 = 0, ky8 = 0; //samochod 1 wierzcholki

kx2 = s1_x;
ky1 = 52 + s1_y; // lewy dolny rog

kx3 = 41 + s1_x; // prawy gorny
ky4 = s1_y;

kx5 = s1_x + 41; //prawy dolny
ky6 = s1_y + 52;

kx7 = s1_x; //lewy gorny
ky8 = s1_y;

//samochod 2
int kx9 = 0, ky10 = 0, kx11 = 0, ky12 = 0, kx13 = 0, ky14 = 0, kx15 = 0, ky16 = 0; //samochod 2 wierzcholki

ky10 = 52 + s2_y;
kx9 = s2_x; // lewy dolny rog

kx11 = 41 + s2_x; // prawy gorny
ky12 = s2_y;

kx13 = s2_x + 41; //prawy dolny
ky14 = s2_y + 52;

kx15 = s2_x; //lewy gorny
ky16 = s2_y;


//wyświetlanie pozycji na ekranie
textprintf_ex( screen, font, 10, 10, makecol( 255, 255, 255 ), - 1, "ky1: %d", ky1 );
textprintf_ex( screen, font, 10, 20, makecol( 255, 255, 255 ), - 1, "kx2: %d", kx2 );
textprintf_ex( screen, font, 10, 30, makecol( 255, 255, 255 ), - 1, "kx3: %d", kx3 );
textprintf_ex( screen, font, 10, 40, makecol( 255, 255, 255 ), - 1, "ky4: %d", ky4 );
textprintf_ex( screen, font, 10, 50, makecol( 255, 255, 255 ), - 1, "kx5: %d", kx5 );
textprintf_ex( screen, font, 10, 60, makecol( 255, 255, 255 ), - 1, "ky6: %d", ky6 );
textprintf_ex( screen, font, 10, 70, makecol( 255, 255, 255 ), - 1, "kx7: %d", kx7 );
textprintf_ex( screen, font, 10, 80, makecol( 255, 255, 255 ), - 1, "ky8: %d", ky8 );
textprintf_ex( screen, font, 10, 90, makecol( 255, 255, 255 ), - 1, "kx9: %d", kx9 );
textprintf_ex( screen, font, 10, 100, makecol( 255, 255, 255 ), - 1, "ky10: %d", ky10 );
textprintf_ex( screen, font, 10, 110, makecol( 255, 255, 255 ), - 1, "kx11: %d", kx11 );
textprintf_ex( screen, font, 10, 120, makecol( 255, 255, 255 ), - 1, "ky12: %d", ky12 );
textprintf_ex( screen, font, 10, 130, makecol( 255, 255, 255 ), - 1, "kx13: %d", kx13 );
textprintf_ex( screen, font, 10, 140, makecol( 255, 255, 255 ), - 1, "ky14: %d", ky14 );
textprintf_ex( screen, font, 10, 150, makecol( 255, 255, 255 ), - 1, "kx15: %d", kx15 );
textprintf_ex( screen, font, 10, 160, makecol( 255, 255, 255 ), - 1, "ky16: %d", ky16 );




if( kx11 >= kx7 && kx13 >= kx2 && ky12 <= ky8 && ky14 >= ky1 ) //prawy bok auta 2 kolizja
{
    textout_ex( MAPA, font, "prawy bok auta 2 kolizja !", 0, 0, makecol( 255, 255, 255 ), - 1 );
    s1_x = s1_x + 2;
    s2_x = s2_x - 2;
}


if( ky8 >= ky10 && ky14 >= ky4 && kx12 <= kx9 && kx13 >= kx3 ) // tyl auta 2 kolizja
{
    textout_ex( MAPA, font, "tyl auta 2 Kolizja !", 250, 0, makecol( 255, 255, 255 ), - 1 );
    s2_y = s2_y - 3;
    s1_y = s1_y + 1;
}
P-56002
kizia
» 2012-05-04 23:41:46
A dlaczego nie ułatwisz sobie życia i nie zrobisz tego w prosty i szybszy sposób?
bool check_collision( samochod A, samochod B )
{    
     if( A.y + A.h <= B.y )
            return false ;
     else if( A.y >= B.y + B.h )
            return false ;
     else if( A.x + A.w <= B.x )
            return false ;
     else if( A.x >= B.x + B.w )
            return false ;
           
     return true ;
}
y,x wspolrzedne samochodow, h - wysokosc, a w - szerokość
P-56030
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-04 23:55:51
Nie chce wykorzystywać gotowych funkcji. Chcę je napisać sam po to by zrozumieć to i nauczyć się tworzyć potrzebne mi funkcje. Udało mi się napisać kolizje działająca piksel w piksel i nie wiem co dalej, dlatego proszę o pomoc.
P-56031
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-06 12:33:25
Powiedzcie mi czy mój pomysł jest dobry ?
Na razie nic nowego nie wymyśliłem.
P-56098
SeaMonster131
» 2012-05-06 13:04:49
Przeanalizuj sobie kod, który podał @kizia.
Kolizje to nic specjalnego, porównujesz ze sobą wierzchołki prostokątów. Zresztą.. ktoś już tu na forum napisał tutka odnośnie kolizji prostokątów (nie mogłem znaleźć linku).
P-56102
Trust
Temat założony przez niniejszego użytkownika
» 2012-05-06 13:36:14
Zrobiłem taką funkcję z forum http://cpp0x.pl/forum/temat/?id=4946 .
Wzorując sie na poście użytkownika ison (3 post od góry).

Teraz tylko musze zrobić, żeby samochody się delikatnie odbijały od siebie, ale coś mi się zdaje, że w tej jednej funkcji tego nie zamieszcze, co ?

C/C++
if( Bx15 < Ax5 && Bx13 > Ax7 && By16 < Ay6 && By14 > Ay8 ) //kolizja
{
    textout_ex( screen, font, " kolizja !", 0, 0, makecol( 255, 255, 255 ), - 1 );
   
}
P-56107
kizia
» 2012-05-06 13:51:35
Zrob sobie to w osobnych funkcjach, jedna funkcja sprawdza czy dochodzi do kolizji, potem sprawdzasz np
if( check_collision() == true )
 to funkcja, która powoduje zmianę prędkości czy kierunków pojazdów
P-56108
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona