Skocz do zawartości

Sztuczna Inteligencja wroga


Rekomendowane odpowiedzi

Cześć wszystkim,mam wroga,ale obecnie mój wróg tylko chodzi i nic więcej nie robi,chciałbym,żeby trochę zaczął myśleć:

np jak zobaczy bohatera,to zacznie go trochę gonić,jak go zobaczy,to zacznie strzelać w jego kierunku, potrafi zatrzymać się na krawędzi jak dalej nie ma platformy losowe zachowanie,ot takie AI wroga

(Game Maker Studio)

 

 

tutaj kod mojego wroga:

 

obj_enemy_bulwa

 

CREATE

 

GML
///Ustawienia

event_inherited();

hp = 15;

maxHp = 15;

hurtClock = 0;

skok = 0;

image_xscale *= choose(1,-1);

 

 

STEP

 

GML
///Ruch wroga

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();

with instance_create(x,y,obj_entity_die) {

sprite_index = sprWrogGinie; //sprite do poruszania sie wroga

image_xscale = other.image_xscale;

image_yscale = other.image_yscale;

hspd = other.hspd;

vspd = other.vspd;

}

}

 

 

Collision z obj_player

 

GML
///Zgniecenie

if other.y < y && other.vspd > 0 && other.hurtClock == 0 && skok==0{

skok+=1;

hp-=10;

other.vspd = -12;

with instance_create(x,y,obj_entity_die) {

sprite_index = sprWrogGinie; //dodatkowa animacja wroga kiedy ginie gdy sie na niego naskoczy

image_xscale = other.image_xscale;

hspd = other.hspd;

vspd = other.vspd;

}

}

 

else if other.y < y && other.vspd > 0 && other.hurtClock == 0 && skok==1{

other.vspd = -12;

hp-=10;

with instance_create(x,y,obj_entity_die) {

sprite_index = sprWrogGinie; //dodatkowa animacja wroga kiedy ginie gdy sie na niego naskoczy

image_xscale = other.image_xscale;

hspd = other.hspd;

vspd = other.vspd;

}

instance_destroy();

}

 

 

A tu kod obj_player w kolizji z obj_enemy_bulwa

 

GML
///Obrazenia jakie wrog zadaje Bohaterowi

if !vspd > 0 && hurtClock == 0 && other.hurtClock == 0 && sign(x-other.x) == other.image_xscale {

hp -= 15;

hurtClock = room_speed;

vspd = -8;

hspd = sign(x-other.x)*16;

}

 

 

///jakos to rozgryzlem tutaj wrog zabiera mi jedno zycie w momencie kontaktu z nim

if( hp <= 0 )

{

hp = 100;

global.life -= 1;

x = start_x;

y = start_y;

}

 

if( global.life <= 0 )

{

room_goto( rm_game_over ); //pokoj,gdzie ma sie akcja gry przeniesc po koncu gry

}

Odnośnik do komentarza
Udostępnij na innych stronach

No to żeby wróg się zatrzymał to zrób if place free, i podaj o 1 wysokość wroga w dół i o 1 kratkę w prawo/lewo.

Kierunek strzelania, to sprawdzanie czy x> czy x< od x bohatera.

 

Łatwo jest też dość zrobienie objektu jak o_attack, i tworzenie go przy ataku przeciwnika, można wsadzić do niego animacje i można go dodać do każdego przeciwnika, zmieniając tylko przy create inny dmg, albo skalować go w zależności od poziomu :)

Odnośnik do komentarza
Udostępnij na innych stronach

Z tego co rozumiem to kod który skopiowałeś skądś, więc nie obrażając Cię, pewnie go nie rozumiesz. Sam w sumie go średnio rozumiem. Nic dziwnego, kod w końcu chyba nie Twój. Ponieważ to jest platformówka, to wróg powinien móc iść w lewo, w prawo ew. skakać. No więc. Jeśli napotka gracza, niech sprawdza gdzie jest. Jak na lewo, to idzie w lewo, jak na prawo, to idzie w prawo, jak po drodze przeszkoda, to skacze. To gdzie jest gracz, może sprawdzać po koordynatach, tzn.

GML
if(obj_gracz.x<x)

ruch=-1; //no, że on jest na lewo, czyli -1

if(obj_gracz.x>x

ruch=1; //analogicznie, teraz na prawo, czyli 1

x+=ruch; //i dodajemy naszą zmienną ruch po x</span>

Jeśli chodzi o skakanie

GML
if!(place_free(x+ruch, y)) //jeśli nie jest wolne miejsce tam gdzie idziemy

kod_na_skakanie(); //to niech podskoczy</span>

Co do widzenia postaci musisz się pobawić z collision_line() i sprawdzaniem odległości.

Co do zatrzymywania się przy krawędzi. Sprawdzaj place_free(x+ruch, y+5), jeśli jest wolne miejsce w danej pozycji, to widocznie nic tam nie ma, niech zmienia kierunek ruchu.

Odnośnik do komentarza
Udostępnij na innych stronach

Kod pisze kolega,ale jest niedostępny przez dłuższy czas,ja zajmuje ja próbuje go trochę wesprzeć...Dobra mniejsza o to...

 

No dobra..jak zrobić,żeby ten wróg widząc mojego bohatera np zatrzymał się i zaczął strzelać do niego w odpowiednim kierunku,jak go zobaczy z lewej strony,to stoi i strzela w lewo,a jak w prawej to stoi i strzela w prawo.

 

w Stepie wroga dodałem to:

 

GML
if distance_to_object (obj_player)<80

{

instance_create(x,y,obj_pociskArmata)

}

 

 

Ok teraz mnie jak zobaczy w odpowiedniej odległości zaczyna strzelać..ale tak dziwnie,bo jak idę w lewo,to on chodzi strzela nie zatrzymuje się i na odwal strzela raz z prawej raz z lewej nie ważne z której strony ja się znajduje.

Odnośnik do komentarza
Udostępnij na innych stronach

Kod pisze kolega,ale jest niedostępny przez dłuższy czas,ja zajmuje ja próbuje go trochę wesprzeć...Dobra mniejsza o to...

 

No dobra..jak zrobić,żeby ten wróg widząc mojego bohatera np zatrzymał się i zaczął strzelać do niego w odpowiednim kierunku,jak go zobaczy z lewej strony,to stoi i strzela w lewo,a jak w prawej to stoi i strzela w prawo.

 

w Stepie wroga dodałem to:

 

GML
if distance_to_object (obj_player)<80

{

instance_create(x,y,obj_pociskArmata)

}

 

 

Ok teraz mnie jak zobaczy w odpowiedniej odległości zaczyna strzelać..ale tak dziwnie,bo jak idę w lewo,to on chodzi strzela nie zatrzymuje się i na odwal strzela raz z prawej raz z lewej nie ważne z której strony ja się znajduje.

 

Trzeba jeszcze zrozumieć objekt pocisk :)

Zobaczyć co on robi...

Odnośnik do komentarza
Udostępnij na innych stronach

tutaj kod pocisku

on cyklicznie wypuszcza kule,bo to od mojej armaty kod,ale jak teraz ten kod przerobić do wroga,żeby na oślep nie rzucał kulami,tylko np stanął i strzelał w określonym kierunku tak jak wcześniej pisałem jeśli stoję z prawej,to on się obraca w prawo i strzela,a jeśli z lewej,to obraca się w lewo i strzela;)aż z niknę mu z pola widzenia wtedy zaczyna znów sobie spokojnie chodzić.

 

 

obj_pociskArmata

 

kolizja z graczem

 

GML
///obrazenia od kul armatnich

if !vspd > 0 && hurtClock == 0 || place_meeting(x+2,y,obj_pociskArmata) || place_meeting(x,y-2,obj_pociskArmata) || place_meeting(x-2,y,obj_pociskArmata) || place_meeting(x,y-2,obj_pociskArmata) && other.hurtClock == 0 && sign(x-other.x) == other.image_xscale {

hp -= 10;

hurtClock = room_speed;

vspd = -8;

hspd = sign(x-other.x)*5;

}

 

 

 

///tutaj wrog zabiera mi jedno zycie w momencie kontaktu z nim

if( hp <= 0 )

{

hp = 100;

global.life -= 1;

x = start_x;

y = start_y;

 

}

 

if( global.life <= 0 )

{

room_goto( rm_game_over ); //pokoj,gdzie ma sie akcja gry przeniesc po koncu gry

}

 

 

a tu cały kod mojego obj_pociskArmata

 

Create

 

GML
///Ustawienia pociskow armatnich

move_towards_point(156,616,8);

move_towards_point(156,616,9);

 

event_inherited()

owner = noone;

strenght = 1;

explode = false;

explosionRadius = 22;

explosionStrength = 10;

g = 0;

f = 0;

 

Destroy

 

GML
if explode == true {

with obj_destructible_terrain {

surface_set_target(surf);

draw_set_blend_mode(bm_subtract);

draw_set_colour(c_white);

draw_circle(other.x,other.y,other.explosionRadius,false);

draw_set_blend_mode(bm_normal);

surface_reset_target();

update = true;

}

with instance_create(x,y,obj_pociskArmata) {

owner = other.owner;

followOwner = false;

strength = other.explosionStrength;

sprite_index = spr_pocisk_armatek;

image_xscale = 1/16*other.explosionRadius;

image_yscale = image_xscale;

}

part_type_size(pExplosion,explosionRadius/16,explosionRadius/16,-explosionRadius/64,0);

part_particles_create(partSystem,x,y,pExplosion,1);

}

 

End Step

 

GML
///Particle and stop

var hspdP, vspdP;

hspdP = hspd;

vspdP = vspd;

 

event_inherited();

 

part_type_sprite(pz,sprite_index,true,false,false);

part_particles_create_colour(partSystem,x,y,pz,image_blend,1);

 

if hspd != hspdP || vspd != vspdP+g || bbox_right < -explosionRadius || bbox_left >= room_width+explosionRadius || bbox_bottom < -explosionRadius || bbox_top >= room_height+explosionRadius {

 

with instance_place(x+lengthdir_x(hspdP,0)+lengthdir_x(vspdP,270),y+lengthdir_y(hspdP,0)+lengthdir_y(vspdP,270),all) {

event_perform(ev_collision,other.object_index);

 

}

instance_destroy();

}

 

 

 

To jest akurat kod od moich armat,ale może coś prostszego dla wroga jeśli chodzi o pocisk,którym strzelać będzie

Odnośnik do komentarza
Udostępnij na innych stronach

Przecież na to nie liczę,że zrobicie grę za mnie;) kolegi nie ma przez ponad miesiąc czasu,a chciałem go trochę odciążyć..

 

Chodzi mi głównie o prosty kod na strzelanie wroga...armaty są zbyt skomplikowane żeby przerabiać ten kod dla wroga,niech zostanie to w armatach..

Chciałbym tylko,żeby wróg w momencie,kiedy mnie zobaczył zatrzymał się i zaczął cyklicznie strzelać nie na odwal w różnych kierunkach tylko w konkretnym kierunku jak stoję z lewej strony,to strzela w lewo,jak z prawej to w prawo;) o coś takiego mi chodzi;)

Odnośnik do komentarza
Udostępnij na innych stronach

Spróbuj zrobić coś takiego:

 

Jeśli chodzi o zatrzymywanie się:

if dinstance_to_object( obj_player) <256{

speed=0}

 

 

A co do kierunku strzelania

if x<obj_player.x{

 

bull=instance_create(x,y,obj_pociskArmata)

bull.direction=90}

else{

bull=instance_create(x,y,obj_pociskArmata)

bull.direction=170}

Odnośnik do komentarza
Udostępnij na innych stronach

No z tym kodem teraz to wróg stoi cały czas nawet nie widząc mnie i strzela z dużą serią pocisku;) nie sposób do niego podejść;)

Może w obj_pociskArmata trzeba coś zrobić żeby nadać temu odpowiedni kierunek i szybkość

Odnośnik do komentarza
Udostępnij na innych stronach

Musisz jeszcze zrobić odwrotność:

 

if dinstance_to_object( obj_player) <256{

speed=0}

else{

speed=5}

 

Czy ten przeciwnik wgl. ma jakiś kod chodzenia ? [ dobra popatrzyłem wyżej, i go nie rozumiem :D ]

 

 

No to dodaj to do pocisku w create

 

speed=5

if x<obj_player.x{

direction=90}

else{

direction=170}

 

A tam przy create, dodaj jakiś alarm z odpowiednim czasem...

Odnośnik do komentarza
Udostępnij na innych stronach

obj_wrog

 

STEP

 

GML
if distance_to_object( obj_player) <256{

speed=0}

else{

speed=5}

 

 

 

if x<obj_player.x{

 

bull=instance_create(x,y,obj_pociskArmata)

bull.direction=90}

else{

bull=instance_create(x,y,obj_pociskArmata)

bull.direction=170}

 

 

 

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();

with instance_create(x,y,obj_entity_die) {

sprite_index = sprWrogGinie; //sprite do poruszania sie wroga

image_xscale = other.image_xscale;

image_yscale = other.image_yscale;

hspd = other.hspd;

vspd = other.vspd;

}

}

 

 

obj_pocisk

 

Create

 

GML
speed=5

if x<obj_player.x{

direction=90}

else{

direction=170}

 

 

to zadziała tak? a co w kolizji pocisk z graczem wpisac? i w alarmie?

Odnośnik do komentarza
Udostępnij na innych stronach

 

wywal to z create pocisku

GML
if x<obj_player.x{

direction=90}

else{

direction=170}

zostaw tylko speed...

 

Ale ty nie masz nawet wpisanego kierunku chodzenia przeciwnika tak ?

 

przed create pocisku zrób

 

if ready=1{

 

wewnatrz ready=0 i alarm[0]= (czas)

 

w alarmie ready=1

 

i w create ready=1

Odnośnik do komentarza
Udostępnij na innych stronach

obj_kularmatnia

 

mam tak

 

Create

 

GML
///tor lotu kul armatnich (punkt do ktorego maja leciec)

move_towards_point(19084,616,8);

move_towards_point(19084,616,9);

 

event_inherited()

owner = noone;

strenght = 1;

explode1 = false;

explosionRadius = 25;

explosionStrength = 10;

g = 0;

f = 0;

 

 

Destroy

 

GML
if explode1 == true {

with obj_destructible_terrain {

surface_set_target(surf);

draw_set_blend_mode(bm_subtract);

draw_set_colour(c_white);

draw_circle(other.x,other.y,other.explosionRadius,false);

draw_set_blend_mode(bm_normal);

surface_reset_target();

update = true;

}

with instance_create(x,y,obj_kularmatnia) {

owner = other.owner;

followOwner = false;

strength = other.explosionStrength;

sprite_index = spr_pocisk_armatek;

image_xscale = 1/16*other.explosionRadius;

image_yscale = image_xscale;

}

part_type_size(pExplosion,explosionRadius/16,explosionRadius/16,-explosionRadius/64,0);

part_particles_create(partSystem,x,y,pExplosion,1);

}

 

 

 

End step

 

GML
var hspdP, vspdP;

hspdP = hspd;

vspdP = vspd;

 

event_inherited();

 

part_type_sprite(pz,sprite_index,true,false,false);

part_particles_create_colour(partSystem,x,y,pz,image_blend,1);

 

if hspd != hspdP || vspd != vspdP+g || bbox_right < -explosionRadius || bbox_left >= room_width+explosionRadius || bbox_bottom < -explosionRadius || bbox_top >= room_height+explosionRadius {

 

with instance_place(x+lengthdir_x(hspdP,0)+lengthdir_x(vspdP,270),y+lengthdir_y(hspdP,0)+lengthdir_y(vspdP,270),all) {

event_perform(ev_collision,other.object_index);

 

}

instance_destroy();

}

Odnośnik do komentarza
Udostępnij na innych stronach

Przecież na to nie liczę,że zrobicie grę za mnie;) kolegi nie ma przez ponad miesiąc czasu,a chciałem go trochę odciążyć..

 

Może już pora żeby skończyć z historyjką o wyjeździe kolegi programisty? Jak najbardziej kolega istnieje, ale nie zna Cię i nie ma pojęcia że robisz grę.

 

Oczywiście możemy założyć że twój kolega programista rzeczywiście przygotował to dla Ciebie i wyjechał na wakacje, ale w takim wypadku robisz coś zupełnie odwrotnego od "odciążania go" z dodatkowej pracy. A biorąc pod uwagę że cały twój projekt jest darmowym silnikiem platformówki, i dopiero starasz się coś do niego dodawać, co widać po twoich wszystkich tematach na forum, to możemy uznać że to kłamstwo.

 

I niestety ale robimy tę grę za Ciebie. Więc może pora skończyć z tym zupełnie nieznaczącym kłamstewkiem i oczekiwaniem na to że ktoś poda gotowy do wklejenia kod.

GameMaker przestał być prostym narzędziem, i wymaga sporo nauki. To nie jest silnik pozwalający na modułowe dodawanie elementów. Tu wszystko może popsuć grę.

 

 

Więc wrócę do mojej najstarszej rady dotyczącej tworzenia gier:

Zamknąć się w piwnicy (polecam na upał), odłączyć od internetu, pobrać darmowe przykłady, odpalić F1 (aka dokumentację) i próbować zrozumieć jak co działa. I pod żadnym pozorem nie robić z tego gry!

 

Pozdrawiam i życzę upartości.

Odnośnik do komentarza
Udostępnij na innych stronach

Po pierwsze silnik tworzy mój kolega,ja staram się cokolwiek pomóc,głównie zajmuje się grafiką 2D i 3D,scenariuszem, oraz sieciami komputerowymi po drugie nikt nikogo tutaj nie oszukuje przykro mi,że tak to odebrałeś...Co do pisania kodów masz rację dużo dostałem pomocy,za co jestem bardzo wdzięczny użytkownikom forum i Tobie też...

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