Hra Had v DelphiX II. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Hra Had v DelphiX II.

hra_had

8. února 2001, 00.00 | Pokračování úspěšného seriálu o tvorbě hry inspirované známou hrou z telefonů Nokia.



Nakreslení hada bez mezer

Jak jsem slíbil minule, ukážeme si dnes, jak nakreslit hada, aby se neskládal z kostiček, ale z jednoho kusu. Zde si můžete prohlédnout, jak bude program vypadat po dnešních úpravách (a jak zatím vypadá).


Z minule mám v proceduře OnCreate zůstalo definováno nastavení pouze šesti bodů, takže bohužel nemůžeme pořádně vidět rozdíl, a při pouze šesti bodech lze i celkem dobře usoudit směr a dráhu hada. Složitější to však již bude, pokud budeme mít definováno padesát, či třeba sto bodů. V takovémto případě se již v ocasu hada těžko vyznáme, a právě proto vytvoříme proceduru, která jednotlivé body hada "spojí" dohromady. Abyste pochopili, jak nepřehledně bude vypadat definování sto a více bodů, podívejte se zde:


Pokud si chcete také něco takového vyzkoušet a nechce se vám v proc. OnCreate psát každý bod zvlášť, stáhněte si ZDE krátký textový soubor, ve kterém je již pár bodů definováno (samozřejmě jsem ani já nepsal každý bod zvlášť, pouze jsem upravil výsledný program, aby po ukončení uložil do souboru právě jednotlivé body). Zkopírujte tento text do procedury a podle počtu bodů upravte proměnnou DelkaHadu.

Nyní si již konečně popíšeme postup při spojování částí hada. Pokud si pořádně prohlédnete první dva obrázky, zjistíte nepatrný rozdíl, který má však velikou váhu. Jedná se o to, že pokud je článek hada x+1 napravo od článku x, je u článku x vyplněna i pravá část. Tím dosáhneme zcela jednoduchou procedurou, kterou pouze zkopírujeme obrázek s vyplněnou pravou částí na pozici článku x. Pouze ještě pro jistotu zopakuji, že první článek hada má index 0 a s dalšími články se index zvětšuje. Pokud bude naopak článek hada x+1 nalevo od článku x, zkopírujeme obrázek s vyplněnou pravou částí na pozici článku x+1. Pokud bude článek x+1 nad či pod článkem x, zkopírujeme na pozici x či x+1 pouze jiný obrázek, a to s vyplněným spodkem. Potřebujeme tedy další dva obrázky, které si můžeme nakreslit např. v Malování. Oba budou mít rozměry jako článek hada, tedy 8 x 8 pixelů. U prvního vyplníme 8 x 6 pixelů černou barvou, zbytek necháme průhledný (tedy vyplníme jakoukoliv barvou a po přidání obrázků do DXImageList1.Items nastavíme tuto barvu jako průhlednou). U druhého naopak vyplníme prvních 6 x 8 pixelů a zbytek necháme průhledný. Obrázky uložíme a přidáme do DXImageList1.Items. Opět nezáleží na pořadí, pouze nastavíme vlastnost name na plnevpravo a plnedole. Zde můžete vidět, jak tyto dva obrázky vypadají (spolu s obrázkem článku hada) i trochu zvětšené náhledy:


Zde je ještě obrázek, demonstrující všechny čtyři případy pozice článků a jakým způsobem bude vyplněna mezera mezi nimi. Za obrázkem je úplný výpis procedury KresliHada (kód přidaný dnes začíná pod komentářem // kreslení hada bez mezer :



Procedure TForm1.KresliHada;
var i:integer;
begin
 for i:=DelkaHadu downto 0 do
  begin
   DXImageList1.Items.Find('plne').Draw
   (DXDraw1.surface,(Had[i].x*8)+2,(Had[i].y*8)+2,0);
  end;


 // kreslení hada bez mezer
 for i:=0 to DelkaHadu-1 do
  begin
   if Had[i+1].x > Had[i].x then     // kresli vypln vpravo na 1.
    begin
     DXImageList1.Items.Find('plnevpravo').Draw
     (DXDraw1.surface,(Had[i].x*8)+2,(Had[i].y*8)+2,0);
    end
   else if Had[i+1].y > Had[i].y then // kresli vyplň dole u 1.
    begin
     DXImageList1.Items.Find('plnedole').Draw
     (DXDraw1.surface,(Had[i].x*8)+2,(Had[i].y*8)+2,0);
    end
   else if Had[i+1].x < Had[i].x then // kresli výplň vpravo u 2.
    begin
     DXImageList1.Items.Find('plnevpravo').Draw
     (DXDraw1.surface,(Had[i+1].x*8)+2,(Had[i+1].y*8)+2,0);
    end
   else if Had[i+1].y < Had[i].y then // kresle výplň dole u 2.
    begin
     DXImageList1.Items.Find('plnedole').Draw
     (DXDraw1.surface,(Had[i+1].x*8)+2,(Had[i+1].y*8)+2,0);
    end;
  end;
end;



A u tohoto také dnes skončíme. Zde si můžete prohlédnout, že se program vypořádá i s pěkně složitým hadem, a navíc stále vidíte, kde je začátek, a kde konec:


Příště se můžete těšit na zobrazení potravy, nastavení nové pozice potravy a obsluhu klávesnice.

Download
ZDE si můžete stáhnout dnes vytvořený program a jeho zdrojáky (210 kB)

Odkazy
ZDE můžete navštívit stránku hry Had, a stáhnout si aktuální verzi i se všemi vylepšeními

.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: