Skocz do zawartości

Problem zobracającym się wrogiem,kiedy zobaczy bohatera


Cygnus

Rekomendowane odpowiedzi

Cześć wszystkim mam taki problem...

Otóż robię proste AI no i kiedy jestem blisko wroga,to wszystko ładnie działa..zaczyna mnie gonić na odpowiednią odległość,potem jak się oddalam,to się uspakaja i spokojnie sobie chodzi,ale nie chce się obrócić i goni mnie tyłem,chyba,że nie jestem plecami do niego,wtedy goni mnie normalnie.

Próbowałem już różnych sposobów i się zatrzymałem jak go obrócić co jest nie tak?

 

o to kod obj_wroga

 

STEP

 

GML
///Ruch wroga

if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if distance_to_object(obj_player) < 90

{

point_direction(x,y,obj_player.x,obj_player.y)

direction=point_direction(x,y,obj_player.x,obj_player.y)

speed=7

}

else

{

speed=0

}

 

Game Maker studio Pro

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 78
  • Dodano
  • Ostatniej odpowiedzi

Top użytkownicy w tym temacie

Top użytkownicy w tym temacie

No bo Ty ustawiasz image_xscale w zależności od wolnej przestrzeni. Sprawdzaj po której stronie jest gracz, a względem tego dostosuj image_xscale. Kierunek do gracza możesz najprościej sprawdzić poprzez porównywanie x.

Odnośnik do komentarza
Udostępnij na innych stronach

Już ogarnąłem zrobiłem tak i działa;)

 

 

w STEP wroga

 

 

GML
///AI wroga

if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if(!collision_line(x, y, obj_player.x, obj_player.y,true, true) && distance_to_object(obj_player) < 90)

{

if (obj_player.x<x) image_xscale = -1 else image_yscale = 1 // Obraca sie w lewo lub prawo w zaleznosci od X bohatera.

move_towards_point(obj_player.x,y,1);

speed=5

}

else

{

speed=0

}

 

 

 

ładnie się obraca teraz jak mnie wróg zlokalizuje i goni na odpowiedni dystans...tylko teraz ciekawi mnie jedna rzecz,jak jestem blisko krawędzi platformy,to on może np nie zdążyć wyhamować i spadnie wróg,,co zrobić? bo jak w połowie trasy mnie goni to jest wszystko dobrze zdąży zahamować jak mu z pola widzenia zniknę,ale jak jestem już na krawędzi i on przybiegnie a ja gdzieś na następną przeskoczę,to wróg już może nie wrobić i spaść na dół.

 

hmmm..albo może zrobić tak,że on jak mnie zobaczy,to goni,ale jak widzi,że jest krawędź platformy to staje w miejscu na moment i potem się obraca w drugim kierunku...to by rozwiązało problem tego,że wyrobiłby się na końcu platformy i zatrzymał po czym obrócił się i spokojnie już szedł w drugą stronę.

Odnośnik do komentarza
Udostępnij na innych stronach

A jednak jest jeszcze mały bug,który zlokalizowałem...

 

z prawej strony jak idę bohaterem a wróg jest plecami do mnie odwrócony ,to jak mnie namierzy,to bezproblemowo obraca się w prawą stronę do mnie i mnie goni..Natomiast jak przeskoczę na drugą stronę na lewą i wróg będzie plecami do mnie po lewej stronie,to się nie obraca i plecami tyłem do mnie biegnie jak mnie zobaczy:/

 

Kurcze co jeszcze jest tu nie tak

 

step mojego wroga

 

GML
//AI wroga

if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if(!collision_line(x, y, obj_player.x, obj_player.y,true, true) && distance_to_object(obj_player) < 90)

{

if (obj_player.x<x) image_xscale = -1 else image_yscale = 1 // Obraca sie w lewo lub prawo w zaleznosci od X bohatera.

move_towards_point(obj_player.x,y,1);

speed=5

}

else

{

speed=0

}

Odnośnik do komentarza
Udostępnij na innych stronach

Zdecyduj się która czynność ma kontrolować kierunek obrotu.

Albo:

 

GML
if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

Albo

GML
if (obj_player.x<x) image_xscale = -1 else image_yscale = 1 // Obraca sie w lewo lub prawo w zależności od X bohatera.

 

A jeżeli potrzebujesz oba, musisz zrobić jakiś controller, kiedy który ma obowiązywać.

Odnośnik do komentarza
Udostępnij na innych stronach

Zdecyduj się która czynność ma kontrolować kierunek obrotu.

Albo:

 

GML
if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

Albo

GML
if (obj_player.x<x) image_xscale = -1 else image_yscale = 1 // Obraca sie w lewo lub prawo w zależności od X bohatera.</span></span>

 

A jeżeli potrzebujesz oba, musisz zrobić jakiś controller, kiedy który ma obowiązywać.

 

 

Jasiu potrzebuje te dwa.Ok obj controler tylko co w nim.ma byc dokladnie??

Pomóż;-)

 

Jasiu potrzebuje te dwa.Ok obj controler tylko co w nim.ma byc dokladnie??

Pomóż;-)

 

 

Chodzi o to,zeby to normalnie dzialalo,bo z jednej strony jak jest plecami do mnie,to odwraca sie wrog do mnie i mnie goni,czyli jest ok,ale z drugiej strony,gdy jest plecami do mnie to nieodwraca sie,tylko tylem mnie goni,i to chce naprawic..Sposob obojetny.

Odnośnik do komentarza
Udostępnij na innych stronach

Mnie jeszcze zastanawia to:

GML
move_towards_point(obj_player.x,y,1);

speed=5

}

else

{

speed=0

}

 

Move_towards point a speed to zupełnie dwie inne rzeczy. Czemu najpierw używasz funkcji, w której wyznaczasz kierunek za pomocą określonego x i y, a potem zmienną, która idzie w kierunku w którym jest direction?

Odnośnik do komentarza
Udostępnij na innych stronach

Mnie jeszcze zastanawia to:

GML
move_towards_point(obj_player.x,y,1);

speed=5

}

else

{

speed=0

}

 

Move_towards point a speed to zupełnie dwie inne rzeczy. Czemu najpierw używasz funkcji, w której wyznaczasz kierunek za pomocą określonego x i y, a potem zmienną, która idzie w kierunku w którym jest direction?

 

 

Czyli rozumiem ze ta funkcja wszystko psuje? Wobec tego jaka inna funkcja zastapic move_towards_point???

Odnośnik do komentarza
Udostępnij na innych stronach

Trudno zeby dzialalo skoro w jednym stepie najpierw zmieniasz xscale na -1 a zaraz potem na 1, jak po obu stronach ma miejsce. Wsadz to w warunki i po klopocie. Cos w stylu

GML
//step wroga

if (distance_to_object(obj_player) < 90)

{

if (place_free(x+32,y+3) && obj_player.x>x)

{

image_xscale = -1;

move_towards_point(obj_player.x,obj_player.y,5);

}

else if (place_free(x-32,y+3) && obj_player.x<x)

{

image_xscale = 1;

move_towards_point(obj_player.x,obj_player.y,5);

}

}

//else jakies tam ai spacerowania sobie, ew wracania do punktu poczatkowego</span>

 

Tyle, a nie jakies bawienie sie w move_towards_point ze speedem 0 :rolleyes:

To jest platformowka, widok od gory, czy cos pomiedzy?

 

Ogolnie to gdzie sie wszyscy podziali? Forum sprawia wrazenie martwego :unsure: Czyzby hype na GMa gdzies zniknal na rzecz popularniejszych jezykow/gotowych silnikow?

 

EDIT: Ah, pomylilem sie na samym poczatku, tam ma byc distance_to_object(obj_player) < 90, poprawione :)

Odnośnik do komentarza
Udostępnij na innych stronach

Trudno zeby dzialalo skoro w jednym stepie najpierw zmieniasz xscale na -1 a zaraz potem na 1, jak po obu stronach ma miejsce. Wsadz to w warunki i po klopocie. Cos w stylu

GML
//step wroga

if (distance_to_object(obj_player) > 90)

{

if (place_free(x+32,y+3) && obj_player.x>x)

{

image_xscale = -1;

move_towards_point(obj_player.x,obj_player.y,5);

}

else if (place_free(x-32,y+3) && obj_player.x<x)

{

image_xscale = 1;

move_towards_point(obj_player.x,obj_player.y,5);

}

}

//else jakies tam ai spacerowania sobie, ew wracania do punktu poczatkowego</span></span></span>

 

Tyle, a nie jakies bawienie sie w move_towards_point ze speedem 0 :rolleyes:

To jest platformowka, widok od gory, czy cos pomiedzy?

 

Ogolnie to gdzie sie wszyscy podziali? Forum sprawia wrazenie martwego :unsure: Czyzby hype na GMa gdzies zniknal na rzecz popularniejszych jezykow/gotowych silnikow?

 

 

Dzieki M@ti sprawdze to,tak to jest platformowka;-)

 

Niestety w tym zmodyfikowanym kodzie od Ciebie on się wcale nie odwraca idzie wróg przed siebie i spada ot jest gdzieś błąd..

 

Tak jeszcze zrobiłem...

 

ale dalej ten problem,że jak z prawo ide do wroga,a on jest do mnie plecami odwrócony,to jak mnie zlokalizuje,to się odwróci i goni,to jest ok,ale jak idę w lewo i wróg jest plecami do mnie,to się nie chce subaniec odwrócić,tylko plecami mnie goni:/

 

 

STEP wroga

 

GML
///AI wroga

if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if(!collision_line(x, y, obj_player.x, obj_player.y,true, true) && distance_to_object(obj_player) < 90)

{

if (obj_player.x<x) image_xscale = -1 else image_yscale = 1 // Obraca sie w lewo lub prawo w zaleznosci od X bohatera.

point_direction(x,y,obj_player.x,obj_player.y)

direction=point_direction(x,y,obj_player.x,obj_player.y)

speed=5

}

else

{

speed=0

}

 

Dobra udało mi się rozwiązać problem obracania się wroga w momencie zlokalizowania mnie przez niego

 

tu kod

 

step wroga

 

GML
///AI wroga

if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if(!collision_line(x, y, obj_player.x, obj_player.y,true, true) && distance_to_object(obj_player) < 90)

{

if (obj_player.x<x) image_xscale = -1 else if (obj_player.x>x)image_xscale = 1 // Obraca sie w lewo lub prawo w zależności od X bohatera.

point_direction(x,y,obj_player.x,obj_player.y)

direction=point_direction(x,y,obj_player.x,obj_player.y)

speed=5

}

else

{

speed=0

}

 

 

Tylko parę mankamentów

1.co zrobić,że jak goni mnie wróg i ja skacze,żeby on też nie skakał..bo głupio to wygląda...

2.czasem jak się za mocno rozpędzi to może nie zdążyć wyhamować na krawędzi platformy jak mnie goni...Co z tym zrobić?

3.co zrobić ,że jak mnie zobaczy,no to nie goni mnie,a np zatrzymuje się i strzela ,i jak zniknę mu z pola widzenia,to wraca tam,gdzie mnie wcześniej widział

 

Połączyłem Twoje posty. Używaj proszę opcji "Edytuj" zamiast pisać kilka pod rząd.

Maximal

Odnośnik do komentarza
Udostępnij na innych stronach

Skoro to platformowka, to nie widze sensu w robieniu tego na direction. Jak dla mnie lepiej to zrobic tak:

Wrog sprawdza, gdzie jest bohater (a jak masz juz zrobione obracanie sprita, to mozna wykorzystac xscale do tego), czyli cos takiego dac zamiast direction i speed:

GML
if (place_free(x+image_xscale*5,y)) x+=image_xscale*5;
Nie bedzie wtedy "skakal" bo bedzie szedl w strone bohatera tylko w osi x.

Co do drugiego pytania to nie widze nigdzie w kodzie wykrywania konca platformy, ale mozna to zrobic tak:

GML
if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,obj_Platforma)) x+=image_xscale*5;
W miejsce 32 wklep ilosc pikseli, jakie dziela punkt centralny sprita bohatera do ziemi. Kod dziala tak:

Sprawdza, czy po swojej prawej/ew lewej, zaleznie od kierunku patrzenia ma czysto, potem sprawdza, czy bedzie mial pod soba platforme, jak oba warunki sa spelnione to idzie w kierunku gracza.

Co do 3 pytania to juz ci nie podam kodu, bo nie wiem jak to dokladnie tam masz wszystko poukladane, ale tu mozesz wykorzystac warunek

GML
if !collision_line(x,y,obj_Player.x,obj_Player.y) {//akcja strzalu;}

else {xspotted=obj_Player.xprevious; yspotted=obj_Player.yprevious; //akcja dotarcia do do punktu (xspotted, yspotted)}</span>

 

A direction bedzie mozna uzyc do oddawania strzalow w gracza.

Odnośnik do komentarza
Udostępnij na innych stronach

w step dałem tak:

 

 

GML
///AI wroga

if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if(!collision_line(x, y, obj_player.x, obj_player.y,true, true) && distance_to_object(obj_player) < 90)

{

if (obj_player.x<x) image_xscale = -1 else if (obj_player.x>x)image_xscale = 1 // Obraca sie w lewo lub prawo w zaleznosci od X bohatera.

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

 

 

Działa idealnie M@ti;) dzięki za pomoc..

 

co do strzelania pokombinuje muszę stworzyć obj_strzal i nadać mu prędkość i wartość..

 

Ok to jeszcze M@ti jak zrobić,żeby wróg się zatrzymał jak nas zobaczy w określonej odległości,a jak odejdziemy z pola widzenia,to zacznie się zachowywać jak wcześniej..

Odnośnik do komentarza
Udostępnij na innych stronach

To niech wróg jak mnie zlokalizuje,niech się zatrzyma i strzela do mnie,i obojętnie z jakiej strony go podejdę,czy z lewej,czy z prawej niech strzela do mnie,a jak się oddale z Jego pola widzenia,to niech z powrotem grzecznie sobie spaceruje;)

 

strzelający obiekt już stworzyłem czyli obj_laserek

i w create dałem tak

 

GMLimage_speed = 0.15;

hspeed = (-10);

hspeed = (10);

 

Bo chce żeby wróg strzelał z lewej strony jak jest w lewo do mnie zwrócony,i z prawej strony jak jest do mnie zwrócony..

 

Tutaj zmodyfikowałem kod wroga drugiego ,teraz co zrobić żeby zatrzymał mnie jak mnie zobaczył i strzelał w konkretnym kierunku,czyli w moim,bo teraz to na odwal strzela,raz w lewo raz w prawo..

 

w stepie wroga dałem

 

GML
if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

image_angle = direction;

if distance_to_object(obj_player)<90

{

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

strzal = 0;

alarm[0] = room_speed * 0.2;

}

}

 

w Create dałem

 

GML
strzal = 1;

 

i Alarm 0 dałem

 

GML
strzal = 1;
Odnośnik do komentarza
Udostępnij na innych stronach

GML
[STEP]

if distance_to_object(obj_player)<90 && !collision_line(x,y,obj_player.x,obj_player.y)

{

if obj_player.x>x image_xscale=1;

else image_xscale=-1;

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

i.direction = point_direction(i.x,i.y,obj_player.x,obj_player.y); //ew i.hspeed=image_xscale*10; jak ma strzelac tylko w poziomie, niezaleznie od wysokosci bohatera

strzal = 0;

if alarm[0] = -1 alarm[0] = room_speed * 0.2;

}

}

else

{

if alarm[1] = -1 alarm[1] = room_speed+random(room_speed*2);

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

 

 

[ALARM 1]

image_xscale*=-1;

I wywal hspeed z create pocisku, i powinno byc wszystko ok. :)

 

O takie cos chodzilo?

Odnośnik do komentarza
Udostępnij na innych stronach

GML[sTEP]

if distance_to_object(obj_player)<90 && !collision_line(x,y,obj_player.x,obj_player.y)

{

if obj_player.x>x image_xscale=1;

else image_xscale=-1;

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

i.direction = point_direction(i.x,i.y,obj_player.x,obj_player.y); //ew i.hspeed=image_xscale*10; jak ma strzelac tylko w poziomie, niezaleznie od wysokosci bohatera

strzal = 0;

if alarm[0] = -1 alarm[0] = room_speed * 0.2;

}

}

else

{

if alarm[1] = -1 alarm[1] = room_speed+random(room_speed*2);

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

 

 

[ALARM 1]

image_xscale*=-1;

I wywal hspeed z create pocisku, i powinno byc wszystko ok. :)

 

O takie cos chodzilo?

 

Działać no działa,ale skubaniec tylko raz do mnie strzela jak mnie zobaczy,a potem jak drugi raz do niego podejdę i mnie zobaczy,to już nie strzela;) o taki on jest.No i tylko zwalnia jak mnie zobaczy i raz strzela i to jeszcze z jednej strony,a w druga jak się obrócę on się obróci,tylko idzie do mnie,a nie strzela..powinien się jeszcze zatrzymywać jak mnie zobaczy...zatrzymuje się i strzela,jak zniknę mu z pola widzenia zacznie spacerować,jak znowu mnie zobaczy zatrzymuje się i strzela o takie coś mi chodzi;)

 

o to step wroga obj_wrog1

 

GML
if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if distance_to_object(obj_player)<90 && !collision_line(x,y,obj_player.x,obj_player.y)

{

if obj_player.x>x image_xscale=1;

else image_xscale=-1;

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

i.direction = point_direction(i.x,i.y,obj_player.x,obj_player.y); //ew i.hspeed=image_xscale*10; jak ma strzelac tylko w poziomie, niezaleznie od wysokosci bohatera

strzal = 0;

if alarm[0] = -1 alarm[0] = room_speed * 0.2;

}

}

else

{

if alarm[1] = -1 alarm[1] = room_speed+random(room_speed*2);

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

 

Alarm 0

 

GML
strzal = 1;

 

Alarm 1

 

GML
image_xscale*=-1;

 

Create

 

GML
strzal = 1;

 

 

no i tu kod obj_laserek

 

create

 

GML
image_speed = 0.15;
Odnośnik do komentarza
Udostępnij na innych stronach

Działać no działa,ale skubaniec tylko raz do mnie strzela jak mnie zobaczy,a potem jak drugi raz do niego podejdę i mnie zobaczy,to już nie strzela;) o taki on jest.No i tylko zwalnia jak mnie zobaczy i raz strzela i to jeszcze z jednej strony,a w druga jak się obrócę on się obróci,tylko idzie do mnie,a nie strzela..powinien się jeszcze zatrzymywać jak mnie zobaczy...zatrzymuje się i strzela,jak zniknę mu z pola widzenia zacznie spacerować,jak znowu mnie zobaczy zatrzymuje się i strzela o takie coś mi chodzi;)

 

o to step wroga obj_wrog1

 

GMLif place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if distance_to_object(obj_player)<90 && !collision_line(x,y,obj_player.x,obj_player.y)

{

if obj_player.x>x image_xscale=1;

else image_xscale=-1;

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

i.direction = point_direction(i.x,i.y,obj_player.x,obj_player.y); //ew i.hspeed=image_xscale*10; jak ma strzelac tylko w poziomie, niezaleznie od wysokosci bohatera

strzal = 0;

if alarm[0] = -1 alarm[0] = room_speed * 0.2;

}

}

else

{

if alarm[1] = -1 alarm[1] = room_speed+random(room_speed*2);

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

 

Alarm 0

 

GMLstrzal = 1;

 

Alarm 1

 

GMLimage_xscale*=-1;

 

Create

 

GMLstrzal = 1;

 

 

no i tu kod obj_laserek

 

create

 

GMLimage_speed = 0.15;

 

Dobra udało mi się chociaż to zrobić,że wróg już strzela za każdym razem jak mnie zobaczy,czy to z lewej,czy z prawej strony,tyle,że strzela serią długą laseru,a powinien strzelać pojedynczo laserem,a nie serią,no i,żeby stał w miejscu i strzelał jak mnie zobaczy,a nie zwalniał i strzelał jak mnie widzi.

 

 

tu poprawiłem kod w stepie wroga1

 

GML
if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if distance_to_object(obj_player)<90 && !collision_line(x,y,obj_player.x,obj_player.y)

{

if obj_player.x>x image_xscale=1;

else image_xscale=-1;

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

i.direction = point_direction(i.x,i.y,obj_player.x,obj_player.y); //ew i.hspeed=image_xscale*10; jak ma strzelac tylko w poziomie, niezaleznie od wysokosci bohatera

strzal = 1;//tu wystarczyko zmienic z 0 na 1 i teraz strzela za kazdym razem jak sie zblize do niego i to z prawej,czy z lewej strony

if alarm[0] = -1 alarm[0] = room_speed * 0.2;

}

}

else

{

if alarm[1] = -1 alarm[1] = room_speed+random(room_speed*2);

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...
Dobra udało mi się chociaż to zrobić,że wróg już strzela za każdym razem jak mnie zobaczy,czy to z lewej,czy z prawej strony,tyle,że strzela serią długą laseru,a powinien strzelać pojedynczo laserem,a nie serią,no i,żeby stał w miejscu i strzelał jak mnie zobaczy,a nie zwalniał i strzelał jak mnie widzi.

 

 

tu poprawiłem kod w stepie wroga1

 

GMLif place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

if distance_to_object(obj_player)<90 && !collision_line(x,y,obj_player.x,obj_player.y)

{

if obj_player.x>x image_xscale=1;

else image_xscale=-1;

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

i.direction = point_direction(i.x,i.y,obj_player.x,obj_player.y); //ew i.hspeed=image_xscale*10; jak ma strzelac tylko w poziomie, niezaleznie od wysokosci bohatera

strzal = 1;//tu wystarczyko zmienic z 0 na 1 i teraz strzela za kazdym razem jak sie zblize do niego i to z prawej,czy z lewej strony

if alarm[0] = -1 alarm[0] = room_speed * 0.2;

}

}

else

{

if alarm[1] = -1 alarm[1] = room_speed+random(room_speed*2);

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

 

 

 

Kurcze co robię nie tak,że ten wróg nie chcę normalnie strzelać,tylko strzela jak z serią z karabinu:/

Odnośnik do komentarza
Udostępnij na innych stronach

Wnioskując z kodu on zwalnia bo:

1.Dochodzisz do niego, on cie zauważa i się zatrzymuje ale ty się oddalasz i goni cię, zatrzymuje itd.

albo

2.Zmieniasz x wroga, bawisz się speed, hspeed itp. gdzie indziej niż w przedostatniej linijce kodu który załączyłeś.

 

Jeżeli bohater porusza się wolniej niż wróg to możliwa jest pierwsza opcja, jeżeli masz jeszcze jakiś kod u wroga/wróg ma parenta to 2. Spróbuj podać więcej info.

Odnośnik do komentarza
Udostępnij na innych stronach

Wnioskując z kodu on zwalnia bo:

1.Dochodzisz do niego, on cie zauważa i się zatrzymuje ale ty się oddalasz i goni cię, zatrzymuje itd.

albo

2.Zmieniasz x wroga, bawisz się speed, hspeed itp. gdzie indziej niż w przedostatniej linijce kodu który załączyłeś.

 

Jeżeli bohater porusza się wolniej niż wróg to możliwa jest pierwsza opcja, jeżeli masz jeszcze jakiś kod u wroga/wróg ma parenta to 2. Spróbuj podać więcej info.

 

kt117

Tutaj jest cały step mojego wroga,oraz parenta jakiego ma

 

GML
///AI wroga Dino chodzi nerwowo i strzela jak nas zobaczy

 

if place_free(x+32,y+3) && image_xscale = 1

{

image_xscale = -1;

}

if place_free(x-32,y+3) && image_xscale = -1

{

image_xscale = 1;

}

image_angle = direction;

if distance_to_object(obj_player)<90

{

if obj_player.x>x image_xscale=1;

else image_xscale=-1;

if( strzal )

{

var i;

i = instance_create( x, y, obj_laserek );

i.speed = 10;

i.hspeed=image_xscale*10;

//i.direction = point_direction(i.x,i.y,obj_player.x,obj_player.y); //ew i.hspeed=image_xscale*10; jak ma strzelac tylko w poziomie, niezaleznie od wysokosci bohatera

strzal = 0;

alarm[0]=room_speed*0.2

}

}

else

{

if alarm[1] = -1 alarm[1] = room_speed+random(room_speed*2);

if (place_free(x+image_xscale*5,y) && instance_position(x+image_xscale*5,y+32,par_wall)) x+=image_xscale*5;

}

 

//naprawiamy bugujacego sie wroga przy zawracaniu

if place_meeting(x+5,y,par_wall ) && image_xscale = 1

{

image_xscale = -1;

}

if place_meeting(x-5,y,par_wall) && image_xscale = -1

{

image_xscale = 1;

}

 

 

 

 

 

 

///Ruch wroga z odwracaniem go przez obiekty dziedziczace z par_solid

if !place_meeting(x+sign(image_xscale),y-2,par_solid) {

if image_xscale > 0 {

hspd = min(hspd+sign(image_xscale),2);

} else if image_xscale < 0 {

hspd = max(hspd+sign(image_xscale),-2);

}

}

if hspd == 0 {

image_xscale *= -1;

unstick(8);

}

//Obrazenia wroga

if hurtClock > 0 {

visible = !visible;

hurtClock -= 1;

} else {

visible = true;

}

 

if hp <= 0 {

instance_destroy();

instance_create(x,y+50,choose(obj_coin,object102)) // daje losowy item np monety albo jabłuszka

with instance_create(x,y,obj_entity_die) {

sprite_index = DinoGinie; //sprite do poruszania sie wroga

image_xscale = other.image_xscale;

image_yscale = other.image_yscale;

hspd = other.hspd;

vspd = other.vspd;

}

}

 

 

tak mam parenta z wrogiem o to kod parenta;) par_entity

 

CREATE

 

GML
///Ustawienia

g = 1;

weight = 1;

multiG = 1;

f = 1;

multiF = 1;

vF = false;

hp = 999999999;

maxHp = 999999999;

vspd = 0;

vspdB = 0;

hspd = 0;

hspdB = 0;

inAir = false;

inWater = false;

 

 

 

END step

 

GML
///Fizyka

if bbox_left+sign(hspd) < 0 || bbox_right+sign(hspd) >= room_width {

hspd = 0;

x = clamp(x,x-bbox_left,room_width-1-(bbox_right-x));

}

 

if unstick(4) > 8 {

instance_destroy();

}

 

hspd += hspdB;

for(i=0;i<abs(hspd);i++) {

if solid_place(x+sign(hspd),y) {

if solid_place(x+sign(hspd),y-1) || inAir == true {

if solid_place(x+sign(hspd),y-2) || inAir == true {

hspd = 0;

} else {

x += sign(hspd);

y -= 2;

hspd -= sign(hspd)/2;

}

} else {

x += sign(hspd);

y -= 1;

hspd -= sign(hspd)/3;

}

} else {

x += sign(hspd);

 

if inAir == false && !solid_place(x,y+1) && solid_place(x,y+2) {

y += 1;

} else if inAir == false && !solid_place(x,y+2) && solid_place(x,y+3) {

if !solid_place(x,y+1) {

y += 1;

}

if !solid_place(x,y+1) {

y += 1;

}

}

}

}

hspd -= hspdB;

hspdB = 0;

 

if inWater == false {

//Tarcie

if hspd > 0 {

hspd = max(0,hspd-f*multiF);

} else if hspd < 0 {

hspd = min(0,hspd+f*multiF);

}

//Wertykalne tarcie

if vF == true {

if vspd > 0 {

vspd = max(0,vspd-f*multiF);

} else if vspd < 0 {

vspd = min(0,vspd+f*multiF);

}

}

//Grawitacja

vspd += g*multiG;

} else {

//Podwodne tarcie

hspd = lerp(hspd,0,.1);

if abs(hspd) < .2 {

hspd = 0;

}

vspd = lerp(vspd,0,.1);

if abs(vspd) < .2 {

vspd = 0;

}

}

multiF = 1;

multiG = 1;

 

inAir = true;

vspd += vspdB;

for(i=0;i<abs(vspd);i+=1) {

if solid_place(x,y+sign(vspd)) {

if vspd > 0 {

var slope = getSlopeInclination();

if slope <= -2 && slope >= -8 {

x -= 1;

hspd -= 1;

i -= 1;

} else if slope >= 2 && slope <= 8 {

x += 1;

hspd += 1;

i -= 1;

} else {

vspd = 0;

inAir = false;

}

} else {

vspd = 0;

}

} else {

y += sign(vspd);

}

}

vspd -= vspdB;

vspdB = 0;

 

if inWater != place_meeting(x,y-sprite_height/3,obj_water) {

inWater = !inWater;

if inWater == true {

vspd /= 2;

hspd /= 2;

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

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ę
  • Ostatnio przeglądający   0 użytkowników

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

×
×
  • Dodaj nową pozycję...