pankracy Opublikowano 5 Marca 2016 Udostępnij Opublikowano 5 Marca 2016 Cześć..mam taki problem... próbuje ustawić tak,że jak wróg mnie zobaczy na odpowiednim dystansie w pozycji wyłącznie x,to zaczyna mnie gonić aż zejdę z jego dystansu,a jak już zejdę z jego dystansu,to on wraca np do punktu początkowego tam gdzie mnie ostatnio widział i chodzi dalej spokojnie...I żeby nie skakał jak mnie goni. Zacząłem tu w kodzie grzebać,ale coś spierdzieliłem..ostatecznie udało mi się zrobić,że jak mnie zobaczył to gonił,ale już nie przestał mnie gonić... pomóżcie:/ GML ///Poruszanie sie ///AI wroga //wrog na odpowiednim dystansie jak nas zauwazy,to zaczyna gonic if distance_to_object(obj_player) <=80 { if(abs(y-obj_player.y)<32) && (obj_player.y>=y) move_towards_point(obj_player.x,obj_player.y,8); } else { if distance_to_object(obj_player) > 40 { move_towards_point(obj_player.x,y,0); } } if place_free(x,y+1) {gravity = 0.5} else {gravity = 0} if at=1 { at=2 speed=4 } if at=2 { if hspeed<0 { image_xscale = -1; if !place_meeting(x-30,y+10,par_podloze) speed*=-1 else if place_meeting(x-1,y,par_podloze ) speed*=-1 t=1 } else if hspeed>0 { image_xscale = 1; if !place_meeting(x+30,y+10,par_podloze) speed*=-1 else if place_meeting(x+1,y,par_podloze) speed*=-1 t=2 } } //Smierc wroga if hp<0 instance_destroy() // image_speed=0.5 // if hp<0 { instance_destroy() } //animacja image_speed=0.3 //Gdy wrog zostaje atakowany mruga if global.zegarObrazenWroga > 0 { visible = !visible; global.zegarObrazenWroga -= 1; } else { visible = true; } if hp <= 0 { instance_destroy(); dead = true; //wywolujemy alarm gdy wrog jest martwy //tworzymy losowa ilosc punktow po zabiciu wroga,oraz napis,ktory sie nad nim wyswietla z iloscia punktow losowych z = instance_create(x,y-10,obj_floating_txt); global.pScore+=pointvalue z.txt = "$" + string(pointvalue); z.yspeed = -4; with instance_create(x,y,obj_entity_die) with instance_create(x,y,obj_czupryniak_ginie) { image_xscale = other.image_xscale; image_yscale = other.image_yscale; hspd = other.hspd; vspd = other.vspd; audio_play_sound(dzwiek_wrog_ginie, 1, false); //odtwarzamy dzwiek przy smierci wroga } } // czasowy wskrzeszenie wroga po smierci if (dead == true) { instance_create(x,y,obj_spawn_czupryniak); } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Sutikku Opublikowano 5 Marca 2016 Udostępnij Opublikowano 5 Marca 2016 Nie czaję twojego kodu, to powiem Ci jak ja bym to zrobił. Każdy obiekt ma zmienną xstart i ystart. Wykorzystajmy ją do warunków. Najpierw sprawdzamy czy gracz jest na dystansie który on pokonuje. Ustalmy sobie m_dist=200; GML if(point_distance(xstart,0,obj_player.x,0) <= m_dist) //costam</span></span> Tam gdzie jest y1 i y2, dałem 0, bo ignorujemy y (w sumie to wystarczy odjąć x ale csii) I teraz dokańczamy ten kod GML if(point_distance(xstart,0,obj_player.x,0) <= m_dist) { move_towards_point(obj_player.x,y,2); } else if(distance_to_point(xstart,ystart)>2) move_towards_point(xstart,ystart,1); Jakoś tak. W ogóle o co chodzi z tym kodem ;o GML with instance_create(x,y,obj_entity_die) with instance_create(x,y,obj_czupryniak_ginie) Masz with, w with, nawet nie chce wiedzieć jak wtedy other działa. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pankracy Opublikowano 5 Marca 2016 Autor Udostępnij Opublikowano 5 Marca 2016 Nie czaję twojego kodu, to powiem Ci jak ja bym to zrobił. Każdy obiekt ma zmienną xstart i ystart. Wykorzystajmy ją do warunków. Najpierw sprawdzamy czy gracz jest na dystansie który on pokonuje. Ustalmy sobie m_dist=200; GMLif(point_distance(xstart,0,obj_player.x,0) <= m_dist) //costam Tam gdzie jest y1 i y2, dałem 0, bo ignorujemy y (w sumie to wystarczy odjąć x ale csii) I teraz dokańczamy ten kod GMLif(point_distance(xstart,0,obj_player.x,0) <= m_dist) { move_towards_point(obj_player.x,y,2); } else if(distance_to_point(xstart,ystart)>2) move_towards_point(xstart,ystart,1); Jakoś tak. W ogóle o co chodzi z tym kodem ;o GML with instance_create(x,y,obj_entity_die) with instance_create(x,y,obj_czupryniak_ginie) Masz with, w with, nawet nie chce wiedzieć jak wtedy other działa. Czyli brakowało mi funkcji point_distance,dzięki... Co do with to działa bardzo dobrze chociaż faktycznie patrząc teraz na mój kod,to bez sensu jest powtórzenie tego... No dobra i ostatnie pytanie... chciałem wykorzystać image_alpha żeby osiągnąć efekt pojawiającego się wroga i zanikającego...O co dokładnie chodzi,a no o to,że wróg sobie spaceruje i co jakiś czas zanika prze chwilę,a potem znowu się pojawia...czyli zanika spacerując sobie... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Sutikku Opublikowano 5 Marca 2016 Udostępnij Opublikowano 5 Marca 2016 Jak chcesz mieć to tak płynnie, to polecam alarmy, albo coś takiego jak właśnie zmienna niewidka i ociupinkę matematyki. Zmodyfikujmy tamten kod. GML if(point_distance(xstart,0,obj_player.x,0) <= m_dist) { move_towards_point(obj_player.x,y,2); niewidka--; if(niewidka<0) niewidka=0; } else if(distance_to_point(xstart,ystart)>2) { move_towards_point(xstart,ystart,1); niewidka++; if(niewidka>100) niewidka=100; } image_alpha=(niewidka+1)/100; Nie jestem pewien czy to zadziała. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pankracy Opublikowano 5 Marca 2016 Autor Udostępnij Opublikowano 5 Marca 2016 Jak chcesz mieć to tak płynnie, to polecam alarmy i ociupinkę matematyki. Zmodyfikujmy tamten kod. GMLif(point_distance(xstart,0,obj_player.x,0) <= m_dist) { move_towards_point(obj_player.x,y,2); niewidka--; if(niewidka<0) niewidka=0; } else if(distance_to_point(xstart,ystart)>2) { move_towards_point(xstart,ystart,1); niewidka++; if(niewidka>100) niewidka=100; } image_alpha=1/niewidka; Nie jestem pewien czy to zadziała. dzięki Suttiku po testuje to na alarmach;) co do chodzenia wroga to prawie jest dobrze,tylko w pozycji Y nie chce żeby mi go wykrywał,bo obecnie wykrywa i jak mnie już zobaczy,to jak szalony biega dopóki mu nie zejdę z pozycji Y,a chce żeby Y ignorował całkiem;) GML if(point_distance(xstart,0,obj_player.x,0) <= 250) { if(abs(y-obj_player.y)<32) && (obj_player.y>=y) move_towards_point(obj_player.x,y,5); } else if(distance_to_point(xstart,ystart)>2) move_towards_point(xstart,ystart,2); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się