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

AI w grze 2D RPG

Ostatnio zmodyfikowano 2009-02-26 14:20
Autor Wiadomość
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.
P-4472
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:
C/C++
void obl_zero( short int & obliczona )
{
    if( obliczona < 0 )
    {
        obliczona = - obliczona;
    }
}

//jakas tam funkcja
{
    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 - y wspolrzedne obiektu ktory ma gonic gracza
        {
            x--;
        }
        if( gracz.x > x )
        {
            x++;
        }
    }
    else
    {
        if( gracz.y > y )
        {
            y++;
        }
        if( gracz.y < y )
        {
            y--;
        }
    }
}
P-4473
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:
C/C++
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. ;/
P-4477
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.
P-4479
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
P-4481
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:
C/C++
( map[ mapa_y + troll.y - scrolling_y - 1 ][ mapa_x + troll.x - scrolling_x ] ) == 0
P-4483
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.
P-4490
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
C/C++
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
C/C++
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)
P-4492
« 1 » 2
  Strona 1 z 2 Następna strona