Skocz do zawartości

Pasek życia(HP) nad postacią.


Rekomendowane odpowiedzi

Witam,

Chciałbym się zapytać jak zrobić pasek życia(HP), który będzie podążał za postacią gracza lub za wybranym przeciwnikiem.

Znalazłem kod na GMClanie na poruszanie się obiektu za wybranym obiektem i kod na pasek życia, lecz te dwa kody nie współgrają ze sobą.

Chciałbym również poprosić o szczegółowe wytłumaczenie który fragment kodu do czego służy, ponieważ też bym chciał się czegoś nauczyć ;) .

Odnośnik do komentarza
Udostępnij na innych stronach

Cześć TheMcMaciej (i witam w klubie głupich czcionek)

Prosząc o gotowca, nawet z wyjaśnieniami, nie nauczysz się wcale tak wiele. Tak naprawdę wszystko czego Ci trzeba to znajomość dwóch funkcji i kilku zmiennych. O ile ktoś mnie nie uprzedzi w wyjaśnieniach, w edicie tego posta(lub w następnym poście, jeżeli ktoś po mnie coś napisze) podam Ci wyjaśnienie czego potrzebujesz i jak to wykorzystać.

Możesz też mnie dodać na Steam dla (prawdopodobnie) natychmiastowego wyjaśnienia na bierząco: LINK STEAM

 

A i zazwyczaj nie piszę takich uprzejmych postów, więc to Twój szczęśliwy dzień.

 

Edit:

To teraz bez głupiej czcionki, żeby było czytelnie:

Założę, że ogarniasz podstawową matematykę. Jeżeli nie, to powinieneś się douczyć, bo programowanie to sporo matmy.

Najpierw zacznijmy od pojedynczych elementów:

Zmienne:

x

y

zdrowie (Twoja zmienan hp czy jakkolwiek ją nazywasz. Staraj się nie korzystać z "health" napisanego małymi literami bo już istnieje zmienna o takiej nazwie, wbudowana w gm i raczej nie będzie działać tak jak tego oczekujesz. )

zdrowie_max (Ile max HP może mieć. To dla wielkości paska)

 

Funkcje:

draw_rectangle

draw_set_color

draw_self

 

Omówienie:

Zmienne x i y określają pozycję każdej instancji obiektu na ekranie. Tak, to oś współrzędnych. Z tą różnicą, że tutaj y się zwiększa w dół a nie w górę.

GML
draw_rectangle(x1,y1,x2,y2,outline)
Rysuje na ekranie prostokąt od punktu [x1,y1] do punktu [x2,y2]. Argument "outline" określa, czy ma zrobić tylko "ramkę" tego prostokąta czy go wypełnić.

GML
draw_set_color(kolor)
Zmienia kolor rysowania na konkretny kolor. Kolor można wybrać na wiele różnych sposobów, ale ich tutaj nie opiszę.

GML
draw_self()
Rysuje obiekt na ekranie jak normalnie. Czemu jest więc potrzebny? Jeżeli dodasz do obiektu event Draw automatyczne rysowanie się wyłącza(czyli nie narysuje Ci instancji obiektu jak zwykle, a jedynie wykona to co jest w kodzie). draw_self() jest po to aby narysować dokładnie to co normalnie by się narysowało, gdybyśmy nie zrobili tego eventu Draw.

Wykonanie:

Kod powinien być wykonany w evencie Draw w obiekcie nad którego głową chcesz mieć pasek zdrowia.

Na początku powinniśmy wpisać draw_self(), ponieważ w dalszym ciągu chcemy aby oryginalny sprite postaci nam się wyświetlał.

Teraz możemy przejść do faktycznego rysowania paska hp. Ten kod będzie miał dosłownie cztery linie. Bo więcej nie trzeba.

 

draw_set_color(c_green)

draw_rectangle(x,y-10,x+(zdrowie/zdrowie_max)*20,y-3,false)

draw_set_color(c_black)

draw_rectangle(x,y-10,x+20,y-3,true)

 

Dla wytłumaczenia lini:

Linia 1: Zmień kolor rysowania na zielony

Linia 2: Narysuj wypełniony pasek określonej wielkości (w kolorze zielonym)

Linia 3: Zmień kolor rysowania na czarny

Linia 4: Narysuj obramowanie

 

Chcesz narysować pasek nad głową postaci, dlatego korzystasz z jej pozycji x i y.

Pasek ma się znajdować nad głową, więc odejmujesz 10 aby górna krawędź paska była 10 pikseli nad głową. Oczywiście możesz zmienić jak wysoko jest górna krawędź zmieniając tę liczbę.

Jeżeli chodzi o (zdrowie/zdrowie_max)*20 to tutaj jest troszkę matematyki. Dzieląc zdrowie przez zdrowie_max jesteś w stanie stwierdzić ile procent zdrowia gracz posiada(w wartości od 0 do 1). Liczba 20 to długość pełnego paska zdrowia. Czyli jeżeli gracz ma 100 na 100 HP to pasek będzie długości 20 pikseli. Jeżeli będzie miał 80 na 100 HP to pasek będzie długości (80/100)*20 = 0.8*20 = 16 pikseli. Rozumiesz zasadę. Zmieniając tę liczbę zmieniasz długość paska.

w y2 ustalasz dolną krawędź, dolna krawędź powinna być niżej od górnej(well, duh), więc odejmujesz od niej mniej niż w y1. Dlatego tak jak w y1 odejmujesz 10 tak w y2 odejmujesz 3.

W pierwszym draw_rectangle rysujesz faktyczny pasek zdrowia, drugie draw_rectangle rysuje jedynie czarną ramkę dla paska(dlatego drugi pasek zawsze dodaje maksymalną długość czyli 20.

 

Mam nadzieję, że w tak szczegółowym wyjaśnieniu zapamiętasz te podstawy.

Odnośnik do komentarza
Udostępnij na innych stronach

(i witam w klubie głupich czcionek)

To wcale nie było śmieszne. Ani troche. Poziom tego żartu określam na 2/10, a raczej 1/5 bo się skraca.

 

A i zazwyczaj nie piszę takich uprzejmych postów, więc to Twój szczęśliwy dzień.

Nie chciałbym wiedzieć jakie posty piszesz kiedy masz złe dni...

 

Możesz też mnie dodać na Steam dla (prawdopodobnie) natychmiastowego wyjaśnienia na bierząco: LINK STEAM

Pomyślę nad tym ...

 

Odnośnik do komentarza
Udostępnij na innych stronach

To wcale nie było śmieszne. Ani troche. Poziom tego żartu określam na 2/10, a raczej 1/5 bo się skraca.

Szczerze to McMaciej Cię zmazał nieźle xD

Fakt, że Twój post nic nie wniósł Vader, oprócz tego, że zwyzywałeś, jak już go karcisz to chociaż mu przy okazji pomóż. Nie zgadzam się też, że od razu musi wszystko sam robić. Moje początki w GMie wyglądały tak, że kopiowałem kod, albo używałem gotowców i próbując coś zmienić rozkminiałem co jak działa, co się stanie jak coś zmienie itp.. Poza tym nie wiem o jakim gotowcu mówisz, jedyne co mógłby sam tutaj zrobić to pogrzebać w dokumentacji, ale pewnie by i tak się zniechęcił, bo za wiele by nie zrozumiał, a przeczytałby tony tekstu.

 

Co do Twojego problemu McMaciej - to jeżeli masz kod na pasek życia to w miejsce x i y - pozycji w których rysowany jest pasek wpisz odpowiednio view_xview i view_yview.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Mówiłem, że będzie w edicie i jest.

A śmiać się mam prawo.

 

I przyznaję, że 2/10 skrócone do 1/5 było dobre.

 

A i

jeżeli masz kod na pasek życia to w miejsce x i y - pozycji w których rysowany jest pasek wpisz odpowiednio view_xview i view_yview.

 

Z tego co zrozumiałem, on chce pasek, który będzie "podążał za postacią gracza lub za wybranym przeciwnikiem", więc Twoje rozwiązanie odpada, bo to rozwiązanie do statycznego paska na HUD, co można zrobić w evencie Draw GUI bez funkcji view_*

Odnośnik do komentarza
Udostępnij na innych stronach

Wielkie dzięki za pomoc I am vader. Wszystko działa jak należy ;).

Cały tekst jest dla mnie zrozumiały oprócz tego:

w y2 ustalasz dolną krawędź, dolna krawędź powinna być niżej od górnej(well, duh), więc odejmujesz od niej mniej niż w y1. Dlatego tak jak w y1 odejmujesz 10 tak w y2 odejmujesz 3.

Nie za bardzo to rozumiem.

 

A śmiać się mam prawo.

Masz dziwne poczucie humoru ;).

 

Odnośnik do komentarza
Udostępnij na innych stronach

W draw_rectangle(x1,y1,x2,y2,outline) za pomocą y1 ustalasz wysokość górnej krawędzi paska a za pomocą y2 wysokość dolnej krawędzi.

Ok. Wszystko jest już dla mnie jasne.

 

Jakby ktoś chciał z kodu skorzystać to tutaj daje dopracowany przeze mnie kod:

W evencie Create:

GML
global.zdrowie = 100;

W evencie Draw:

GML
draw_self();

draw_set_color(c_gray);

draw_rectangle(x,y-12,x+51,y-5,false);

if global.zdrowie > 0

{

draw_set_color(c_maroon);

draw_rectangle(x,y-12,x+(global.zdrowie/100)*51,y-5,false);

}

draw_set_color(c_black);

draw_rectangle(x,y-12,x+51,y-5,true);

Pozdrawiam

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