Cekol Opublikowano 11 Kwietnia 2007 Udostępnij Opublikowano 11 Kwietnia 2007 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 Więcej opcji udostępniania...
Cekol Opublikowano 12 Kwietnia 2007 Autor Udostępnij Opublikowano 12 Kwietnia 2007 Sorry za Doble Post ,ale ej! Oglądano razy posta: 48 Odpowiedzi: 0 Niech ktoś odpowie! Proszę! xD Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matthew Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 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 Więcej opcji udostępniania...
Dawidsu Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 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 Więcej opcji udostępniania...
Gość Adster Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 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 Więcej opcji udostępniania...
Matthew Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 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 Więcej opcji udostępniania...
Gość Adster Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 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 Więcej opcji udostępniania...
Cekol Opublikowano 12 Kwietnia 2007 Autor Udostępnij Opublikowano 12 Kwietnia 2007 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 Więcej opcji udostępniania...
Gość Adster Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 Za co? Przecież sam do tego doszedłeś? :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Cekol Opublikowano 12 Kwietnia 2007 Autor Udostępnij Opublikowano 12 Kwietnia 2007 No ale np: Mr.Dawidsu np mi powiedział żebym użył "do i until" zamiast "while" :D Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Adster Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 To się mówi: "Dzięki, Dawidsu!" :D Dobra-koniec offtopa. Nie po to jestem na gmclanie... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Matthew Opublikowano 12 Kwietnia 2007 Udostępnij Opublikowano 12 Kwietnia 2007 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi