xax Opublikowano 9 Maja 2006 Udostępnij Opublikowano 9 Maja 2006 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 Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 9 Maja 2006 Filar Społeczności Udostępnij Opublikowano 9 Maja 2006 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 Więcej opcji udostępniania...
xax Opublikowano 9 Maja 2006 Autor Udostępnij Opublikowano 9 Maja 2006 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 Więcej opcji udostępniania...
kasmilus Opublikowano 9 Maja 2006 Udostępnij Opublikowano 9 Maja 2006 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 Więcej opcji udostępniania...
xax Opublikowano 9 Maja 2006 Autor Udostępnij Opublikowano 9 Maja 2006 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 Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 9 Maja 2006 Filar Społeczności Udostępnij Opublikowano 9 Maja 2006 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 Więcej opcji udostępniania...
Quetzacotl Opublikowano 9 Maja 2006 Udostępnij Opublikowano 9 Maja 2006 swoją drogą zauważyłem, że dane konta i postaci są w zapisane w dll a jako, że GM nie obsluguje dll'i w podfolderach (myle sie?), to jesli gra bedzie miala wielu graczy po prostu mozna sie pogubic. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
xax Opublikowano 9 Maja 2006 Autor Udostępnij Opublikowano 9 Maja 2006 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 Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 9 Maja 2006 Filar Społeczności Udostępnij Opublikowano 9 Maja 2006 Ale musicie przyznać że takiej GRY w GMie nie widzieliścieMmmorg 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 Więcej opcji udostępniania...
Quetzacotl Opublikowano 10 Maja 2006 Udostępnij Opublikowano 10 Maja 2006 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 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
xax Opublikowano 10 Maja 2006 Autor Udostępnij Opublikowano 10 Maja 2006 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 Więcej opcji udostępniania...
Maximal Opublikowano 10 Maja 2006 Udostępnij Opublikowano 10 Maja 2006 Czy istnieje taka możliwość aby edytować ten plik exe z grą? 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 :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
xax Opublikowano 10 Maja 2006 Autor Udostępnij Opublikowano 10 Maja 2006 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 Więcej opcji udostępniania...
Maximal Opublikowano 10 Maja 2006 Udostępnij Opublikowano 10 Maja 2006 To próbuj przez gg. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
xax Opublikowano 10 Maja 2006 Autor Udostępnij Opublikowano 10 Maja 2006 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 Więcej opcji udostępniania...
Nicolas Opublikowano 10 Maja 2006 Udostępnij Opublikowano 10 Maja 2006 ID to taki unikalny nr, ktory pozwala np. rozpoznawac obiekty tego samego rodzaju. Dzieki temu traci zycia tylko jeden okreslony objekt, ktory atakujemy, a nie wszystkie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
xax Opublikowano 10 Maja 2006 Autor Udostępnij Opublikowano 10 Maja 2006 Dziekuje juz wiem czym jest ID obiektu czyli kod powinien wygladac tak: global.107237_id = other.id; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 10 Maja 2006 Filar Społeczności Udostępnij Opublikowano 10 Maja 2006 Tak, pamiętaj, że "other" działa tylko w eventach collision. 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ę