Skocz do zawartości

Problem zobracającym się wrogiem,kiedy zobaczy bohatera


Cygnus

Rekomendowane odpowiedzi

  • Odpowiedzi 78
  • Dodano
  • Ostatniej odpowiedzi

Top użytkownicy w tym temacie

Top użytkownicy w tym temacie

Wystarczy te co mam...na razie skupiam się na tym co jest nie tak przy obracaniu wroga;)

 

Oddziel obrót wroga jako virtual state i jego rysowanie jako drawing state.

Jedna część jest istotna dla "fizyki" gry, druga dla wyświetlenia rezultatu.

Jak to rozdzielisz to będzie Ci łatwiej przeprowadzić obliczenia po "fizycznej" kolizji i na ich podstawie dokonać korekt przed decyzją o rysowaniu.

 

Czyli ustalisz pełny, niezgliczowany stan wroga, przeniesiesz go do stanu obliczenia grafiki wroga na tej bazie i dopiero dojdzie to to draw już poustawiane.

 

Na razie upchnąłeś w jednej sekwencji ruch i zmianę grafiki, na początku to dobre, ale na dłuższą metę jak za tydzień wymyślisz inne, lepsze sposoby, to okaże się, że masz strukturę każdego elementu w grze inną i nie możesz wymienić jednego z elementów korekty stanu bez rozpruwania kodu obiektu.

 

Po prostu oszczędzisz sobie zgrzytania zębami na później :)

Odnośnik do komentarza
Udostępnij na innych stronach

Oddziel obrót wroga jako virtual state i jego rysowanie jako drawing state.

Jedna część jest istotna dla "fizyki" gry, druga dla wyświetlenia rezultatu.

Jak to rozdzielisz to będzie Ci łatwiej przeprowadzić obliczenia po "fizycznej" kolizji i na ich podstawie dokonać korekt przed decyzją o rysowaniu.

 

Czyli ustalisz pełny, niezgliczowany stan wroga, przeniesiesz go do stanu obliczenia grafiki wroga na tej bazie i dopiero dojdzie to to draw już poustawiane.

 

Na razie upchnąłeś w jednej sekwencji ruch i zmianę grafiki, na początku to dobre, ale na dłuższą metę jak za tydzień wymyślisz inne, lepsze sposoby, to okaże się, że masz strukturę każdego elementu w grze inną i nie możesz wymienić jednego z elementów korekty stanu bez rozpruwania kodu obiektu.

 

Po prostu oszczędzisz sobie zgrzytania zębami na później :)

 

 

 

Dzięki;) Twój sposób jest całkiem ciekawy....ale zbyt skomplikowany obecnie jak dla mnie...

 

ja obecnie zrobiłem tak...

 

usunąłem część kodu z AI i tak jak myślałem if place_free powodowało błąd obracania ,kiedy wróg widział ścianę dziedziczącą z par_solid

 

teraz jeszcze pozostało mi do naprawienia obrót wroga przy krawędzi obiektu dziedziczonego z par_solid

 

czyli wróg zbliża się do krawędzi i ma zawracać,a nie spadać w dół..z tym mam problem...

 

step wroga wygląda teraz tak

 

STEP

 

GML
var stopped;

stopped=0;

 

image_angle = direction;

if distance_to_object(obj_player)<90

 

{

stopped=1

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;

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_solid)) x+=image_xscale*5;

}

 

 

 

 

//naprawiamy bugujacego sie wroga przy zawracaniu przeszkoda par_solid

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

{

image_xscale = -1;

}

if place_meeting(x-5,y,par_solid) && 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;

}

}

if (stopped)

hspd=0;

 

 

// czasowy respawn wrogow troche pomeczyles sie ale dziala jak trzeba :)

if (dead == true)

{

//obj_spawn.dead = true; //respawn zabitego wroga jak nie bedzie dzialac to wtedy dead=true i wpisac instance_create(x,y,obj_spawn)

instance_create(x,y,obj_spawn_dino);

}

Odnośnik do komentarza
Udostępnij na innych stronach

A spróbuj tego:

GML
var stopped;

stopped=0;

 

image_angle = direction;

if distance_to_object(obj_player)<90

 

{

stopped=1

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;

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_solid)) x+=image_xscale*5;

else image_xscale*=-1;

}

 

 

 

 

//naprawiamy bugujacego sie wroga przy zawracaniu przeszkoda par_solid

if (place_meeting(x+5,y,par_solid) || place_free(x+5,y+32)) && image_xscale = 1

{

image_xscale = -1;

}

if (place_meeting(x-5,y,par_solid) || place_free(x-5,y+32) && 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;

}

}

if (stopped)

hspd=0;

 

 

// czasowy respawn wrogow troche pomeczyles sie ale dziala jak trzeba :)

if (dead == true)

{

//obj_spawn.dead = true; //respawn zabitego wroga jak nie bedzie dzialac to wtedy dead=true i wpisac instance_create(x,y,obj_spawn)

instance_create(x,y,obj_spawn_dino);

}

 

No to prawda że się spaghetti porobiło trochę i ciężko się to czyta.

Odnośnik do komentarza
Udostępnij na innych stronach

Teraz tak...

 

Wyciągasz wszystkie takie kwiatki jak

 

if distance_to_object(obj_player)<90

i.speed = 10

 

Dopisujesz komentarz dla potomnych co to robi i po co tu jest.

 

Zamieniasz 90 na zmienną "dystans_reakcji", "prędkość lasera" i wyciągasz tę zmienną w paczkę zdefiniowanych zmiennych sterujących zachowaniem wroga.

 

z takich kwiatków:

 

with instance_create(x,y,obj_entity_die)

 

Wyciągasz "obj_entity_die" i używasz poleceń asset i predefiniujesz w paczce jaki asset.

 

Tak żeby jak już uznasz że kod działa to zmieniać zmienne, a nie dłubać w kodzie.

 

 

 

A z makaronem tak jest że czasem się zdarza, i wtedy trzeba coś z nim zrobić, najlepiej pociąć.

Odnośnik do komentarza
Udostępnij na innych stronach

A spróbuj tego:

GMLvar stopped;

stopped=0;

 

image_angle = direction;

if distance_to_object(obj_player)<90

 

{

stopped=1

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;

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_solid)) x+=image_xscale*5;

else image_xscale*=-1;

}

 

 

 

 

//naprawiamy bugujacego sie wroga przy zawracaniu przeszkoda par_solid

if (place_meeting(x+5,y,par_solid) || place_free(x+5,y+32)) && image_xscale = 1

{

image_xscale = -1;

}

if (place_meeting(x-5,y,par_solid) || place_free(x-5,y+32) && 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;

}

}

if (stopped)

hspd=0;

 

 

// czasowy respawn wrogow troche pomeczyles sie ale dziala jak trzeba :)

if (dead == true)

{

//obj_spawn.dead = true; //respawn zabitego wroga jak nie bedzie dzialac to wtedy dead=true i wpisac instance_create(x,y,obj_spawn)

 

instance_create(x,y,obj_spawn_dino);

}

 

No to prawda że się spaghetti porobiło trochę i ciężko się to czyta.

 

 

 

Dzięki za pomoc chłopaki...Kt117 właśnie tak wcześniej zrobiłem jak napisałeś..i faktycznie dziwna sytuacja place_free wszystko psuło...

 

teraz jak widzi mur przeszkodzę par_solid to się ładnie obraca wróg i idzie w przeciwnym kierunku...została kwestia... krawędzi par_solid tylko krawędzi..na razie zrobiłem przy krawędziach obiekty niewidzialne,na które wróg reaguje i się obraca,ale nie tak chciałem,żeby to działało...

 

najlepiej,żeby wróg ,kiedy widzi krawędź koniec platformy par_solid to ma zawracać..dziwne,że na place_free to nie działa i to psuło..

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki za pomoc chłopaki...Kt117 właśnie tak wcześniej zrobiłem jak napisałeś..i faktycznie dziwna sytuacja place_free wszystko psuło...

 

teraz jak widzi mur przeszkodzę par_solid to się ładnie obraca wróg i idzie w przeciwnym kierunku...została kwestia... krawędzi par_solid tylko krawędzi..na razie zrobiłem przy krawędziach obiekty niewidzialne,na które wróg reaguje i się obraca,ale nie tak chciałem,żeby to działało...

 

najlepiej,żeby wróg ,kiedy widzi krawędź koniec platformy par_solid to ma zawracać..dziwne,że na place_free to nie działa i to psuło..

 

Aby wróg "widział" musisz zrobić próbkowanie terenu wkoło wroga.

Tworzysz ds_grid, albo ds_list, i pakujesz tam wartości testu zajętości terenu wkoło wroga, im bardziej zajęty teren tym wyższa wartość.

Następnie dodajesz heurystyczną odległość do celu/gracza do tych wartości, z danych pól testu.

 

Obracasz wroga w kierunku najniższej uzyskanej wartości i do przodu.

 

To taki najprostszy greed algorithm. Zatnie się na pewnych zawiniętych ścianach - pułapkach na chciwca, ale to się rozwinie później.

Odnośnik do komentarza
Udostępnij na innych stronach

Jemu raczej chodzi o prosta detekcję krawędzi platformy. :P

 

Czyli taki magiczny kamień, który przechowuje właściwość, iż na kierunku jakiejś osi nie ma sąsiada :)

No to ktoś musi tę informację zebrać, albo ten kamień, albo ten wróg...

 

Albo trzeba zrobić specjalny kamień na koniec platformy, który zastąpi wszystkie kamienie na końcach platformy po przemieleniu całego levelu ^^

 

Ja bym jednak zajętość terenu próbkował wrogiem.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...
Czyli taki magiczny kamień, który przechowuje właściwość, iż na kierunku jakiejś osi nie ma sąsiada :)

No to ktoś musi tę informację zebrać, albo ten kamień, albo ten wróg...

 

Albo trzeba zrobić specjalny kamień na koniec platformy, który zastąpi wszystkie kamienie na końcach platformy po przemieleniu całego levelu ^^

 

Ja bym jednak zajętość terenu próbkował wrogiem.

 

 

 

 

 

Właśnie chodzi mi głównie o to,że ja mam kamienie niewidzialne ustawione obecnie od których wróg się odbija zawraca w drugą stronę,ale to nie o to chodzi,bo jak zobaczy bohatera,to potrafi przy kamieniu się zawiesić trzęsie jak głupi i tyle..

 

Im lord dobrze powiedział mi właśnie chodzi o detekcje krawędzi platform..tyle,że tak jak wcześniej wspomniałem mam daną scenerie narysowaną i w background ustawiona no i na nią ustawiam niewidzialne solidy,po których chodzi sobie bohater i to właśnie na krawędzich tych solid wróg miałby wykrywać jej koniec i się obracać żeby nie wpaść w przepaść itp..

 

 

 

 

Tutaj STEP mojego wroga

 

GML
var stopped;

stopped=0;

 

 

image_angle = direction;

if distance_to_object(obj_player)<90

 

{

stopped=1

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*1.5

}

}

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_solid)) x+=image_xscale*5;

}

 

 

 

 

//naprawiamy bugujacego sie wroga przy zawracaniu przeszkoda par_solid

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

{

image_xscale = -1;

}

if place_meeting(x-5,y,par_solid) && 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;

}

 

// Odwracanie wroga od obiektu niewidzialnego

if place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny) && image_xscale = 1

{

image_xscale = -abs(image_xscale);

}

else if place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny) && image_xscale = -1

{

image_xscale = abs(image_xscale);

}

 

 

 

if hp <= 0 {

instance_destroy();

instance_create(x,y-50,choose(obj_coin, obj_diamencik)) // 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;

audio_play_sound(dzwiek_wrog_ginie, 1, false); //odtwarzamy dzwiek przy smierci wroga

}

}

if (stopped)

hspd=0;

 

 

// czasowy respawn wrogow troche pomeczyles sie ale dziala jak trzeba :)

if (dead == true)

{

//obj_spawn.dead = true; //respawn zabitego wroga jak nie bedzie dzialac to wtedy dead=true i wpisac instance_create(x,y,obj_spawn)

instance_create(x,y,obj_spawn_dino);

}

 

O ile na scenerii zbudowanej z tilesetów to działa bardzo dobrze,to tu na scenerii narysowanej ręcznie całej i nałożonej solidy już to nie działa mi:/

Odnośnik do komentarza
Udostępnij na innych stronach

// Odwracanie wroga od obiektu niewidzialnego

 

if place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny) && image_xscale = 1

{

image_xscale = -abs(image_xscale);

}

else if place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny) && image_xscale = -1

{

image_xscale = abs(image_xscale);

}

 

Napisz tekstem co autor miał na myśli jak to pisał.

Coś podejrzewam, że autor pominął nawiasy w syntaxie i ma pętlę co step z tym warunkiem:

place_meeting(x+32,y+3,obj_niewidzialny)

na ten

place_meeting(x+32,y+3,obj_niewidzialny)

co skutkuje przekładaniem wartości zespolonej (image scale)(znak) na przeciwny znak.

Odnośnik do komentarza
Udostępnij na innych stronach

Napisz tekstem co autor miał na myśli jak to pisał.

Coś podejrzewam, że autor pominął nawiasy w syntaxie i ma pętlę co step z tym warunkiem:

place_meeting(x+32,y+3,obj_niewidzialny)

na ten

place_meeting(x+32,y+3,obj_niewidzialny)

co skutkuje przekładaniem wartości zespolonej (image scale)(znak) na przeciwny znak.

 

No dobra 3r3se7ven

 

czyli w tej sekcji kodu jest błąd..hmmm w sumie jak załóżmy ustawie te niewidzialne klocki po obu stronach krańcach platformy,i w środku jest wróg tylko,który chodzi,to nic się złego nie dzieje,natomiast występuje czasem problem przy wrogu,który już ma AI jak nas zobaczy zatrzymuje się i strzela,lub wróg ,który jak nas zobaczy to goni,no i jak trafi na krańcu platformy na obiekt niewidzialny to lubi dostać tzw trzęsiawki,co jest uciążliwe:/

 

Odnośnik do komentarza
Udostępnij na innych stronach

No dobra 3r3se7ven

 

czyli w tej sekcji kodu jest błąd..hmmm w sumie jak załóżmy ustawie te niewidzialne klocki po obu stronach krańcach platformy,i w środku jest wróg tylko,który chodzi,to nic się złego nie dzieje,natomiast występuje czasem problem przy wrogu,który już ma AI jak nas zobaczy zatrzymuje się i strzela,lub wróg ,który jak nas zobaczy to goni,no i jak trafi na krańcu platformy na obiekt niewidzialny to lubi dostać tzw trzęsiawki,co jest uciążliwe:/

 

if (place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny)) && image_xscale = 1

{

image_xscale = -abs(image_xscale);

}

else if (place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny)) && image_xscale = -1

{

image_xscale = abs(image_xscale);

}

 

A lub B i C to nie to samo co (A i C) lub (B i C) czyli (A lub B ) i C

 

//robię warunki animacji w podobny sposób, więc też mi się czasem myli i później szukam gdzie podziałem nawiasy, w jedną stronę działa a w drugą się telepie.

Odnośnik do komentarza
Udostępnij na innych stronach

if (place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny)) && image_xscale = 1

{

image_xscale = -abs(image_xscale);

}

else if (place_meeting(x+32,y+3,obj_niewidzialny) || place_meeting(x-32,y-3,obj_niewidzialny)) && image_xscale = -1

{

image_xscale = abs(image_xscale);

}

 

A lub B i C to nie to samo co (A i C) lub (B i C) czyli (A lub B ) i C

 

//robię warunki animacji w podobny sposób, więc też mi się czasem myli i później szukam gdzie podziałem nawiasy, w jedną stronę działa a w drugą się telepie.

 

Zgadza się..no niestety z nawiasami to jest teraz tak,że wróg dostaje pełne delirum i staje się królem parkietu;) jest gorzej niż wcześniej,bez nawiasów tylko z lewej strony jest delirkum,a z prawej jest dobrze;)

 

 

Zrobiłem tak i problem ustąpił dyskoteka ustąpiła stoickiego spokoju;]

 

o to kod

 

w stepie wroga

 

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

{

image_xscale = -1;

}

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

{

image_xscale = 1;

}

 

 

Może komuś się przyda dzięki za fatyge;)

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ę...