moje weby:    Eshop - internetový obchod kde seženete parádní věcičky    www.imlok.net    elektrika (schémata, značky, postupy)    návody na deskové hry    Wordpress

iMlok.net
vodMobilPocket PCPClnkyLicenn ujednnKontakt
  

Jak psát hry 2 - teorie i praxe 2D

Datum: 16.2.2007
Konkrétně budu vše ukazovat na hře klasická patnáctka.

Základy 2D

(kód zde uveden je v C#)

Základní myslenka vůbec kódu vychází z toho, že by se měl od sebe oddělit GUI (uživatelské rozhraní - to je to co se kreslí na obrazovku a co vidí uživatel) a jádro hry. Tohle by jste si měli zapamatovat, až se dostaneme ke konkrétnímu příkladu na PPC, hojně toho využijeme.

Vykreslování

Vykreslování provedeme pčes základní formulář. A to tam ze budeme pouze metodou Paint() vykreslovat obrazek, který nám vrátí jádro (DLL knihovna). Tato metoda vykreslení celého obrázku se jmenuje DoubleBuffering. Jde v podstatě o to, že máme někde (v jádru) vytvořené 2 objekty (obrázky) typu System.Drawing.Bitmap a do nich nakreslíme všechny změny. A mezi nimi budeme přehazovat ukazatel, který obrázek vykreslit.

Základní jádro

Budeme vše psát do jedné třídy nazvané cManager(), sami si potom můžete vše rozhodit. A zde jsou potřebné metody:
1, VratObrazek - Která nám vykresli grafiku ven
2, NovaHra
3, VykresliMrizku
4, Akce

Hrací plán


No a teď dvě konkrétní řešení:
1, Souřadnicová síť
2, počítání kde se jaký objekt v danou dobu na obrazovce nachází.

U souřadnicové sítě je potřeba znát údaje: počet buněk X a Y, znát velikost buňky (je -li to čtverec). Osobně spíše pracuji se souřadnicovou sítí. Je to rychlejší a jedodušší. Uvedu názorný příklad:
Vytvoříme si třídu bunka. Tato třída bude mít property int cislo = 0;. No a z této třídy uděláme 2rozměrné pole.
bunka[][] mjPole = new bunka[4][4];
Tímto jsme si vytvořili základní souřadnicovou síť, v níž můžeme přiřazovat různé vlastnosti. Samozřejmě lze vytvořit i 1 dimezní pole a do 2 se přepočítávat. Je to jednoduché: známe pozici X (šířka) a pozici Y(výška). takze (sirkaPole * Y) + X nám dá jasnou pozici v 1rozmerném poli. Ovšem je tam potom trochu více práce. Proto doporučuji, pokud známe velikost hracího plánu, nemá tohle smysl. No a nyní jej zaplníme. Vemte si, že píšete např. plošinovku, potom vám stačí nakreslit si dlaždice (a ty ani nemusí být rovné!). Okraje mohou být různě zprohýbané apod. Takže si nakreslete pár kostek, a dejme tomu ze na našem hracím plánu budeme mít 3 kostky:
- žádná (0)
- zem (1)
- pohybující se člobrda (2)
budou to obrázky typu jpg a dáme si je souhrně do adresáře obr. A nazveme je tak jak je to v závorkách.
Vytvoříme si 2rozměrné Pole. A naplníme ho hodnotami. nejlépe nějak rozumně.
((bunka)Pole[0][0]).cislo = 0 az ((bunka)Pole[4][4]).cislo = 1
Všimněte si závorek, tomu se říká přetypování. V C# je to nutné. No a nyní si ho vykreslíme do obrázku. To nám udělá metoda VratObrazek. Projde hrubou silou v cyklu celé pole (opět nutné přetypování), pokud narazí 0 tak doplní na danou souřadnici X * mVelikostBunky, nebo a vrátí nám 1 bitmapu.

Pohyb pro hracím plánu

Opět je nutné zvážit jak se budou postavy pohybovat. Napíši dvě konkrétní řešení.
1, Máme hrací plán
- po buňkách
- samostatně
2, Pohyb bez hracího plánu - silně nedoporučuji.

Dnes se budu zabývat pohybem po hracím plánu po buňkách. Nejprve ale musíme zjistit kde uživatel kliknul. Takže is napíšeme metodu na Click() na formuláři. Zde zavoláme metodu mManager.Akce() a jako parametr ji dáme pozici myši na formuláři PointToClient(MousePosition). V metodě Akce() vypočítáme souřadnici pole: X = MousePosition.X / PocetBunek.X. A to samé pro Y. No a získané x dosadíme do našeho Pole[X][Y] a provedeme akci. Například posun doprava nebo doleva: Pole[x-1][Y] = Pole[X][Y]; ((bunka)Pole[x][Y]).cislo = 0; Dejme tomu, že to co jste se nyní dozveděli by jsme aplikovali na klasickou patnáctku. Stejný postup, jen pohyb by jsme museli zjistit zda je pole obsazeno, tzn. zkontrolovat všechna pole okolo. Pro nahoru [x][Y-1], pro dolů [x][Y+1], pro doleva [x-1][Y] a pro doprava [x+1][Y]. Samozřejmě je nutné si mezihodnotu uložit, ale to jsou opět základy.

Tipy pro psaní v C# pro PPC a PC

Neblikající obrazovka:
Aby obrazovka neblikala pod klasickýmy windows, je možné zapnout double buffering, zapíná se to obvykle v Form Load:
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
V Pocket PC vám nezbyde nic jiného než:
A, buď vykreslovat jen určitou část obrazovky metodou Graphics: Graphics g = thi.CreateGraphics();
B, Přepsat metodu:
protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs e)
{
// nechame prazdne telo, jinak predek by prave vyvolal to smazani aktualne nastavenym brushem
}

A vykreslovat celý obrázek.

Tvorba DLL + GUI:
Vytvorte si DLL knihovnu pro mobil aplikace a poté ji stačí nahrát do debug adresáře k vytořené aplikaci pro PC a nebo opět mobilní aplikaci, ale tentokráte spustitelnou.
Knihovny se dají přidávat velmi jednodušše a to tak, že na ni dáte referenci

Copyright   - MLOK -
Poet nvtev: 39738.213