Skocz do zawartości

Atak !! Jak to zrobic?


xax

Rekomendowane odpowiedzi

Dzięki RANMUS'OWI(dobra dusza) rozwiązałem problem animacji mobów w grze.

Teraz mam kolejny problem ATAK !!

 

Kiedy Bohater atakuje:

 

Zależy mi aby PRZY NACISNIECIU KLAWISZA MYSZY następowalo zdarzenie ANIMACJII ATAKU tylko i wyłącznie wtedy - kiedy bohater jest w odpowiedniej odległości od "potworka" (pamiętać należy że: odległość od potwora jest uzależniona od rodzaju ataku) na przykład: Atak Mieczem z bliska, lub Strzał z Łuku z większej odległości.

 

Kiedy Mob (potworek) Atakuje:

 

w Momencie gdy nasz bohater zaatakuje moba (potworka), ten powinien zwrócic się ku niemu

i jak wyżej opisane, rownież odgryzać się atakiem i gonić naszego Bohatera.

Chodzi o to aby MOB używał spritow ATAKU w momencie ATAKU.

 

Zależy mi też na tym aby ATAKI miały losowe wartości i rownież aby pokazywały odpowiednie losowe

zdjęcie ŻYCIA (HP) w formie Graficznej i Cyfrowej.

W mojej grze udało mi się pokazać tylko stałe zdjęcie energii życiowej :(

 

Pozdrawiam i czekam na pomoc

 

XaX

 

Tak wyglada gra w chwili obecnej: https://gmclan.org/up969_4_xax_gra_klient.html

 

 

EDIT

Chmmm... rozumiem że ten temat jest za trudny aby ktoś mi pomógł, lub tak trywialnie łatwy że nikt nie chce się "zagłebiać w problem" :(

 

Albo brakuje ludziom czasu :) Używaj EDIT. Pozdrawiam.

Tymon

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Za trudny, to np. dla mnie nie, ale zbyt czasochłonny, a ja mam teraz dużo rzeczy na głowie by robić silnik chodzenia. Poszukaj najpierw informacji na forum (szukajka) o point_distance i distance_to_object, bo już wiele razy było o kwestiach odległości. Potem musisz dorobić zmienną, która zależnei od wartości posłuży w warunku jako przełącznik maksymalnej odległości. Kolejna zmienna, to np. musi odpowiadać za blokadę innych ruchów podczas ataków itd.

 

...

 

Borek, gdzie jesteś? :)

Odnośnik do komentarza
Udostępnij na innych stronach

To dla mnie za trudne w tej chwili, jestem wzrokowcem i najszybciej uczę się na przykładach, próbowałem już róznych metod z tym atakiem, ale nie dawało to oczekiwanych skutków, albo nie działały kody, ktore znalazłem. Problem stał się tym wiekszy że jak dodałem obsługę on-line do gry, to trudno mi dopasować konkretne zdarzenia w odpowiednie miejsca w grze.

Myśle że atak muszę dopisać w takie miejsce:

STEP w objekcie o nazwie np: PLAYER

ten kod porusza animacją wszystkich postaci w grze ale nie potrafie dopisać tutaj wyżej opisanego ataku

if moving = 1{
if distance_to_point(target_x,target_y) > 10{move_towards_point(target_x,target_y,8)}; else{speed = 0; moving = 0}

if direction <= 45 or direction > 315   {if global.Job=1{sprite_index=spr_C1_W_R}; if global.Job=2{sprite_index=spr_C2_W_R}; if global.Job=3{sprite_index=spr_C3_W_R}; if global.Job=4{sprite_index=p}}
if direction <= 135  && direction > 45  {if global.Job=1{sprite_index=spr_C1_W_U}; if global.Job=2{sprite_index=spr_C2_W_U}; if global.Job=3{sprite_index=spr_C3_W_U}; if global.Job=4{sprite_index=g}} 
if direction <= 225  && direction > 135 {if global.Job=1{sprite_index=spr_C1_W_L}; if global.Job=2{sprite_index=spr_C2_W_L}; if global.Job=3{sprite_index=spr_C3_W_L}; if global.Job=4{sprite_index=l}}
if direction <= 315  && direction > 225 {if global.Job=1{sprite_index=spr_C1_W_D}; if global.Job=2{sprite_index=spr_C2_W_D}; if global.Job=3{sprite_index=spr_C3_W_D}; if global.Job=4{sprite_index=d}}
}

if moving = 0{
speed = 0
if direction <= 45 or direction > 315   {if global.Job=1{sprite_index=spr_C1_S_R}; if global.Job=2{sprite_index=spr_C2_S_R}; if global.Job=3{sprite_index=spr_C3_S_R}; if global.Job=4{sprite_index=s_p}}
if direction <= 135  && direction > 45  {if global.Job=1{sprite_index=spr_C1_S_U}; if global.Job=2{sprite_index=spr_C2_S_U}; if global.Job=3{sprite_index=spr_C3_S_U}; if global.Job=4{sprite_index=s_g}}
if direction <= 225  && direction > 135 {if global.Job=1{sprite_index=spr_C1_S_L}; if global.Job=2{sprite_index=spr_C2_S_L}; if global.Job=3{sprite_index=spr_C3_S_L}; if global.Job=4{sprite_index=s_l}}
if direction <= 315  && direction > 225 {if global.Job=1{sprite_index=spr_C1_S_D}; if global.Job=2{sprite_index=spr_C2_S_D}; if global.Job=3{sprite_index=spr_C3_S_D}; if global.Job=4{sprite_index=s_d}}
}

i dodatkowo jeszcze w drugim obiekcie, który używa niewidzialnego sprita (chociaż nie wiem po co to jest) o nazwie powiedzmy CLONE a szczególnie dobija mnie komenda STRING_... zupelnie nie wiem po co ona jest i co robi :(

if global.PlayerData[Number] != ""{
    moving = 1
    Name = string_copy(global.PlayerData[Number],1,string_pos("|",global.PlayerData[Number])-1)
    global.PlayerData[Number] = string_copy(global.PlayerData[Number],string_pos("|",global.PlayerData[Number])+1,string_length(global.PlayerData[Number]))
    X = real(string_copy(global.PlayerData[Number],1,string_pos("|",global.PlayerData[Number])-1))
    global.PlayerData[Number] = string_copy(global.PlayerData[Number],string_pos("|",global.PlayerData[Number])+1,string_length(global.PlayerData[Number]))
    Y = real(string_copy(global.PlayerData[Number],1,string_pos("|",global.PlayerData[Number])-1))
    global.PlayerData[Number] = string_copy(global.PlayerData[Number],string_pos("|",global.PlayerData[Number])+1,string_length(global.PlayerData[Number]))
    Job = real(string_copy(global.PlayerData[Number],1,string_pos("|",global.PlayerData[Number])-1))
    global.PlayerData[Number] = string_copy(global.PlayerData[Number],string_pos("|",global.PlayerData[Number])+1,string_length(global.PlayerData[Number]))
    target_x = real(string_copy(global.PlayerData[Number],1,string_pos("|",global.PlayerData[Number])-1))
    target_y = real(string_copy(global.PlayerData[Number],string_pos("|",global.PlayerData[Number])+1,string_length(global.PlayerData[Number])))
    global.PlayerData[Number] = ""}
if distance_to_point(X,Y) > 10{Speed = 8} else{Speed = 6}
if global.Clone[Number] = 0{instance_destroy()}

if moving = 1{
if distance_to_point(target_x,target_y) > 10{move_towards_point(target_x,target_y,Speed)}; else{speed = 0; moving = 0; Speed = 4}

if direction <= 45 or direction > 315   {if Job=1{sprite_index=spr_C1_W_R}; if Job=2{sprite_index=spr_C2_W_R}; if Job=3{sprite_index=spr_C3_W_R}; if Job=4{sprite_index=p}}
if direction <= 135  && direction > 45  {if Job=1{sprite_index=spr_C1_W_U}; if Job=2{sprite_index=spr_C2_W_U}; if Job=3{sprite_index=spr_C3_W_U}; if Job=4{sprite_index=g}}
if direction <= 225  && direction > 135 {if Job=1{sprite_index=spr_C1_W_L}; if Job=2{sprite_index=spr_C2_W_L}; if Job=3{sprite_index=spr_C3_W_L}; if Job=4{sprite_index=l}}
if direction <= 315  && direction > 225 {if Job=1{sprite_index=spr_C1_W_D}; if Job=2{sprite_index=spr_C2_W_D}; if Job=3{sprite_index=spr_C3_W_D}; if Job=4{sprite_index=d}}
}

if moving = 0{
if direction <= 45 or direction > 315   {if Job=1{sprite_index=spr_C1_S_R}; if Job=2{sprite_index=spr_C2_S_R}; if Job=3{sprite_index=spr_C3_S_R}; if Job=4{sprite_index=s_p}}
if direction <= 135  && direction > 45  {if Job=1{sprite_index=spr_C1_S_U}; if Job=2{sprite_index=spr_C2_S_U}; if Job=3{sprite_index=spr_C3_S_U}; if Job=4{sprite_index=s_g}}
if direction <= 225  && direction > 135 {if Job=1{sprite_index=spr_C1_S_L}; if Job=2{sprite_index=spr_C2_S_L}; if Job=3{sprite_index=spr_C3_S_L}; if Job=4{sprite_index=s_l}}
if direction <= 315  && direction > 225 {if Job=1{sprite_index=spr_C1_S_D}; if Job=2{sprite_index=spr_C2_S_D}; if Job=3{sprite_index=spr_C3_S_D}; if Job=4{sprite_index=s_d}}
}

 

I jeszcze jedna Prosta sprawa.

Jak pewnie zauwazyliście w grze NICK POSTACI wyświetla się dosyć nisko pod postacią a powinien pokazywać sie nad jej głową. Próbowałem różnie rekombinować podany poniżej kod, ale niestety nie udało mi się zmienić parametrów tego NICKA aby wyświetlał się nad Bohaterem w grze :(

draw_sprite(sprite_index,-1,x,y)

if mouse_x > x && mouse_x < x+sprite_width
&& mouse_y > y && mouse_y < y+sprite_height{
    draw_set_halign(fa_center)
    draw_set_alpha(0.5)
    draw_roundrect_color(x+sprite_width/2-string_width(Name)/2-2,y+sprite_height+2,x+sprite_width/2+string_width(Name)/2+2,string_height(Name)+y+sprite_height+4,c_green,c_green,0)
    draw_set_alpha(1)
    draw_text_color(x+sprite_width/2,y+sprite_height+4,Name,c_yellow,c_yellow,c_yellow,c_yellow,1)
}

Odnośnik do komentarza
Udostępnij na innych stronach

 i dodatkowo jeszcze w drugim obiekcie, który używa niewidzialnego sprita (chociaż nie wiem po co to jest) o nazwie powiedzmy CLONE  a szczególnie dobija mnie komenda STRING_... zupelnie nie wiem po co ona jest i co robi

No to to wykasuj i zobaczysz poco jest :)

Odnośnik do komentarza
Udostępnij na innych stronach

No to to wykasuj i zobaczysz poco jest :)

 

Dziękuje Kasmiluś, robiłem takie działania, ale brak możliwości odpalenia gry niewiele mi wytłumaczy.

A jeśli Ty potrafisz to zrobić i masz czas aby odpisywać to po prostu odpisz :)

 

Pozdrawiam

XaX

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Za co opdpowiada zmienna Job? Ponieważ najpierw przydało by się zoptymalizować te warunki:

if direction <= 45 or direction > 315  ...
if direction <= 135  && direction > 45  ...
...

na:

switch ( round( direction/45 ) )
{
case 0: ...; break;
case 1: ...; break;
...
case 7: ...; break;
case 8: ...; break // Tutaj musi być to samo co przy case 0, bo 0 i 8 wskazują na ten sam kierunek - w prawo
}

 

string_copy(str,index,count) Returns a substring of str, starting at position index, and of length count.

Kopiuje kawałek tekstu z tekstru str, począwszy od znaku stojącego na pozycji index, o długi znaków count.

nowy_string = string_copy( "abcdef", 2,3 ); //zwróci do nowy_string "bcd"

 

 

A co do walki, to mozesz zrobić tak:

 

Zmodyfikuj ten kawałek z moving = 0

if ( atakuje == false )
{

   if ( moving == 1 )
   {
   ...
   tutaj co masz do uzupelnienia
   ...
}
else // lub else if ( moving == 0 ) jezeli w kodzie gry dopuszczasz inne wartosci od 0 i 1 dla zmiennej moving
{
   speed = 0;
   switch ( round( direction/45 ) )
   {
      case 0: ...; break;
      case 1: ...; break;
      ...
      case 7: ...; break;
      case 8: ...; break // Tutaj musi być to samo co przy case 0, bo 0 i 8 wskazują na ten sam kierunek - w prawo
   }
}

}

 

Teraz w event other -> animation_end gracza:

if ( atakuje == true ) atakuje = false; //jezeli obiekt atakowal kogos, to odblokuj

 

Event create gracza:

atakuje = false; // inicjalizacja zmiennej
dystans_opcja_ataku = 0; // zalozmy ze 0 to miecz, 1 to halabarda, 2 to łuk
dystans_atak[0] = 30;
dystans_atak[1] = 50;
dystans_atak[2] = 1000;
global.potwor_id = 0;

 

No i nie wiem co dalej, poniewaz nie wiem co to jest target_x i target_y? Czy to zmienne przechowujace pozycje docelowego chodzenia? Pozycje potwora?

 

Event tam gdzie masz klikanie myszka i chodzenie gracza:

if( object_exists( global.potwor_id ) )
{
if ( distance_to_point( global.potwor_id.x, global.potwor_id.y) < dystans_atak[ dystans_opcja_ataku ] )
{
atakuje = true;
sprite_index = sprite_atakowania;
image_speed = 0.5;
}
}

Brakuje jeszcze pobierania id z potwora. Nie chce mi sie znowu sciagac klienta gry, ale jezeli za kursor myszki sluzy jakis dodatkowy obiekt, to mozna zrobic tak:

1) Utworzyc obiekt o nazwie "klasa_potwora" i powybieraj go we wszystkich obiektach potworów w menu Parent. To spowoduje dziedziczenie niezdefiniowanych eventów w tych potworach z obiektu "klasa_potwora".

 

2) Teraz wystarczy w obiekcie kursora dorobic event collision z "klasa_potwora":

if ( mouse_button == mb_left )
{
global.potwor_id = other.id; //przypisz zmiennej globalnej numer id obiektu "other", ktory w kolizji oznacza obiekt z ktorym kolidujemy
}

Jak ktos widzi jakis blad, to niech mnie poprawi. Nie wiem czy bedzie dzialac, bo pisalem z pamieci wymyslajac.

 

 

 

ps. Silnik, który ściągnałeś, już widzę, że nie jest elastyczny. Poza tym dorabiając takie rzeczy, o które się tutaj pytasz, to jestem ciekaw czy uwzględniasz w konkurencyjności multiplayera. Na przykład zrobisz podchodzenie do potwora i go niszczenie. A co się stanie jeśli ktoś inny go zniszczy zanim dojdziesz? Czy już dorobiłeś w silniku wysyłanie danych o tym, że gracz kogoś atakuje itd.? Dalej idąc, powinny być w sumie tylko dwa obiekty (albo jeden) gracza. System powinien na jego podstawie tworzyć gracza właściwego i innych. Tak samo potwory. Powinien być jeden obiekt nadrzędny "potwór", którego dziedziczą inne obiekty np. "flying", "ground". To się nazywa polimorfizm. Teraz powinny one mieć podpięte uniwersalne skrypty, które przyjmują dużo parametrów w stylu:siła ataku, siła obrony, życie, poziom exp., poziom_nagrody,nazwa,klasa,rozmiar,zestaw spritów, dzwieki ataku i smierci itd. itp. To wszystko powinno być zapisywane dynamicznie, a nie przydzielane statycznie, po to by potem łatwo dorabiać nowe rodzaje potworków.

Ogólnie rzecz biorąc wziąłeś się za jeden z najtrudniejszych rodzajów gry obok RTS nie mając podstaw, wizji itd. Są trzy wyjścia:

1) Znajdziesz współprojektanta, w co wątpie i będzie ciężko

2) Znajdziesz inny gotowy silnik game makera do takich gier, który ma już wbudowane te funkcje

3) Zrezygnujesz z tej gry i zaczniesz uczyć się GM'a metodą prób i błędów.

Odnośnik do komentarza
Udostępnij na innych stronach

Zmienna JOB odpowiada za wybór charakteru postaci,

W jaki sposób działają i co robią inne zmienne można podejrzeć w przykładzie, który zamieściłem w UP link:

Dopiero sie uczę metodą prób i błedów więc nie potrafię określić jeszcze co robią i za co odpowiadają niektóre kody zawarte w przykładzie.

https://gmclan.org/up969_4_Klient_serwer.html

To był jedyny sensowny przykład serwera i klienta (do gry on-line) jaki znalazłem w necie.

Wiem że ten temat gry nie jest łatwy i wymaga sporo pracy.

Ale musicie przyznać że takiej GRY w GMie nie widzieliście :)

I wasza pomoc może zaowocować naprawde ciekawym produktem.

Uwzględniłem problemy o jakich napisałeś Ranmus, jednak brakuje mi narazie wiedzy aby się w to zagłębiać

Dlatego staram się robić wszystko po kolei, przyjdzie też czas na rozwiązanie innych spraw :)

W przykładzie gry rpg: https://gmclan.org/up969_11_przyklad_kompletnej_gry_rpg.html

natomiast rozpisane są scrypty które przyjmują różne parametry np: siła ataku, siła obrony, życie, poziom exp, ilość wypadającej kasy itp. Są one poustawiane z klocków :(

Nie potrafie ich wykorzystaćw mojej grze :(, mam jakieś dziwne wrażenie że jest w tym przykładzie straszny bałagan w skryptach i za dużo odnośnikow np do "Rodzica" (którego jeszcze nie zrozumiałem do końca).

Reasumując: NIE PODDAJE SIĘ i będe robił grę dalej :)

 

Pozdrawiam wszystkich GManiacków i dziekuje za pomoc

 

XaX

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
Ale musicie przyznać że takiej GRY w GMie nie widzieliście
Mmmorg w GM: http://www.wanderlustgame.com/ :)

 

Poza tym pierwsza przymiarka Borka do gry RPG Land of Nemed miała te same sprity co używasz. Teraz pracuje on nad Hidden Swords, ale już z własną grafiką. Co prawda demko nie ma multiplayera, ale patrz i podziwiaj:

https://forum.gmclan.org/index.php?showtopic=1320&st=0 ;)

Odnośnik do komentarza
Udostępnij na innych stronach

wanderlust to raczej nie mmorpg chociaz tak go nazywają twórcy, opiera się on na instancjach a do tego instancje muszą zakładać gracze a nie server automatycznie, jak to w przypadku np Guild wars

 

wanderlust nie podoba mi się, jest jakis toporny, po za tym chcę zrobić zupełnie coś innego niż to co widać w Wanderlust, jesli tylko uda zebrać mi się odpowiednie kody do zdarzeń to zobaczycie coś zupełnie nowego :)

 

Chmm gra borka jest niezla, ma sporo zdarzeń, jakie chciałbym użyć w grze i pozwoliło by mi to na dalszy rozwój gry, brakuje mi tylko trybu edytowalnego w GMie, użył w niej wiele kodów, które mógłbym wykorzystać nie trując wam głowy :)

 

Czy istnieje taka możliwość aby edytować ten plik exe z grą?

Odnośnik do komentarza
Udostępnij na innych stronach

Możliwości takiej nie ma, bo gdyby była, w sieci zaroiłoby się od plagiatów. Ale możesz spróbować napisać do Borka, możliwe, iż Ci pomoże :)

 

Pisałem. Nie odpowiada, zupełnie jakby go nie było, ostatni post ma z 2 marca :(

Odnośnik do komentarza
Udostępnij na innych stronach

if ( atakuje == false )
{

   if ( moving == 1 )
   {
   ...
   tutaj co masz do uzupelnienia
   ...
}

 

co mam tutaj uzupelnić Ranmus? bo już się zupełnie pogubiłęm ?

 

if ( mouse_button == mb_left )
{
global.potwor_id = other.id; //przypisz zmiennej globalnej numer id obiektu "other", ktory w kolizji oznacza obiekt z ktorym kolidujemy
}

 

ID obiektu to jego nazwa? i czy mam ja wpisac np. tak: global.wilk_id; ??

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