16. fejezet: Egy összetett grafikus alkalmazás

Ebben a fejezetben összeállítunk egy egyszerű játékot, amelyben egy képernyőn feltűnő labdát kell elkapni minél többször. Még mindig az IDE eszközeivel dolgozunk, és nem készítünk saját objektumot.

A projekt alapjai

Hozz létre egy új projektet, és mentsd el egy saját mappába (jatek), jatek néven (mármint az .lpi fájlt, mert a unit1.pas neve marad).

A labdát tetszőleges rajzolóprogrammal elkészítheted, a kép mérete legyen 64x64 pixeles. Mentsd el labda.png néven (és png formátumban!) a jatek mappába.
Helyezz el a formon egy TImage típusú objektumot (az Additional fülön találod az eszköztáron), ez lesz az Image1. Keresd meg a Picture tulajdonságát, és ott töltsd be a képet. Az Image1.Height és Width tulajdonságot állítsd 64-re.
Mivel a kép mindig téglalap alakú tartomány, a formon a labda körül látszik a téglalap alakú háttér. Az átlátszóság kezelésére az egyszerűbb rajzprogramok nem alkalmasak, szerencsére ilyenkor is kiválaszthatunk a képen egy átlátszó színt. Ez a kép bal alsó pixelének a színe lesz. Állítsd az Image1.Transparent tulajdonságot True-ra!

Szükségünk lesz még egy indítógombra (TButton típusú Button1), és egy pontokat számoló feliratra (TLabel típusú Label1). A Label1.Font.Size tulajdonságot állítsd 20-ra, a Button1.Caption-t írd át! Eddig így néz ki:
labdás screenshot

Inicializálás

Vannak olyan műveletek, melyeket a program indításakor egy alkalommal végre kell hajtani (inicializálás, vagyis a kezdőértékek beállítása). Ez konzolalkalmazásnál egyszerűen a BEGIN utáni rész lenne. Egy eseményvezérelt programnál azonban minden eljárást egy esemény indít be.
Szerencsére van egy olyan esemény, amely a program indításakor egyszer megtörténik, ez pedig a form létrehozása.  Az objektumfelügyelőben lépj vissza a Form1-re, és keresd meg az OnCreate eseményt. A ...-ra kattintva az IDE létrehozza a TForm1.FormCreate eljárást. Itt most ez szerepeljen:
Label1.Caption:='Kapd el a labdát!';
Nem szerencsés, ha a labda máris látszik, folytassuk:
Image1.Visible:=False;

Időzítő

A labda bukkanjon fel 1 másodpercenként. Ez egy olyan esemény, amelyet nem felhasználói beavatkozás vált ki, hanem egy időzítő. Helyezz el a formon egy TTimer típusú objektumot (Timer1), ez a System fülön van. A program futása közben ez nem fog látszani. Legfontosabb tulajdonságai: Enabled (működik-e), Interval (hány ezredmásodpercenként váltsin ki eseményt) és maga az OnTimer esemény.
Az Interval értéke 1000 lesz (1 másodperc), viszont az Enabled legyen False, hogy a program indításakor még ne mozgassa a labdát.

Következzen az OnTimer esemény elkészítése. Ide beírhatnánk a labda odébbrakását, de gondoljuk végig, hogyan fog működni a játék. Ha a felhasználó rákattint a labdára, azt akkor is odébb kell tenni, hogy ismételt kattintásokkal ne lehessen egyszerre sok pontot szerezni. Ezért a labda odébbrakását célszerűbb külön eljárásba tenni. Ez az eljárás az implementation szekcióba kerüljön, de a TForm1 dolgai elé. Az 53. feladat alapján:
procedure hopp;
begin
  Form1.Image1.Left:=random(Form1.Width-Form1.Image1.Width);
  Form1.Image1.Top:=random(Form1.Height-Form1.Image1.Height);
end;

Mivel ez nem a TForm1 eljárása, mindenhová ki kell írnunk a Form1-et. A width utasítás használatával kijelölhető a következő utasításban használt objektum, így rövidebben:
  with Form1 do begin
    Image1.Left:=random(Width-Image1.Width);
    Image1.Top:=random(Height-Image1.Height);
  end; 

Az Image1.Height helyett írhattunk volna 64-et is, de így jobb, mert más méretű képpel is működik.

Most már csak a Timer1 OnTimer eseményét kell elkészítenünk, amely a hopp eljárást hívja meg.

Első kísérlet

Meg kell írnunk a Start gomb eseménykezelőjét. Ez bekapcsolja az időzítőt, és láthatóvá teszi a labdát. (Az eljárás vázát az IDE készítse el!)
procedure TForm1.Button1Click(Sender: TObject);
begin
  Timer1.Enabled:=True;
  Image1.Visible:=True;
end; 

A játék természetesen még nem működik, de érdemes ezt a változatát is kipróbálni, mert így egyszerűbb a hibakeresés.

Pontozás

Szükségünk lesz egy pont egész típusú változóra, amely a pontszámot tárolja:  ezt az implementation szekcióba tedd, a TForm1 dolgai elé!
A Button1Click-et egészítsd ki a pont nullázásával!
A programnak reagálnia kell a labda elkapására. Az Image1-nek is van OnClick eseménye. Ez növeli és ki is írja a pontszámot, majd odébb teszi a labdát. Ekkor az időzítőt is újra kell indítanunk, hogy megint 1 másodperctől számoljon vissza.
procedure TForm1.Image1Click(Sender: TObject);
begin
  pont:=pont+1;
  Form1.Label1.Caption:=IntToStr(pont);
  hopp;
  Form1.Timer1.Enabled:=False;
  Form1.Timer1.Enabled:=True;
end; 

Az IntToStr függvényre azért van szükség, mert a Caption típusa string.

És már működik is a játék! Ha valahol elakadtál volna, a lap alján letöltheted a forráskódot.





ċ
unit1.pas
(1k)
András Lutter,
2015. júl. 25. 14:22
Comments