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

Kolizja z kafelkiem

Ostatnio zmodyfikowano 2012-02-24 20:59
Autor Wiadomość
wiktor16s
Temat założony przez niniejszego użytkownika
Kolizja z kafelkiem
» 2012-02-19 16:02:07
Taaak, wiem że jest dużo na ten temat, tu i w google, ale nic z 17 stron jakie przeczytałem nie działa. -,-
do rzeczy:
W każdym temacie chcą zrobić kolizję z jakimś kaflem w grze "od boku".
Ja chcę kolizję w grze z lotu ptaka.
Więc moja mapa
C/C++
short int map[ 15 ][ 20 ] =
{
    3, 3, 3, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 3, 3,
    3, 3, 3, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 8, 3, 3,
   
    3, 3, 3, 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 7, 9, 9, 9, 9, 9, 9, 9, 4, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 10, 10, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 8, 3, 3, 3, 3, 3, 3, 3, 8, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 0, 6, 9, 9, 9, 9, 9, 9, 9, 5, 0, 0, 8, 3, 3,
    3, 3, 3, 8, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 0, 8, 3, 3,
    3, 3, 3, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 8, 3, 3,
    3, 3, 3, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 3, 3
};

chciałbym mieć kolizję ze wszystkimi 3-kami.
Wymiary tego kafla to 40x40.
P-50999
ison
» 2012-02-19 16:19:09
if( map[ tile_x ][ tile_y ] == 3 ) kolizja

jeśli gracz jest prostokątem i jest nie większy niż rozmiar kafla to wystarczy, że sprawdzisz czy któryś z jego rogów koliduje

C/C++
tile_x = x / rozmiar_kafla;
tile_y = y / rozmiar_kafla;
P-51000
akwes
» 2012-02-19 16:47:46

W każdym temacie chcą zrobić kolizję z jakimś kaflem w grze "od boku".
Ja chcę kolizję w grze z lotu ptaka.

Ale to jest dokładnie taka sama kolizja, tylko grafika jest inna :)

Przecież w uproszczeniu i włączając ruch postaci na dowolny (bez grawitacji) mamy kolizję takich samych figur.

Nie wiem jak zaawansowany jesteś. Proponuję Ci dwa rozwiązania.
1. Zrobić funkcję kolizji dla kwadratów. Ta w wersji poprawnej na pewno się pojawiła na forum :) Zwłaszcza że jest artykuł na ten temat.

C/C++
bool Kol( /* ... */ );
I pętlą for biegać po kafelkach i sprawdzać czy są numerem 3. Jeżeli są numerem 3 to obliczyć pozycję lewego górnego rogu (tzw Left i Top), i sprawdzić kolizję z funkcją. Jak będzie działać można napisać coś co będzie brało pod uwagę tylko te bliskie kafle. I jeżeli jest kolizja to blokować ruch, który by do tej kolizji prowadził.

1: Gracz klika strzałkę prosto (ruch do przodu o 1 pole)
2: Czy jest Kolizja dla nowych współrzędnych? Tak jest kolizja.
3: Nie wykonuj ruchu.

Inaczej wpadniesz w pętlę :P Bo wejdziesz w kolizję i się nie ruszysz już.


2. Bardziej obiektowo. Może spróbuj zrobić listę (niekoniecznie od razu std::list) elementów zdolnych do kolizji. Czyli w tym przypadku gracza i kafelków numer 3.

C/C++
// szkilet teoretyczny,
// nazwy klas są specjalnie przesadzone :P

class KlasaDoKolizji
{
    // ...
    int x;
    int y;
    int szer;
    int dlug;
    // ...
}

class Gracz
    : public KlasaDoKolizji
{
    //...
};

class Obiekt
    : public KlasaDoKolizji
{
    // ...
    Obiekt( int LewyRogGornyX, LewyRogGornyY, int Szer, int Wys );
}

Potem sobie pętelką robisz tyle obiektów ile masz kafelków numer 3 i sprawdzasz kolizję.
C/C++
bool JestKolizja( KlasaDoKolizji * o1, KlasaDoKolziji * o2 )
// i tu pasuje wtedy
JestKolizja( g, o );

Wszystko tu napisane jest luźną propozycją i zarysem zamysłu. Nie bierz się za implementację dokładnie według tego pomysłu, lecz zaimplementuj efekt własnych przemyśleń.
P-51001
wiktor16s
Temat założony przez niniejszego użytkownika
» 2012-02-24 20:00:45
więc tak;

C/C++
allegro init

{
    (
    sterowanie
   
    int nk = map[ sx % 40 ][ sy % 40 ];
}
if( nk == 3 ) v = 0.1;

ograniczenia
}

ale auto zamiast kolidować z kafelkiem 3 porusza się przeskokami...
 
P-51372
SeaMonster131
» 2012-02-24 20:13:21
Czemu %? Czyli reszta z dzielenia zamiast samego dzielenia?
P-51373
wiktor16s
Temat założony przez niniejszego użytkownika
» 2012-02-24 20:38:45
dobra poprawiłem na / ale i tak dziwnie dzała, kolizja występuje ale nie tam gdzie trzeba. w sensie na całej mapie ale w kawałkach -,-
P-51375
SeaMonster131
» 2012-02-24 20:48:55
Spróbuj może zamienić x z y:
int nk = map[ sy / 40 ][ sx / 40 ];
P-51377
wiktor16s
Temat założony przez niniejszego użytkownika
» 2012-02-24 20:59:18
SEA kocham cie xD nie no jaja se robie.
chodzi o to że działa ;P dzięki wielkie i zamykam temat :)
P-51378
« 1 »
  Strona 1 z 1