Autor Wątek: Poruszanie się po tej samej drodze co gracz.  (Przeczytany 1525 razy)

Offline Moriquendi

  • Użytkownik

# Lipiec 16, 2009, 11:16:27
Chciałem napisać algorytm, który by przemieszczał obiekt.
Chodzi mi o to, żeby obiekt poruszał się za bohaterem tak jak te stworki w happylandzie: http://www.youtube.com/watch?v=t4laz1l2q6s&feature=related
One robią za nim taki pociąg jak idzie, a jak stanie to stają za nim. Krócej: chodzą tą samą drogą co gracz, tylko każdy stworek z pewnym opóźnieniem zaczyna chodzić.

Pomyślałem, że najlepszym sposobem będzie umieszczanie co pewien czas waypointów. Stworek by szedł do niego,a gdyby go osiągnął szedłby do kolejnego.

Napisałem więc coś takiego:
void Dodaj_waypoint()
  {
static int zwloka = 0;
static int ktory = 0;
zwloka += dt;

if (zwloka >= 0.01){
way_point_x[ktory] = gracz.obiekt.x[0];
way_point_y[ktory] = gracz.obiekt.y[0];
ktory++;
zwloka == 0;
}
if (ktory == 200)
{
ktory = 0;
}
  }

Funkcja()
{
........
Dodaj_waypoint();
  if (podoza == true && zebrany == true)
  {
  zwloka += dt;
  if (zwloka >= 0.01)               //jeśli gracz ruszy, stworek czeka chwile i idzie
  {
  int bezwzgledna_x;      //lewo = -1, prawo = 1
  int bezwzgledna_y;      //gora = 1,dol = -1
  static int ktory = 0;
///////////////////Obiekt porusza sie w LEWO/PRAWO i GORA/DOL//////////////
  if (way_point_x[ktory] - obiekt.x[1] < 0)
  bezwzgledna_x = -1;
  else
  bezwzgledna_x = 1;
if (way_point_y[ktory] - obiekt.y[1] < 0)
bezwzgledna_y = -1;
else
bezwzgledna_y = 1;
/////////////////////////////////////////////////////////////////////////////////////
this->ruch_x = bezwzgledna_x * 350.0 * dt;
this->ruch_y = bezwzgledna_y * 350.0 * dt;

        if (obiekt.x[1] >= way_point_x[ktory] - 3 || obiekt.x[1] <= way_point_x[ktory] + 3) //obiekt znajduje sie blisko waypointu max.odleglosc 3pix
{
  if (obiekt.y[1] >= way_point_y[ktory] + 3 || obiekt.x[1] <= way_point_y[ktory] - 3)

  {
ktory++;
if (ktory == 200)
ktory = 0;
  }
}
  }
  }


No i nie działa. Wogole obiekt porusza sie w kierunku obecnej pozycji gracza, i co chwile sie zawiesza.... Nie mogę tego problemu rozwiązać :\

Offline Mr. Spam

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

Offline Syriusz

  • Użytkownik

# Lipiec 16, 2009, 11:32:57
Nie prościej by było po prostu zapamiętywać pozycje gracza w każdej klatce, np. na liście, a potem ustawiać potworki na pozycje, powiedzmy 6 - 7 klatek wstecz. Do rozwiązania zostaje sytuacja gdy gracz się zatrzyma a potem znów ruszy, aby wtedy potworki na chwile nie "przymrażało"...
« Ostatnia zmiana: Lipiec 16, 2009, 11:37:29 wysłana przez Syriusz »

Offline Moriquendi

  • Użytkownik

# Lipiec 16, 2009, 13:36:43
Nie prościej by było po prostu zapamiętywać pozycje gracza w każdej klatce, np. na liście, a potem ustawiać potworki na pozycje, powiedzmy 6 - 7 klatek wstecz. Do rozwiązania zostaje sytuacja gdy gracz się zatrzyma a potem znów ruszy, aby wtedy potworki na chwile nie "przymrażało"...

Spróbowałem zrobić jak napisałeś, ale mam jakiś błąd w kodzie. Siedzimy z bratem i nie możemy tego wyłapać.
Jak tylko gracz koliduje z obiektem to on gdzieś w bok ucieka i non stop i znika z ekranu.


//Funkcja rysująca obiekt. Wywoływana jest w każdej klatce animacji.
float pozycja_x[100];
float pozycja_y[100];

pozycja_x[numer] = gracz.obiekt.x[1];
pozycja_y[numer] = gracz.obiekt.y[1];
numer++;
if (numer == 99)
numer = 0;



  if (podoza == true && zebrany == true)
  {

numer_klatki = numer;
for (int i=0; i<5; i++)
{
 numer_klatki--;
 if (numer_klatki == -1)
numer_klatki = 99;
}
obiekt.x[0] += pozycja_x[numer_klatki];
obiekt.x[1] += pozycja_x[numer_klatki]+30;
obiekt.x[2] += pozycja_x[numer_klatki]+30;
obiekt.x[3] += pozycja_x[numer_klatki];



obiekt.y[0] += pozycja_y[numer_klatki];
obiekt.y[1] += pozycja_y[numer_klatki];
obiekt.y[2] += pozycja_y[numer_klatki]+40;
obiekt.y[3] += pozycja_y[numer_klatki]+40;


  }

Offline Syriusz

  • Użytkownik

# Lipiec 16, 2009, 14:11:10
Rozumiem że lista o której mówiłem to pozycja_|współrzędna|, numer to index pozycji na której aktualnie jest gracz, a numer klatki to pozycja ale trochę wstecz...
for (int i=0; i<5; i++)
{
 numer_klatki--;
 if (numer_klatki == -1)
numer_klatki = 99;
}
Cóż, trochę pokrętna droga do celu. Ale wygląda poprawnie...
obiekt.x[0] += pozycja_x[numer_klatki];
obiekt.x[1] += pozycja_x[numer_klatki]+30;
obiekt.x[2] += pozycja_x[numer_klatki]+30;
obiekt.x[3] += pozycja_x[numer_klatki];



obiekt.y[0] += pozycja_y[numer_klatki];
obiekt.y[1] += pozycja_y[numer_klatki];
obiekt.y[2] += pozycja_y[numer_klatki]+40;
obiekt.y[3] += pozycja_y[numer_klatki]+40;
Dlaczego dodajesz pozycje? A nie przypisujesz? Nawet jeśli gracz się zatrzyma to obiekty 2 i 3, będą się poruszały...
« Ostatnia zmiana: Lipiec 16, 2009, 14:13:12 wysłana przez Syriusz »