Autor Wątek: Przechodzenie na kolejne platformy  (Przeczytany 2152 razy)

Offline Moriquendi

  • Użytkownik

# Czerwiec 13, 2009, 16:33:07
Napisałem "AI" przeciwnika gracza, który chodzi w kółko po platformie.
Kiedy dochodził do lewego końca platformy skręcał w prawi i vice versa.

Wszystko pięknie działało dopóki nie połączyłem kilku platform. Chciałbym żeby przeciwnik przechodził z jedną na drugą jeśli nie ma między nimi przerw. Napisałem coś takiego:

void kolizja_wrog_platforma()
{
float ruch = 2.102 *dt;
bool moze_przejsc = false;
  for (int j=0; j<wrogow; j++) //pętla, ktora liczy kolizje 'gracz - każdy obiekt platformy'
  {
  moze_przejsc = false;

  for (int i=0; i < platforma12; i++)
  {
  if (wrog1[j].zwrot == 0)
  {
if (wrog1[j].obiekt.y[0] >= platforma1[i].obiekt.y[0] && wrog1[j].obiekt.y[0] <= platforma1[i].obiekt.y[3]
&& wrog1[j].obiekt.x[0]-ruch >= platforma1[i].obiekt.x[0]
&& wrog1[j].obiekt.x[0]-ruch <= platforma1[i].obiekt.x[1])
moze_przejsc = true;
  }
  if (wrog1[j].zwrot == 1)
  {
if (wrog1[j].obiekt.y[0] >= platforma1[i].obiekt.y[0] && wrog1[j].obiekt.y[0] <= platforma1[i].obiekt.y[3]
&& wrog1[j].obiekt.x[1]+ruch >= platforma1[i].obiekt.x[0]
&& wrog1[j].obiekt.x[1]+ruch <= platforma1[i].obiekt.x[1])
moze_przejsc= true;
  }
  }
  if (moze_przejsc== false)
  {
if (wrog1[j].zwrot == 1)
  wrog1[j].zwrot = 0;
if (wrog1[j].zwrot == 0)
  wrog1[j].zwrot = 1;
  }    
  }
}
Każdy obiekt "wroga" ma przypisane współrzędne 4 wierzchołków w postaci tablicy x[4], y[4]. To samo z platformami.

Ten kod już zmieniałem, przekształcałem ileś razy i za każdym razem nie coś nie wychodzi.
Kiedy używam powyższego kodu to przeciwnicy wogóle nie zawracają.

Prosiłbym o pomoc, bo już trzeci dzień nad tym siedzę i każdy pomysł na algorytm kończy się fiaskiem ;P

Edit:
Algorytm mniej więcej działa tak.
Sprawdza czy wrog jest w "środku" jakiejkolwiek platformy. Jeśli tak to może iść dalej. Jeśli nie to znaczy, że musi zawrócić.
Powiedzieć łatwo, ale napisać działający kod trudniej xP ;D
« Ostatnia zmiana: Czerwiec 13, 2009, 16:40:37 wysłana przez Moriquendi »

Offline Mr. Spam

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

Offline Moriquendi

  • Użytkownik

# Czerwiec 13, 2009, 21:43:12
Hmm...problem chyba rozwiązałem. Przynajmniej na razie działa wszystko jak należy  ;D
Poprawiłem to:
  if (moze_przejsc== false)
  {
if (wrog1[j].zwrot == 1)
  wrog1[j].zwrot = 0;
if (wrog1[j].zwrot == 0)
  wrog1[j].zwrot = 1;
  }
na to:
  if (moze_przejsc== false)
  {
if (wrog1[j].zwrot == 1)
  wrog1[j].zwrot = 0;
else if (wrog1[j].zwrot == 0)
  wrog1[j].zwrot = 1;
  }
??? ??? ??? Szczerze mówiąc nie rozumiem, jak tutaj jedno else if zamiast if pomogło :|

Offline Pastan

  • Użytkownik
    • BaseWeb.pl

# Czerwiec 13, 2009, 21:53:53
]if (wrog1[j].zwrot == 1)
wrog1[j].zwrot = 0;
if (wrog1[j].zwrot == 0)
      wrog1[j].zwrot = 1;
 

Sprawdzasz czy zwrot == 1, potem  ustawiasz go na 0 a potem jeszcze raz sprawdzasz czy zwrot == 0 i ustawiasz na 1. :P

Offline Moriquendi

  • Użytkownik

# Czerwiec 13, 2009, 22:45:10
]if (wrog1[j].zwrot == 1)
wrog1[j].zwrot = 0;
if (wrog1[j].zwrot == 0)
      wrog1[j].zwrot = 1;
 

Sprawdzasz czy zwrot == 1, potem  ustawiasz go na 0 a potem jeszcze raz sprawdzasz czy zwrot == 0 i ustawiasz na 1. :P
;D ;D ;D ;D Ale wstyyyyd  ;D Taki błąd  ;D

Offline counterClockWise

  • Użytkownik

# Czerwiec 20, 2009, 16:43:16
]if (wrog1[j].zwrot == 1)
wrog1[j].zwrot = 0;
if (wrog1[j].zwrot == 0)
      wrog1[j].zwrot = 1;
 

Sprawdzasz czy zwrot == 1, potem  ustawiasz go na 0 a potem jeszcze raz sprawdzasz czy zwrot == 0 i ustawiasz na 1. :P

Jeżeli tam miał być else, to w ogóle da się jedną linijką:
wrog1[i].zwrot = (wrog1[i].zwrot + 1) % 2;

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 20, 2009, 18:04:14
Jeżeli tam miał być else, to w ogóle da się jedną linijką:
wrog1.zwrot = (wrog1.zwrot + 1) % 2;
Można prościej:
zwrot = !zwrot;
Albo krócej:
zwrot ^= 1;

Offline Kos

  • Użytkownik
    • kos.gd

# Czerwiec 20, 2009, 19:55:37
Albo krócej:
zwrot ^= 1;
Gdyby C++ był konsekwentnym językiem, to zapewne działałoby też bardzo ładne:
zwrot === 0;Ale niestety, mimo że operator^ ma swojego brata ^=, a + ma +=, to == nie ma swojego odpowiednika w postaci === :-)

Offline bananu7

  • Użytkownik
    • komiks RFMN

# Czerwiec 28, 2009, 10:57:25
Tylko, że wtedy operator np. +=/=^=== miałby jak najbardziej sens ;D

Offline BrutalComputer

  • Użytkownik

# Czerwiec 28, 2009, 13:15:51
To już wiemy, co powinno się znaleźć w następnej wersji C++  8-B

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 28, 2009, 15:12:12
Cytuj
Gdyby C++ był konsekwentnym językiem, to zapewne działałoby też bardzo ładne:
zwrot === 0;

Ale niestety, mimo że operator^ ma swojego brata ^=, a + ma +=, to == nie ma swojego odpowiednika w postaci === :-)
W takim wypadku operator "a == b" musiałby być interpretowany jako "a = (a = b)". ;) Podobnie operatory <= i >=.