Autor Wątek: Reakcja przeciwnika na gracza w pobliżu  (Przeczytany 2957 razy)

Offline Moriquendi

  • Użytkownik

# Czerwiec 06, 2009, 20:00:56
Nie wiem czy to się już zalicza do AI...mam nadzieję, że tak  :P
Otóż napisałem skrypt, który rusza przeciwnikami w grze. Zasada prosta. Wrog chodzi sobie w jedną stronę na platformie, a gdy ta się skończy - zawraca i idzie w drugą stronę.

Teraz chciałem jednak dodać coś takiego, że jak gracz znajdzie się na tej samej platformie to przeciwnik do niego podbiega. Wydawało mi się, że wystarczy sprawdzić czy są na tej samej wysokości, ale nie zawsze to będzie działać.


Jedynym chyba logicznym wyjściem to jest aby gracz i przeciwnik zawierał informacje na której platformie jest (numer), jednak jest to trochę niewygodne... Jest może inne wyjście?

Offline Mr. Spam

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

Offline Pastan

  • Użytkownik
    • BaseWeb.pl

# Czerwiec 06, 2009, 20:11:07
Ja bym zrobił to na takiej zasadzie.
Rysujemy pomocniczą linę od gracza do przeciwnika. Jeżeli lina się nigdzie nie przecina to znaczy, że wróg widzi gracza. Jeżeli przetnie ją jakaś ściana to znaczy, że wróg nie widzi gracza. Proste. :)

Offline Moriquendi

  • Użytkownik

# Czerwiec 06, 2009, 20:17:43
Metoda dobra, ale nie działała by gdyby między platformami była przerwa....(sytuacja 1 na rysunku)

Offline Pastan

  • Użytkownik
    • BaseWeb.pl

# Czerwiec 06, 2009, 20:19:33
To wtedy gdy wróg widzi gracza to sprawdzasz czy nie ma koniec platformy tak jak to robisz podczas poruszania. ;)

Cytuj
Otóż napisałem skrypt, który rusza przeciwnikami w grze. Zasada prosta. Wrog chodzi sobie w jedną stronę na platformie, a gdy ta się skończy - zawraca i idzie w drugą stronę.

Offline Moriquendi

  • Użytkownik

# Czerwiec 06, 2009, 20:35:49
No to on wtedy by biegł w stronę gracza, i dopiero gdy dobiegałby do końca platformy zawracałby...
Lepsze chyba rozwiązanie by było gdyby wogóle nie biegł w stronę gracza (nawet jeśli go widzi) jeśli nie może do niego dobiec....

Offline mwojt

  • Użytkownik

# Czerwiec 06, 2009, 20:54:20
to wtedy rysujesz dwie linie pomocnicze jedna sprawdza czy go widzi a druga czy jest ciągłość platformy do niego.

Offline Moriquendi

  • Użytkownik

# Czerwiec 07, 2009, 10:46:47
to wtedy rysujesz dwie linie pomocnicze jedna sprawdza czy go widzi a druga czy jest ciągłość platformy do niego.
No to wtedy bym sprawdzał czy linia znajduje się "w środku" platformy i nie wychodzi za nią.
Ale wtedy musiałbym znać 'numer' tej platformy, żeby znać jej współrzędne x....

Offline menajev

  • Użytkownik
    • Karate Inowrocław

# Czerwiec 07, 2009, 10:58:25
Twój problem wygląda trochę tak, jakbyś wiedział jak go rozwiązać, ale szukał sposobu, który wykorzysta 1 zmienną mniej, bo pamięć trzeba chronić...
Ponumeruj jakoś te platformy, sprawdzaj czy są na tej samej, jeśli tak, to linia sprawdzająca, czy droga czysta. I będzie działało.

Offline Moriquendi

  • Użytkownik

# Czerwiec 07, 2009, 11:28:50
Twój problem wygląda trochę tak, jakbyś wiedział jak go rozwiązać, ale szukał sposobu, który wykorzysta 1 zmienną mniej, bo pamięć trzeba chronić...
No bo o to głównie chodzi w programowaniu żeby pisać coraz to bardziej efektowny kod :P

Ale to kurcze, nawet gdybym ponumerował platformy to by nie rozwiązało do końca problemu. Bo co jeśli będę chciał postawić obok siebie dwie różne platformy (np. różne tekstury) to ponumerowanie platform też nic nie da. Platformy będą się stykać, ale nie będą miały tych samych numerów...

Offline Liosan

  • Moderator

# Czerwiec 07, 2009, 11:54:21
To ponumeruj platformy, ale nie wg tego iloma są platformami na mapie, tylko zupełnie oddzielnie - jeśli stanowią jedną platformę (stykają się), to mają ten sam numer, jeśli nie, to inny.

No bo o to głównie chodzi w programowaniu żeby pisać coraz to bardziej efektowny kod :P
No, fakt... tylko żeby kod był efektowny, to powinien najpierw działać ;) Zresztą, gdyby miał być efektywny, to też powinien najpierw działać :)

Liosan

Offline blizniak

  • Użytkownik

# Czerwiec 07, 2009, 12:03:56
No, fakt... tylko żeby kod był efektowny, to powinien najpierw działać ;) Zresztą, gdyby miał być efektywny, to też powinien najpierw działać :)

święte słowa :)
optymalizacja przyjdzie potem w miarę potrzeby.

w ogóle zdaje mi się, że skrypt wykonujący się mniej więcej w ten sposób:
1. szukaj przeciwnika w jakimś obszarze, a gdy znajdziesz
 1a. sprawdź czy jest na tej samej platformie
  1aa jak tak to podejdź
  1ab jak nie to nic nie rób
2. jak nie znajdziesz to łaź w stronę lewą
3 jak dojdziesz do krańca lewej to łaź w prawą
4 jak dojdziesz do krańca prawej to łaź w lewą

nie jest wcale taki trywialny. zauważ, że opisałem tylko "wolę" typowego przeciwnika, nie rozpisując w ogóle punktu 1a.
trzeba się zdecydować, albo robi się coś w prosty sposób i wtedy ma się dodatkowe zmienne i dużo hardkodu,
albo stawia się na ładne skrypty o dużych możliwościach, w których po rozpisaniu nawet prostego scenariusza okazuje się, że i tak ma on kilka (naście) podpunktów, które trzeba ze sobą zgrać..

Offline mwojt

  • Użytkownik

# Czerwiec 07, 2009, 12:36:01
Cytuj
Ale wtedy musiałbym znać 'numer' tej platformy
no to w jaki sposób sprawdzasz czy ludzik stoi na platformie ? Możesz go wirtualnie  przemieścić gdzieś w pamięci (bez rysowania) i sprawdzić czy dojdzie czy spadnie gdzieś po drodze albo napotka na ścianę.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Czerwiec 07, 2009, 12:57:07
Cytuj
No to wtedy bym sprawdzał czy linia znajduje się "w środku" platformy i nie wychodzi za nią.
Ale wtedy musiałbym znać 'numer' tej platformy, żeby znać jej współrzędne x....
Nie widzę takiej potrzeby. Masz do wykonania w sumie dwa testy:
1. Sprawdzić, czy odcinek między graczem, a przeciwnikiem jest w całości pusty.
2. Sprawdzić, czy ten sam odcinek nieco obniżony jest w całości pełny.

Jeżeli potrafisz zrobić 1 bez numerowania platform, to ten sam sposób możesz zaadaptować do 2.