HUD w oparciu o picture - możliwości i sposoby



    O ile HUD-y najczęściej spotykane są w projektach wykorzystujących ABS, o tyle mają one szerokie zastosowanie - w końcu możemy za ich pomocą przedstawić wszystko, na co, jako twórcy będziemy mieli ochotę. Ta porada skierowana jest do tych, którzy chcieliby jakowyś HUD w swym projekcie zawrzeć, a nie mają pojęcia, jak to działać winno lub na problemy w skryptowaniu napotykają.

1. Odświeżanie.

    Dla większości ludzi chcących skonstruować HUD zasada jego działania wydaje się prosta: ot, w zależności od jakiejś wartości (dajmy na to, HP bohatera) wyświetl takie a takie cyferki lub taki, albo inny obrazek. A z tej racji, że bohater w każdej chwili może buziuchnę mieć obitą, powtarzaj to rysowanie, co standardowe RPG Makerowe 0.1s - jak oberwiemy, to zaraz HUD zostanie narysowany na nowo i będzie git.
    I właśnie to jest, moim zdaniem, najczęściej popełniany przy konstrukcji HUD-u błąd. "Ale co, gdzie błąd?". Zeskryptujcie to, panie, a zobaczycie, gdzie jest błąd. Wyświetlanie obrazków w RM zżera od cholery mocy procesora, albowiem przy każdym wywołaniu 'Show Picture' obrazek jest ładowany do pamięci od nowa. Skutek jest taki, że ustawienie pętli z 'Show Picture' oraz brakiem jakiegokolwiek czekania zmuli grę do jakichś 2FPS (Frames Per Second - klatek na sekundę). Ów 0.1 sekundowy wait nie pomaga zbyt wiele, a nawet czyni sprawę gorszą, gdyż w poprzednim wypadku gra po prostu chodziła wolno jak cholera, a teraz będzie chodzić skokowo - ułamek sekundy normalnie, potem wielki lag, gdy trzeba narysować HUD, i znowu przez chwilkę normalnie.
    Jak więc temu zaradzić? Obrazki w RPG Makerze są wyświetlane do czasu wywołania 'Erase Picture' lub zmiany mapy, więc raz narysowanego HUD-u nie musimy rysować ponownie. Ale co pan gada, panie Vegeta, przeca wartości w HUD-zie mają się zmieniać. I właśnie o to chodzi, HUD rysujemy tylko wtedy, gdy jakaś wartość się zmienia - lub, jak powiedziałem, zmieniamy mapę. Tak więc, rozwiązania istnieją, w gruncie rzeczy, dwa:

a) Sposób pierwszy
    Wywoływanie rysowania za każdym razem po zadaniu obrażeń bohaterowi. Mamy w naszym ABS-ie komendę zadającą bohaterowi obrażenia, zaraz za nią wstawiamy wywołanie HUD-u. Rysowanie HUD-u zapiszemy w Common Events, więc wywołanie HUD-u będzie polegało na 'Call Event' do zdarzenia z HUD-em.

b) Sposób drugi
    Kontrolujemy, czy wartości wyświetlane przez HUD nie uległy zmianie. Czyli, zamiast co 0.1s rysować nowy HUD, co 0.1s porównujemy, czy zmienna "HP Bohatera" wynosi tyle samo, ile aktualne HP herosa. Jeżeli nie są one równe, HP herosa się zmieniło, a więc wywołujemy rysowanie HUD-u. Tutaj potrzeba będzie dwóch zmiennych, gdyż w RM nie ma, niestety, możliwości porównania zmiennej i HP herosa. Więc, mamy zmienną pierwszą - "HP Bohatera". Tworzymy drugą zmienną, dajmy na to, "SprawdzajZmienna" i ustawiamy jej wartość na pierwszą zmienną. Następnie od "SprawdzajZmienna" odejmujemy aktualne HP bohatera (nie zmienną!). Jeżeli po tych dwu operacjach "SprawdzajZmienna" będzie różna od zera, rysujemy HUD.

2. Decentralizacja

    Jak już mówiłem, rysowanie obrazków w RPG Makerze wymaga trochę wysiłku od procesora. Dlatego też dobrym pomysłem jest rozbicie rysowania HUD-u na kilka mniejszych zdarzeń - chociażby na dwa, jego rysuje HP, a drugie manę. Oczywiście, jak najbardziej, możemy mieć, ba! - powinniśmy mieć, by rysować HUD na nowo po zmianie mapy - zdarzenie kolektywne, które wywoła po kolei każde z tych mniejszych zdarzeń.
    Dodatkowo polecam też, jeżeli wasz HUD ma wyświetlać wartości liczbowo na zasadzie XXX/YYY, gdzie XXX to aktualna wartość, zaś YYY to maksimum - ponownie rozbić to na dwa, jedna część rysująca wartość aktualną, zaś druga maksimum. Po co? A no po, że maksimum HP czy maksimum many z reguły zwiększa się tylko przy wbiciu wyższego poziomu, ewentualnie jakiś NPC może zaserwować nam +5 do HP w ramach wdzięczności za uratowanie życia. Jak widać, potrzeby, by na nowo rysować maksymalną wartość HP, gdy bohater dostaje po buzi, po prostu nie ma, bo owa maksymalna wartość się nie zmieni.
    Tak więc rozbijamy wszystko na parę mniejszych zdarzeń i wywołujemy wszystko w miarę potrzeby. Dostajemy po mordzie - odśwież wartość HP w HUD-zie; rzucamy czar - odśwież manę.

3. Rysowanie

    Tak więc. Zaczynamy od jakiejś zmiennej - niech będzie "HUDzmienna" i przypisujemy jej za wartość... no, wartość, którą chcemy przedstawić, czyli, dajmy na to, aktualne HP. Jeżeli do wywoływania rysowania HUD-u używamy drugiego sposobu, dajemy jeszcze przypisanie aktualnego HP do zmiennej "HP Bohatera" (Pamiętacie? Zmienna do kontrolowania, czy HP bohatera się zmieniło.) Teraz jeszcze tylko zastanowienie, jak nasz HUD ma wyglądać - obrazek, pasek, wartość procentowa, czy AKT/MAX?

a) Obrazek i\lub wartość procentowa
    Więc zdecydowałeś się na obrazek. Na przykład na twarz bohatera, która z czasem staje się mniej lub bardziej obita, albo która od dołu zaczyna wypełniać się czerwonymi pikselkami. Do obrazków niezbędna będzie wartość procentowa. Jak ją otrzymać? AKTUALNE HP * 100 / MAKSYMALNE HP. Mając wartość w procentach, przystępujemy do układania kolejki warunków - czy "HUDzmienna" jest równe 100? (100% HP bohatera) Jeżeli tak, narysuj obrazek (dla przykładu) "hp-10"; jeżeli nie, sprawdź, czy "HUDzmienna" jest większe od 90. Jeżeli jest - narysuj obrazek "hp-9"; jeżeli nie, sprawdź, czy "HUDzmienna" jest większe od 80 i tak dalej.

b) Cyferki
    A więc wybrałeś wartość procentową lub AKT/MAX. Tak czy owak, potrzebujesz cyferek. Jednak pierwszym, co zrobimy, będzie wyświetlenie skrzynki - gdyż zgaduję, że chciał(a?)byś pod cyferkami mieć jakąś ładną skrzyneczkę, dzięki czemu cyferki będą lepiej widoczne. Ok, jest 'Show Picture' z ustawionym "skrzynka"? Jest. Więc lecimy. Mamy naszą "HUDzmienną" z pożądaną wartością. Czas na kolejkę warunków. Jeżeli "HUDzmienna" jest większe lub równe 900, narysuj "cyfra9"; jeżeli nie - wiecie, co robić dalej, pisałem akapit wyżej. Tak więc, dotarliśmy do "HUDzmienna" większe równe 100, na tym kończymy. Ale to tylko jedna cyfra, jak na razie. Dlatego też ustawiamy operację na zmiennej: "HUDzmienna" modulus 100. Co robi modulus? Zwraca resztę z dzielenia. Ustawiając go na 100, dostaniemy liczbę z przedziału (0-99). Teraz, aby wyświetlić drugą cyfrę, znowu musimy robić kolejkę warunków. "HUDzmienna" większe równe 90, jak tak, rysuj, jak nie, sprawdzaj dalej. Mamy więc dwie cyfry. Teraz postępujemy analogicznie - modulus z 10 i znowu kolejka warunków - "HUDzmienna" równe 9, jak tak, rysuj, jak nie, sprawdzaj dalej.
    Może i powinienem o tym napomknąć wcześniej. Tak czy owak, pamiętajcie, by różnym elementom HUD-u przypisać różne numery obrazków, na przykład skrzynka ma numer 10, wszystkie 'Show Picture' dla pierwszej liczby mają numer 11, dla drugiej - 12, dla trzeciej - 13. Oczywiście, należy też pamiętać o tym, by przypadkiem nie użyć numeru wykorzystywanego przez inną część HUD-u, ale osobiście wątpię, by ktoś był aż tak zapominalski.

c) Pasek
    W przypadku paska mamy dwie, w zasadzie trzy możliwości. Pierwszy, to użycie metody sprzed dwóch akapitów - parę obrazków o różnej długości, w zależności od wielkości wartości wyświetlamy odpowiedni.
    Drugi sposób możemy zastosować, gdy pasek znajduje się przy lewej krawędzi ekranu (bo zakładam, że będzie maleć w lewo). Tak więc, tworzymy sobie trzy obrazki: podład pod pasek, sam pasek, oraz ramkę - gdyż zapewne przy pasku będzie jakaś etykieta. Obrazek o większym numerze jest przez silnik graficzny RPG Makera rysowany później, niż ten o numerze mniejszym, w związku z czym będzie on "na wierzchu". Tutaj wykorzystamy właśnie ten fakt. Wyświetlamy ramkę z numerem, dajmy na to, 10. Teraz trzeba sprawdzić długość naszego paska. Dajmy na to, że będzie miał on 250 pikseli. Przeprowadzamy więc liczenie na podobnej zasadzie, co przy wartości procentowej, jednak teraz wartością maksymalną ma być 250, a więc robimy: zmienna "PasekX" = WARTOŚĆ AKTUALNA * 250 / WARTOŚĆ MAKSYMALNA. Dla maksymalnej wartości "pasekX" będzie równe 250, co najprawdopodobniej spowoduje, że trochę wyjedzie nam za ramkę. Dlatego też od "pasekX" odejmujemy pewną wartość, jaką? - popróbujcie metodą prób i błędów. Potrzebna jest jeszcze zmienna "pasekY", którą ustawiamy na, no, odpowiednią wartość. Paskowi dajemy wyświetlanie w pozycji wskazanej przez zmienne "pasekX" i "pasekY" oraz dajemy wyższy numer, niż podkładowi. Na koniec dajemy wyświetlanie ramki - z numerem wyższym niż pasek. Jak to wszystko będzie działać? Pasek, przesuwając się wraz ze spadkiem wartości, będzie odkrywał podkład, który ma pod sobą, jednocześnie wsuwając się pod ramkę, a z tej racji, że jest ona przy krawędzi ekranu, nadmiar będzie wychodził za ekran i nie będzie wyświetlany.
    A co, gdy chcemy mieć pasek jakoś bardziej na środku ekranu? Cóż, tu należy po prostu połączyć pierwszy sposób z drugim - w różnych przedziałach wartości posługujemy się paskami o różnej długości, którym z kolei liczymy przesunięcie. Może i brzmi strasznie, ale w gruncie rzeczy starczy zrobić tak - dajmy na to, że ramka obok paska ma 25 pikseli długości, a więc pasek może się pod nią wsunąć maksymalnie o 25 pikseli. Tak więc, tworzymy sobie parę obrazków z paskami - pierwszy cały, a każdy kolejny ucięty o owe 25 z tej strony, z ktorej znajduje się ramka (pasek maleje w lewo - ucinamy z lewej strony, ALE nie zmieniając wymiarów obrazka). Teraz kolejka warunków, w zależności od tego, jaką wartość ma pasek, wyświetlamy dany obrazek. Dzięki temu, że obrazki będą takich samych wymiarów, możemy do wszystkich zastosować ten sam sposób liczenia przesunięcia.

4. Finito

    Mam nadzieję, że moje wypociny są w miarę zrozumiałe. Fakt, trochę tekstu się nazbierało - jednak z pewnością przekonacie się, że HUD należy do tych skryptów, których budowa jest prosta jak konstrukcja cepa, a więcej problemu jest z odpowiednim rozłożeniem elementów na ekranie oraz ich ułożeniem względem siebie (co by nam, na ten przykład, cyferki za bardzo nie uciekały). :)

Super Vegeta

Logowanie/Rejestracja

Login:
Hasło:
Zapamiętaj mnie
zarejestruj się
Do zespołowej pracy nad grą w RM najbardziej skłoniłby mnie:
Odpowiedni projekt
Właściwi ludzie
Komercyjny charakter produkcji
Wersja Makera
Coś innego
Nie interesuje mnie praca w zespole
zobacz wyniki | archiwum ankiet
1. Gromada
2. Septerra Core: Dream About The Past
3. Tale of Exile: Akt I
4. Qmai World 1
5. Asgun
6. Wrota Arkany 2
7. Dark Dawn
8. Wrota Arkany 3
9. Komnata
10. Manga Carta
» [VX] Project2
» EnterVPL nagrywa gry z RM
» RMgryTV
» CrashuR na Jutubach
» [XP] Kroniki Kelleńskie: Anioły i duchy
» [XP] Shaarimoth
» [XP] Akcesoria i warunki
» [XP] Wyświetlanie portretu przy wiadomości
» The Ultimate Boy - Film o naszym polskim superbohaterze!
» Pogromca II: Złodziej Kamienia [XP]
Wyspa dla Dwojga by Reaven
wersja
Pełna,
RM 2003
rok wydania
2004
ocena
7.5/10
RPG Maker Zone Kroniki Fallathanu - Prawdziwy mmoRPG w przeglšdarce Muzeum w Raccoon City: Resident Evil HQ Pokemon Valhalla
© Tsukuru Archive 2006-2016 | Używamy plików cookie.