Autor Wątek: Wróg goniący gracza  (Przeczytany 5593 razy)

Offline Gorner

  • Użytkownik

# Grudzień 21, 2008, 22:41:27
Witam!
Męczę się już drugi dzień i nie nie wiem jak napisać aby przeciwnik gonił moją postać, macie jakieś pomysły?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline civis

  • Użytkownik

# Grudzień 21, 2008, 22:47:54
były takie tematy...

najprościej zrobić tak: gdy wróg jest na lewo od Twojej postaci, to niech idzie w prawo, i na odwrót.
if(xWrog < xPostac)xvWrog=5;

tak samo może być w pionie.

Offline Charibo

  • Redaktor

# Grudzień 21, 2008, 22:48:48
Wyznaczasz wektor od przeciwnika do postaci, normalizujesz go, a potem dodajesz do pozycji, mnozac wczesniej przez predkosc. W pseudokodzie:
Kod: (cpp) [Zaznacz]
Vec3 newEnemyDir = (playerPos - enemyPos).normalize();
enemyPos = newEnemyDir * enemySpeed;
:)

JCJ

  • Gość
# Grudzień 21, 2008, 23:02:06
Napisałem dla Ciebie skrypcik - przeanalizuj go, może zrobisz z niego gierkę(sorry, ale nei zrobiłem kolizji). Taki przykłąd w allegro. :P
Kod: (C++) [Zaznacz]
#include <allegro.h>
int main()
{
int x1=20;
int x2=50;
int y1=80;
int y2=300;
allegro_init();
install_keyboard();
set_color_depth(32);
set_gfx_mode(GFX_AUTODETECT_WINDOWED,640,480,0,0);
set_palette(default_palette);
clear_to_color(screen, makecol(255,255,255));
BITMAP *kw1=create_bitmap(30,30);
BITMAP *kw2=create_bitmap(30,30);
BITMAP *bufor=create_bitmap(640,480);
clear_to_color(kw1, makecol(100,100,100));
clear_to_color(kw2, makecol(200,200,200));
while( !key[KEY_ESC])
{
clear_to_color(bufor, makecol(255,255,255));
if(key[KEY_UP]) y1--;
if(key[KEY_DOWN]) y1++;
if(key[KEY_LEFT]) x1--;
if(key[KEY_RIGHT]) x1++;
if(x1>x2) x2++;
else if(x2>x1) x2--;
if(y1>y2) y2++;
if(y2>y1) y2--;
blit(kw1, bufor, 0, 0, x1, y1, kw1->w, kw1->h);
blit(kw2, bufor, 0, 0, x2, y2, kw1->w, kw1->h);
blit(bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h);
}
destroy_bitmap(kw1);
destroy_bitmap(kw2);
destroy_bitmap(bufor);
allegro_exit();
return 0;
}END_OF_MAIN();

Offline mihu

  • Użytkownik
    • mihu

# Grudzień 22, 2008, 01:10:39
Wyznaczasz wektor od przeciwnika do postaci, normalizujesz go, a potem dodajesz do pozycji, mnozac wczesniej przez predkosc. W pseudokodzie:
Kod: (cpp) [Zaznacz]
Vec3 newEnemyDir = (playerPos - enemyPos).normalize();
enemyPos = newEnemyDir * enemySpeed;
:)
Ewentualnie, aby osiągnąć ciekawszy efekt, możesz zrobić następująco:
Zapamiętujesz dwie kolejne pozycje obiektu śledzonego jako wektor o początku we wcześniejszej i końcu w późniejszej pozycji. Mnożysz ten wektor przez pewną X ilość klatek. Jeśli obiekt nie zmieni kierunku (i prędkości), to za owe X klatek znajdzie się dokładnie w tym punkcie. Jeśli skierujesz obiekt śledzący w ten właśnie punkt, to będzie on sprawiał wrażenie, jakby przewidywał ruch obiektu śledzonego. X musisz ustalić doświadczalnie, ewentualnie uzależniać go od stosunku prędkości obiektów i ich wzajemnej odległości.
Nie jest to oczywiście zbyt wyszukany sposób, ale daje już dość ciekawe efekty.

Offline Sethis

  • Użytkownik

# Grudzień 22, 2008, 12:06:08
Wyznaczasz wektor od przeciwnika do postaci, normalizujesz go, a potem dodajesz do pozycji, mnozac wczesniej przez predkosc.
Jak bardzo sprawdzi sie to w takim na przyklad labiryncie? ;] Jesli o mnie chodzi, to wolalbym najpierw dowiedziec sie o jakim typie gry rozmawiamy.

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Grudzień 22, 2008, 12:14:43
Po prostu możesz to zrobić na tablicy która przyjmuje wartości 0 1 2 3. Gdzie 0 nie można przejść, 1 można, 2 - pozycja gracza, 3 - pozycja AI. I wtedy co jakiś czas wykonywać algorytm szukania najkrótszej drogi do gracza. Chyba najprościej.

Offline Charibo

  • Redaktor

# Grudzień 22, 2008, 12:43:12
Wyznaczasz wektor od przeciwnika do postaci, normalizujesz go, a potem dodajesz do pozycji, mnozac wczesniej przez predkosc.
Jak bardzo sprawdzi sie to w takim na przyklad labiryncie? ;] Jesli o mnie chodzi, to wolalbym najpierw dowiedziec sie o jakim typie gry rozmawiamy.
Zupełnie dobrze się sprawdzi. Tylko wtedy, zamiast pozycji gracza, używamy najbliższej pomocy nawigacyjnej (waypointa, siatki czy czegokolwiek), do której możemy się dostać. :)

Offline Liosan

  • Moderator

# Grudzień 22, 2008, 13:17:58
Jeśli to ma być w labiryncie (niedużym) to poszperaj o algorytmie BFS - najprostsze przeszukiwanie przestrzeni jakie istnieje :) docelowo, przerobienie go na A* dobrze zadziała.

Liosan

Offline Gorner

  • Użytkownik

# Grudzień 22, 2008, 15:10:09
To będzie prosta gra 3D, sama przestrzeń, bez żadnych przeszkód i oczywiście potworki które trzeba pokonać

Offline Microprocek

  • Użytkownik

# Styczeń 26, 2009, 00:35:56
chcialbym odnosnie tej calej rozmowy cos dodac... mysle ze ten sposob z wektorami jest calkiem niezly ;] ale zastanawiam sie co macie na mysli poprzez uzycie 'normalizacji' ??? moglby to ktos jakkolwiek wyjasnic...

Offline PiOD

  • Użytkownik

# Styczeń 26, 2009, 00:44:22
Musisz znormalizować wektor żeby twoja prędkość zależała rzeczywiście od prędkości, a nie odległości od przeciwnika :)

Offline Microprocek

  • Użytkownik

# Styczeń 26, 2009, 00:53:10
hm chyba nie do konca rozumiem... czy przeciwnik ktory nas wykryje i bedzie probowal sie do nas zblizyc nie bedzie tego robil ze stala predkoscia skoro ma ja wczesnij juz nadana ??

Offline PiOD

  • Użytkownik

# Styczeń 26, 2009, 01:18:32
Na przykład w świecie 2D współrzędna x i y wektora mnożone są przez prędkość i dodawane do współrzędnych x i y położenia postaci. Jak widzisz, jeżeli nie znormalizujemy wektora to nowe położenie będzie zależne i od prędkości i od dł wektora czyli odległości do wroga.

Offline Microprocek

  • Użytkownik

# Styczeń 26, 2009, 01:26:42
no ok, mniej wiecej tak wlasnie zrobilem tyle ze narazie bez uzywania normalizacji...
ale mam taki problem... byc moze jest on banalny ale nie mam pomyslu chyba jak to rozwiazac :]
oto kod [irrlicht - C#] :

while(oknoGry.Run())
{
                Vector3D x;
// Renderuj obraz tylko gdy okno jest aktywne
if (oknoGry.WindowActive)
{
                    if (przeciwnik.Position.X < wezelKamery.Position.X + (200))
                    {
                        if (przeciwnik.Position.Y < wezelKamery.Position.Y + (200))
                        {
                            x = (wezelKamery.Position - przeciwnik.Position);
                            przeciwnik.Position += x;

rezultatem jest to ze przeciwnik zamiast do mnie podbiec od razu znajduje sie na moim miejscu... wiem ze czegos tu brakuje - moze ktos wie ???