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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
procedure TGracz.RysujPasekZycia; var dx:integer; begin //przechwyć wcisnięcie klawisza "I" if oisbutton2 in Form1.OmegaInput1.keyboard.statesclicked then fPokaz:=not fPokaz; if not fPokaz then exit; //rozpocznij proces rysowania paskow zycia //normuj do długosci 32 pikseli dx:=round(Zycie*32/Zycie0); //czerwona linia Form1.OmegaScreen1.LineH(Round(x+dx),Round(x+32),Round(y),200,0,0,2); //zielona linia Form1.OmegaScreen1.LineH(Round(x),Round(x+dx),Round(y),0,125,0,2); end; |
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
1 2 3 4 5 6 7 8 9 |
procedure TGracz.Draw; begin inherited Draw; RysujPasekZycia; end; |
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.
Pozdrawiam oksal
Autor: oksal