[Allegro] Kolizje sztucznej inteligencji z mapą
Ostatnio zmodyfikowano 2009-03-04 22:32
Ju1ian Temat założony przez niniejszego użytkownika |
[Allegro] Kolizje sztucznej inteligencji z mapą » 2009-03-01 19:39:40 Witam. Mam taki sobie kodzik poruszania (to przerobiony kod Pietrzucha ;)) się sztucznej inteligencji (w tym wypadku trolla). Według niego troll nie powinien włazić na wodę, kamienie i drzewa. Zmienna mapa_x i mapa_y to współrzędne na których jest scrollowanie ekranu (lewy górny róg, dlatego zawsze dodaję te (troll.x - scrolling_x) / 40) 40 to wymiar kafla. O to kod: short int obliczona_x = troll.x - scrolling_x - player.x; short int obliczona_y = troll.y - scrolling_y - player.y; obl_zero( obliczona_x ); obl_zero( obliczona_y ); if( troll.health != 0 ) { if( obliczona_x > obliczona_y ) { if(( player.x < troll.x - scrolling_x ) &&( !kolizja_w_lewo( troll.x - scrolling_x, player.x, troll.y - scrolling_y, player.y ) ) &&((( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x + 1 +( troll.x - scrolling_x ) / 40 ] ) == 0 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x + 1 +( troll.x - scrolling_x ) / 40 ] ) == 2 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x + 1 +( troll.x - scrolling_x ) / 40 ] ) == 6 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x + 1 +( troll.x - scrolling_x ) / 40 ] ) == 7 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x + 1 +( troll.x - scrolling_x ) / 40 ] ) == 8 ) ) ) { troll.x -= 40; } if(( player.x > troll.x - scrolling_x ) &&( !kolizja_w_prawo( troll.x - scrolling_x, player.x, troll.y - scrolling_y, player.y ) ) &&((( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x - 1 +( troll.x - scrolling_x ) / 40 ] ) == 0 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x - 1 +( troll.x - scrolling_x ) / 40 ] ) == 2 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x - 1 +( troll.x - scrolling_x ) / 40 ] ) == 6 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x - 1 +( troll.x - scrolling_x ) / 40 ] ) == 7 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 ][ mapa_x - 1 +( troll.x - scrolling_x ) / 40 ] ) == 8 ) ) ) { troll.x += 40; } } else { if(( player.y > troll.y - scrolling_y ) &&( !kolizja_w_dol( troll.x - scrolling_x, player.x, troll.y - scrolling_y, player.y ) ) &&((( map[ mapa_y +( troll.y - scrolling_y ) / 40 + 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 0 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 + 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 2 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 + 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 6 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 + 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 7 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 + 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 8 ) ) ) { troll.y += 40; } if(( player.y < troll.y - scrolling_y ) &&( !kolizja_w_gore( troll.x - scrolling_x, player.x, troll.y - scrolling_y, player.y ) ) &&((( map[ mapa_y +( troll.y - scrolling_y ) / 40 - 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 0 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 - 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 2 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 - 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 6 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 - 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 7 ) ||(( map[ mapa_y +( troll.y - scrolling_y ) / 40 - 1 ][ mapa_x +( troll.x - scrolling_x ) / 40 ] ) == 8 ) ) ) { troll.y -= 40; } } }
Troll ma "mieszany humor" xD. Raz przestrzega prawa fizyki (no nie wiem jak to ująć, w każdym bądź razie chodzi o przenikanie i latanie nad wodą ;)), a raz nie ;). Nie wiem gdzie tu jest błąd. Na moje oko powinno działać (używam tego samego dla poruszania playera). Mam nadzieję, że poszukacie błędu ze mną ;P Aha i jeszcze jedno. Nie wiem jak zrobić, aby troll jeździł trochę wolniej od gracza, bo tak to ciągle go blokuje oraz, jak nie może przejść to, aby znalazł inną drogę. ;) Pozdrawiam. Ju1ian |
|
DeBugger |
» 2009-03-01 19:52:58 Zadawać lepiej jedno pytanie w temacie. Ale odpowiem(na drugie). Po pierwsze - zmniejsz timer. Po drugie - ustaw dla ludzika np. 3 pixele na naciśnięcie klawisza, a na trolla 2. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2009-03-01 20:09:44 No zrobiłem tak jak mówisz. Byłoby dobrze tylko teraz kolizje się psują, bo ludek się nie porusza tylko "kamera nad nim łazi". |
|
WunM |
» 2009-03-01 20:35:40 Hmmm... spakuj ładnnie wszystko(kody, bitmapy, skompilowany program) i się zobaczy.
//edit
a... i oczywiście wyślij. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2009-03-01 20:45:24 Ok, proszę: http://www.sendspace.com/file/z9r5xp |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2009-03-03 18:32:08 Ok ten pierwszy problem rozwiązany, ale jak zrobić, aby się poruszał wolniej, oraz aby znajdował inną drogę jak jest kolizja, bo tak to stoi jak idiota i czeka aż do niego podejdę. ;) |
|
DejaVu |
» 2009-03-03 18:51:35 Prędkość posuszania obiektów nie dotyczy tematu. Co więcej ta tematyka była poruszana już na forum co najmniej raz.
Co do wyznaczania nowej ścieżki... jest na to jakiś dość popularny algorytm ale jego nazwy nie pamiętam. Jak mi się przypomni to napiszę wieczorem. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2009-03-03 21:26:14 No wiem, ale w żadnym z tych tematów nie mogłem znaleźć nic dla siebie ;/ Troll porusza się o 40. Spróbowałem żeby się poruszał o 0.5 potem to zaokrąglić i pomnożyć razy 40. Ale przy tym gra się wiesza i wywala błędy (nie kompilator). Męczę się już z tym od tygodnia i nie mogę zaradzić ;/ |
|
« 1 » 2 3 |