AI w grze 2D RPG
Ostatnio zmodyfikowano 2009-02-26 14:20
Ju1ian Temat założony przez niniejszego użytkownika |
AI w grze 2D RPG » 2009-02-24 22:06:16 Witam! Od razu mówię, że chodzi tu o proste "gonienie" playera przez potwora. Zupełnie nie wiem jak się za to zabrać. Czytałem artykuły o tym, ale niezbyt mi to pomogło ;/ Bardzo proszę was o jakąkolwiek pomoc. Z góry dziękuję. Pozdrawiam. |
|
lynx |
» 2009-02-24 22:49:04 1. Obliczamy w jakiej osi pozycje 2 obiektów się bardziej różnią, czyli: a) odejmowanie np. obliczona_x = obiekt.x - obiekt2.x //to samo z obliczona_y b) obliczanie wartości bezwzględnej powyższego zapisu. obliczona_x =//obliczanie bezwzględnej c) porównywanie 2 wartości bezwzględnych czyli: obliczona_x z obliczona_y 2. Ruch obiektu w zależności czy większa jest obliczona_x czy y Przykład: void obl_zero( short int & obliczona ) { if( obliczona < 0 ) { obliczona = - obliczona; } }
{ obliczona_x = x - gracz.x; obliczona_y = y - gracz.y; obl_zero( obliczona_x ); obl_zero( obliczona_y ); if( obliczona_x > obliczona_y ) { if( gracz.x < x ) { x--; } if( gracz.x > x ) { x++; } } else { if( gracz.y > y ) { y++; } if( gracz.y < y ) { y--; } } }
|
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2009-02-25 09:51:56 1. Co to jest to x i y (wiem współrzędne, ale czego). 2. ky i kx?? Dzięki za odpowiedź. EDIT: OK zrobiłem ALE innym sposobem, tylko troll jeździ po ukosie ;/ Kod: if(( troll.x - scrolling_x < player.x ) && troll.health != 0 ) troll.x += 40;
if(( troll.x - scrolling_x > player.x ) && troll.health != 0 ) troll.x -= 40;
if(( troll.y - scrolling_y < player.y ) && troll.health != 0 ) troll.y += 40;
if(( troll.y - scrolling_y > player.y ) && troll.health != 0 ) troll.y -= 40;
EDIT2: Ok to już raczej też rozwiązane. Tylko zupełnie nie wiem jak zrobić kolizję z MAPĄ. Stosuję przykład, który był już stosowany na tym forum dla mapy (map[mapa_x+1][..]== 2) itd. Nie wiem jak to przełożyć też na trolla. ;/ |
|
lynx |
» 2009-02-25 18:42:11 Poprawiłem swój kod. Jeżeli chodzi o kolizję to musisz sobie podzielić pozycję x i y obiektu odpowiednio przez szerokość i wysokość kafelków. Później sprawdzasz sobie czy zmienna w tabeli[podzielone_y, podzielone_x] == 2. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2009-02-25 20:05:44 No ok teraz rozumiem, a to kx (jeszcze jedno zostało to zapewne miało być x). Nie zamykajcie tematu |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2009-02-25 21:16:43 Co do kolizji, to jak je robię to się kompiluje, ale jest czarny obraz, a po chwili jest wyślij raport ;/ kawałek kodu jak sprawdzam kolizję trolla z podłożem: ( map[ mapa_y + troll.y - scrolling_y - 1 ][ mapa_x + troll.x - scrolling_x ] ) == 0
|
|
DejaVu |
» 2009-02-25 22:58:07 Jeśli tak jest to znaczy, że wychodzisz np. poza zakres tablicy i piszesz po pamięci nie należącej do aplikacji lub piszesz po aplikacji, czyli uszkadzasz ją, co skutuje wysypaniem się aplikacji. |
|
pekfos |
» 2009-02-26 09:44:07 uznałem że mov=ge się wtrącić jeśli nie chcesz aby troll jeździł po ukosie zamień ten kod if(( troll.x - scrolling_x < player.x ) && troll.health != 0 ) troll.x += 40;
if(( troll.x - scrolling_x > player.x ) && troll.health != 0 ) troll.x -= 40;
if(( troll.y - scrolling_y < player.y ) && troll.health != 0 ) troll.y += 40;
if(( troll.y - scrolling_y > player.y ) && troll.health != 0 ) troll.y -= 40; na to if(( troll.x - scrolling_x < player.x ) && troll.health != 0 ) troll.x += 40; else if(( troll.x - scrolling_x > player.x ) && troll.health != 0 ) troll.x -= 40; else if(( troll.y - scrolling_y < player.y ) && troll.health != 0 ) troll.y += 40; else if(( troll.y - scrolling_y > player.y ) && troll.health != 0 ) troll.y -= 40; zapis ten powoduje że kolejne warunki są w warunku else poprzedniego (jeśli jeden będzie prawdziwy to następne nie wykonują się i nawet nie są sprawdzane) |
|
« 1 » 2 |