Skocz do zawartości

Zablokowane Losowe (SPEŁNIAJĄCE WARUNEK) miejsce .


Cekol

Rekomendowane odpowiedzi

Mam takiego problemsa. chciałbym zrobić sobie system "uciekania potwora" do mojej gierki, ale napotkałem na problem. Wiem że można zrobić taką pętlę która się skończy jak zostanie spełniony warunek w pętli :P czyli np:

  while (!place_free(x,y))
  {
    x = random(room_width);
    y = random(room_height);
  }

Jest to tak długa pętla ,aż będzie wolne miejsce w "x" i "y"

Więc ja wpadłem na pomysł aby zrobić "Losowanie położenia" w którym Linia Wykrywająca kolizję między sobą a losowym punktem nie dotykała żadnego murku a linia między graczem a losowym punktem dotykała murku. więc wykombinowałem cuś takiego:

 

  while (collision_line(x,y,x_point,y_point,o_map,1,1) && !collision_line(o_player.x,o_player.y,x_point,y_point,o_map,1,1) )
  
  {
   x_point = random(room_width);
   y_point = random(room_height)
  }

lecz to nie działa :( wybiera jakieś miejsce nie na temat :P Czy wiecie jak to uczynić co chciałem osiągnąć?

 

PS: skrypt powyżej jest w stepie robaka który ma uciekać.

Czekam na odp :)

Odnośnik do komentarza
Udostępnij na innych stronach

ekhm...

Linia Wykrywająca kolizję między sobą a losowym punktem nie dotykała żadnego murku

i

(collision_line(x,y,x_point,y_point,o_map,1,1) // a gdzie "!"

To samo z:

linia między graczem a losowym punktem dotykała murku

i

!collision_line(o_player.x,o_player.y,x_point,y_point,o_map,1,1) // wywal "!"
Odnośnik do komentarza
Udostępnij na innych stronach

Cekol, a może ludzie po prostu nie rozumieją/nie znają odpowiedzi?

A co do kodu, to czy nie powinno być trochę na odwrót?

do
{x_point = random(room_width);
y_point = random(room_height);}
until
(collision_line(x,y,x_point,y_point,o_map,1,1) && !collision_line(o_player.x,o_player.y,x_point,y_point,o_map,1,1) )

Odnośnik do komentarza
Udostępnij na innych stronach

Musisz rozbudować ten skrypt o kolejne warunki...

Samo to, że zmieni pozycję docelową na podstawie "gdy nie ma kolizji pomiędzy graczem a punktem" i "gdy jest, jeżeli pomiędzy robalem a punktem w linii prostej jest kolizja" nie wystarczy <_< Może przecież dojść do sytuacji, że pomiędzy graczem a punktem i robalem a punktem odbędzie się kolizja, albo w ogóle się nie odbędzie. Jeżeli rzeczywiście wybierał Ci śmiechu warte miejsca, to pewno to były jakieś super oddalone punkty na mapie. Polecam ci zrobić na każdej planszy kilka "path pointów" (parę zmiennych o określonej wartości "pozorujących" x i y, których obecność będzie sprawdzana podobnym warunkiem, ale będą się one znajdować w przemyślanych miejscach co jakąś odległość. Potem wystarczy spróbować dać pętlą, że:

1) Sprawdza (Twoim warunkiem) kolizję pomiędzy tymi wszystkimi "path pointami"...

2) Wybiera potem ten najbliższy spełniający Twój warunek (wprowadzasz nowy po spełnieniu while)

3) Robal idzie do tego najbliższego punktu, spełniającego wszystkie warunki...

 

Mógłbym Ci to napisać, ale ja też mam życie osobiste. :P (czyli mi się nie chce xP ) Poza tym na pewno sobie poradzisz...

 

ekhm...

QUOTE

Linia Wykrywająca kolizję między sobą a losowym punktem nie dotykała żadnego murku

i

QUOTE

(collision_line(x,y,x_point,y_point,o_map,1,1) // a gdzie "!"

Dobrze ma! On sprawdza, czy dochodzi do kolizji niekorzystnej dla robala...

 

do

{x_point = random(room_width);

y_point = random(room_height);}

until

(collision_line(x,y,x_point,y_point,o_map,1,1) && !collision_line(o_player.x,o_player.y,x_point,y_point,o_map,1,1) )

Warunek lepszy, ale tak czy siak będzie mu wybierał jakieś kosmiczne miejsca...

Odnośnik do komentarza
Udostępnij na innych stronach

co ty Adster gadasz? :) Narysuj to sobie na kartce:

1. Zaznacz 3 punkty: L - losowy punkt, R - robal, P - gracz

2. Połącz punkty (R z L oraz P z L)

3. Narysuj kwadracik (o_map) na odcinku LP

4. Przeanalizuj

Cekolowi chodzi o to, aby potwór podążał do miejsca gdzie gracz nie będzie go widział!

Odnośnik do komentarza
Udostępnij na innych stronach

Ja bym usunął warunek, że robal musi widzieć ten punkt. Po co? Wystarczy, że gracz go nie widzi (punktu)...

 

@Matt-No...mój błąd, ale czasami konstrukcja planszy może spowodować, że z tym wg mnie niepotrzebnym warunkiem robak będzie szedł w jakieś kosmiczne miejsca, które są np. bardzo blisko lub kompletnie nieopłacalne jako kryjówka, a tak gdzieś się schowa na za kilkoma murami... (nie chodziło mi o kosmiczne miejsca gdzieś daleko na planszy, tylko takie bezsensowne :) )

 

Poza tym ciągłe losowanie pozycji jest bardzo wolne...

Odnośnik do komentarza
Udostępnij na innych stronach

Ale!

zrobiłem cuś takiego:

if !collision_line(o_player.x,o_player.y,x_point,y_point,o_map,1,1)
{
do
{x_point = random(room_width);
y_point = random(room_height);}
until
(collision_line(o_player.x,o_player.y,x_point,y_point,o_map,1,1) && !collision_line(x,y,x_point,y_point,o_map,1,1))
}

i działa! XD

Dzięki chłopaki xD

Odnośnik do komentarza
Udostępnij na innych stronach

while (collision_line(x,y,x_point,y_point,o_Mur,1,1)) || !(collision_line(o_Gracz.x,o_Gracz.y,x_point,y_point,o_Mur,1,1))
{
x_point = random(room_width);
y_point = random(room_height);
}

Krócej...

 

Adster, jednak miałeś racje: pętla powinna być wykonywana dotąd, dopóki będą spełnione warunki.

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...