Pobierz kod PASEKZYCIA
Jak zrobić pasek stanu życia w grze 2D?
Kod przykładu został utworzony w DELPHI + OMEGA.
Poniżej spodziewany efekt rozwiązania
Powiedzmy, że mamy obiekty w naszej grze, które cechują się różną maksymalną wartością punktów
życia początkowego, a chcemy otrzymać jednolite długości pasków, to znaczy wyeliminować taką
sytuację jak na poniższym rysunku
Aby długości pasków były znormalizowane do pewnej ustalonej wartości należy:
a) wybrać tę wartość (w przykładzie wybrałem 32)
b) przeskalować punkty stanu życia - linia zielona
c) uzupełnić brakujące punkty życia (linia czerwona) do przyjętej wartości - tu 32
Tak więc mamy gotowy przepis. Fragment kodu, który to wykonuje przedstawiam poniżej
Do rysowania linii posłużyła procedura LineH komponentu OmegaScreen. Jej parametry to
- współrzędna X początku linii
- współrzędna X końca linii
- współrzędna Y linii
- kolejne to składowe kolorów (czerwona, zielona, niebieska)
- ostatnia to wartość grubości linii
Teraz należy się zastanowić w którym momencie wywoływać ten kod?
Jeśli linia życia ma się pokazać dla każdego widocznego i żyjącego obiektu, to nasuwa się
prosty pomysł aby zrobić to w pętli po utworzonych obiektach. Niestety nie będzie, to najwłaściwsze
podejście. Utworzymy bowiem dodatkową pętle...Szkoda będzie na nią czasu.
Postąpimy inaczej. Nasze duszki są klasą TSprite. Rysowanie tej klasy w OMEDZE zajmuje
się procedura Draw komponentu OmegaSprite, która jest cyklicznie wywołana w zegarze aplikacji.
Tak więc rysowanie linii życia duszka umieścimy w jego procedurze Draw, tak jak poniżej
Dodatkowo w przykładzie można ukryć/ pokazać linie jeśli z klawiatury klawiszem "i"
zmienimy flagę rysowania fPokaz na false.
Można linie życia rysować również i w taki sposób, że wykorzystujemy gotowe bitmapy. Ale stracimy na prędkości.
Pytanie dlaczego? Dlatego, że każda taka bitmapa linii będzie pochodną klasy TSprite (dla każdego obiektu
musimy utworzyć zieloną i czerwoną bitmapę linii lub kolejne klatki takich linii), a takie utworzenie
równoznaczne jest z wykonywaniem dla tych linii procedur Move, Draw, Dead (bo to też duszki).
I to by było na tyle. Pozostałe procedury są obudową tego przykładu.
KONIEC