[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68471)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78807)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • Tvorba her v DirectX v Delphi - 1. díl
    Chcete tvořit hry a nevíte jak na to? Že neovládáte ten správný jazyk? My vám ukážeme že pěknou hru lze vytvořit i v Delphi. Čtěte první díl našeho seriálu.
    Tvorba her v DelphiX

    Následující díl: Tvorba her v DelphiX - 2. díl
    Autor: Václav Krejčí
    Rubrika: Delphi
    Publikováno: 25.09. 2000
     Tisk článku
    Poslat odkaz emailem
     

    Ano. I když se to někomu může zdát hodně divné, právě čtete článek o tvorbě her v DELPHI. Ano, i v Delphi jdou programovat hry. Jestli lepší, či horší než v ostatních jazycích nevim, ale rozhodně to není zas až tak složité.
    Co k tomu tedy potřebujete ? Jak jistě každý asi uhodne, tak Delphi a ještě navíc komponenty DelphiX, pomocí kterých můžete programovat v DirectX (a samozřejmě musíte mít nainstalované DirectX). Kromě toho ještě kupu fantazie, trochu grafiky a hlavně hodně trpělivosti. Připraveni ? Tak začneme:

    Ti, kteří si mysleli, že naprogramují Quake 5 nebo něco podobného musím hned na začátku zklamat. Pokud si ale přečtete a pochopíte všechny články o tvorbě her, měli byste být schopni sami naprogramovat hru podobnou hře ufo ( ufo.zip 0.5 Mb).
    Na začátek bych napsal jednu radu, která se právě při tvorbě her hodí nejvíc - pokud děláte hru, a uděláte v ní výraznou změnu, hned ji uložte do nového adresáře ( např. hra v. 1.5 ). V případě, že ve hře poté uděláte chybu, na kterou nebudete moci příjít, máte možnost se vrátit k verzi předchozí.

    První program v DelphiX...

    Nechme už ale povídání, a pusťme se do tvorby. Náš první projekt nebude umět nic jiného, než zobrazit na pozici obrázek. To ještě samozřejmě není hra, ale musíme začít něčím jednoduchým. 

    Nejprve tedy spusťte Delphi a  vytvořte nový projekt. Z palety komponent DelphiX vložte na formulář komponenty DXDraw (), DXTimer () a DXImageList (). Princip programu bude jednoduchý - DXTimer se bude starat o to, aby se na DXDraw vykresloval obrázek z DXImageList. U komponenty DXImageList nastavíme vlastnost DXDraw na DXDraw1 a klinutím na Items vlastnost se nám otevře seznam nahraných obrázků. Zatím je prázdný, a proto tlačítkem Add New přidáme novou položku. Klineme na ni a vlastnost Name nastavime např. na obrazek. Nyní klikneme na vlastnost Picture a nahrajeme již samotný obrázek (tlačítkem Load), např. obrázek ufa.
    Pokud chceme, aby byl obrázek průhledný, nastavíme vlastnost Transparent na true, vlastnost TransparentColor pak určuje průhlednou barvu. Položky DXimageListu nyní zavřeme, jelikož vše potřebné již máme hotové, a přesuneme se ke komponentě DXTimer. Ta, obdobně jako standartní komponenta Timer provádí proceduru OnTimer každých x milisekund, které určuje vlastnost Interval. Pokud v komponentě DXTimer nastavíme Interval na 0, bude se komponenta snažit provádět proceduru OnTimer co nejvíckrát to půjde. Počet snímků za sekundu, nebo-li FPS (frames per second) je ve vlastnosti DXTimer.FrameRate. Komponenta DXTimer má navíc ještě vlastnost ActiveOnly typu boolean, která určuje, má-li být timer neaktivní, i když je okno neaktivní. K tomu náleží i dvě procedury OnActive a OnDeactive. Těmi se ale teď nebudeme zabývat, a přistoupíme k proceduře třetí, a to OnTimer. Poklepáme myší na prázdné políčko a můžeme již psát kód. Zde je na čase popsat proceduru, pomocí které budeme vykreslovat obrázek na povrch DXDraw:

    procedura DXImageList1.Items[x].Draw(Dest, x, y, patternIndex)

    Tato procedura prostě nakreslí obrázek x komponenty DXImageList1 na povrch Dest (v našem případě DXDraw1.surface) na pozici x, a y. PatternIndex určuje vzorek, ten zatím necháme na nule. A to je vše. Jak prosté. Zde je výpis celé procedury:

    procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
    begin
    // pokud z jakéhokoliv důvodu nemůžeme na
    // povrch DXDraw kreslit, rovnou z procedury vyskočíme

    if not DXDraw1.CanDraw then exit;

    // povrch DXDraw1 vyplníme černou barvou
    // == vymažeme předchozí kresby

    DXDraw1.Surface.Fill(0);

    // na pozici 0,0 nakreslíme obrázek
    // 0 z DXImageListu

    DXImageList1.items[0].Draw(DXDraw1.surface,0,0,0);

    // nakonec procedura flip,
    // abychom to také viděli

    DXDraw1.Flip;
    end;

    Jak vidíte, v proceduře se nám vyskytly ještě další procedury, které jsou popsány dále. Začněme tedy prvním řádkem. Vlastnost DXDraw1.CanDraw určuje, zda můžeme na povrch kreslit. Pokud tomu tak není, první řádek se postará o to, aby nedošlo k chybě a rovnou z procedury vyskočí. Procedurou Fill vyplníme povrch DXDraw danou barvou (0 = černá), čímž všechny předchozí kresby z obrázku vymažeme. Pomocí proc. Draw nakreslíme obrázek na pozici 0,0 a nakonec skrytý povrch zobrazíme proc. Flip. Nyní můžeme projekt přeložit a spustit klávesou F9, a pokud se Vám opravdu zobrazuje obrázek v levém horním rohu, udělali jste program správně a můžete všem říkat, že jste udělali program v DirectX :) Tím to ale samozřejmě nekončí, to je teprve začátek...

    Program druhý - trocha pohybu neuškodí...

     Tedy myslím pohybu obrázku, jelikož dívat se, jak se obrázek zobrazuje pořád na stejné pozici je po chvíli...nudné. Jako základ nám může posloužit program předchozí, do kterého pouze doplníme trochu kódu. Ten se postará o to, aby se obrázek při každém volání proc. OnTimer zobrazil na jiném místě (pozn. - pokud jste měli vlastnost DXTimer.Interval nastavenou na 0, nebo jiné malé číslo, je dobré jej trochu zvětšit, aby se Vám potom nedělali mžitky před očima). pro tvorbu náhodného čísla použijeme procedury Random(x), která vytvoří náhodné celé číslo od 0 do X. V sekci public tedy definujeme dvě proměnné x a y typu integer a mezi procedury Fill a Draw tedy vložíme následující kód:

    // nastavení náhodné pozice obrázku
    x:=Random(DXDraw1.SurfaceWidth-DXImageList1.Items[0].Width);
    y:=Random(DXDraw1.SurfaceHeight-DXImageList1.Items[0].Height);

    a proceduru Draw změníme na: 

    // na pozici x a y nakreslíme obrázek
    // 0 z DXImageListu

    DXImageList1.items[0].Draw(DXDraw1.surface,x,y,0);

    Jak sami vidíte, x a y obrázku bude nanejvýš takové, aby se zobrazil těsně u kraje okna a tedy abychom ho vždy viděli. Program můžeme zase přeložit a spustit klávesou F9 a pokud je vše v pořádku, bude se objevovat obrázek na náhodných místech. Obrázek se již hýbe, ale jak udělat, aby létal po obrazovce a odrážel se od stěn ?

    Program třetí - létání a odrážení od stěn...

    A konečně program třetí, a pro dnešek již poslední. V tomto programu si ukážeme, jak naprogramovat, aby sprite létal sem a tam a odrážel se od krajů okna. Pro pohyb budeme používat trochu jiné techniky, než ve článku o animaci spritu v Delphi a která nám dovolí, aby sprite nelétal pouze pod úhly 45°. Princip je ale stejně jednoduchý - kromě prom. x a y si defunujeme ještě IncX a IncY a při každém volání proc. OnTimer k x přičteme IncX a k Y přičteme IncY. Teď si ale řeknete - to je sice hezké, ale v tom případě poletí sprite pouze dolů a doprava. Tak to ale není. Pokud se sprite dostane ke kraji okna, změní se IncX nebo IncY (podle toho, ke kterému kraji okna) na záporné číslo. A jelikož + a - je mínus, bude se sprite pohybovat na druhou stranu ! A pokud se dostane ke kraji doleva nebo nahoru, je to přesně naopak. Navíc k IncX a IncY přiřazujeme náhodně číslo (samozřejmě kladné, nebo záporné) o kolik se má sprite pohnout, a proto letí pod různými úhly. Vyzkoušet si to můžete ostatně sami.Do sekce public přidejte proměnné IncX a IncY typu integer. Zde je kód procedury OnTimer:

    procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
    begin
    // pokud z jakéhokoliv důvodu nemůžeme na
    // povrch DXDraw kreslit, rovnou z procedury vyskočíme
    if not DXDraw1.CanDraw then exit;

    // povrch DXDraw1 vyplníme černou barvou
    // == vymažeme předchozí kresby
    DXDraw1.Surface.Fill(0);

    // vypočítáme novou pozici obrázku
    x:=x+IncX;
    y:=y+IncY;
    if x >= DXDraw1.Surfacewidth-DXimageList1.Items[0].Width
    then IncX:=-(Random(5)+1);
    if x <= 0 then IncX:=Random(5)+1;
    if y >= DXDraw1.Surfaceheight-DXImageList1.Items[0].height
    then IncY:=-(Random(5)+1);
    if y <= 0 then Incy:=(Random(5)+1);

    // na pozici x,y nakreslíme obrázek
    // 0 z DXImageListu
    DXImageList1.items[0].Draw(DXDraw1.surface,x,y,0);

    // nakonec procedura flip,
    // abychom to také viděli
    DXDraw1.Flip;
    end;

    Nakonec ještě přidejte proceduru Form1.OnCreate do které přidejte následující:

    x:=Random(DXDraw1.SurfaceWidth-DXImageList1.Items[0].Width);
    y:=Random(DXDraw1.SurfaceHeight-DXImageList1.Items[0].Height);
    IncX:=Random(5)+1;
    IncY:=Random(5)+1;

    To zajistí, aby se při startu programu sprite objevil na náhodném místě a pohybovat se náhodou rychlostí náhodným směrem.

    Download:
    Hra UFO (0.5 Mb)

    Screenshot:




    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.69
    (Počet známek: 5984)

    Komentáře k článku
    Sir End04.01.17:49Nefunkční program
    mak11.07.17:54RE: Nefunkční program
    hnvisxbf06.10.9:06hnvisxbf
    zocor07.09.13:39zocor
    generic effexor07.09.19:33generic effexor
    Jackxl24.10.14:43DirectX a DLL
    Jackxl21.10.22:07Problem s bodem 1
    Jackxl21.10.22:13RE: Problem s bodem 1
    Gregi02.04.0:08error
    Jesrei12.09.22:16RE: error
    Risk28.03.15:19DELPHI X PRO DELPHI 6
    synonym26.11.17:49serte na directX & delphiX
    Jifik07.06.19:54OpenGL vs DirectX
    egg14.10.18:45RE: OpenGL vs DirectX
    jjhsdasdgdfhs18.05.19:48Borland Delphi
    jjhsdasdgdfhs18.05.19:47Borland Delphi
    sdsd17.05.21:17Delphi
    Pamposek09.01.16:34Pomale pixely
    Rift20.02.16:47RE: Pomale pixely
    vita28.10.8:21kji
    Msoft03.11.9:31RE: kji
    Slavo14.10.20:58NOVY TEAM
    Muerte06.10.17:10Kde seženu DelphiX pro Delphi6 ?
    MIRA 120.09.13:17Co musím udělat, abych vytvářel hry
    Rift21.02.17:10RE: Co musím udělat, abych vytvářel hry
    MIRA 120.09.13:14k
    Miso*17.02.14:05DelphiX pre Delphi 6
    Pavel Vondruška25.11.16:04DelphiX pro DELPHI7
    Tomáš Blažek21.06.12:19RE: DelphiX pro DELPHI7
    Integrál24.10.11:04RE: RE: DelphiX pro DELPHI7
    MSoft03.11.9:34RE: RE: RE: DelphiX pro DELPHI7
    Hlina23.02.15:25RE: RE: RE: DelphiX pro DELPHI7 - jak nainstalovat
    Alex12.06.10:26RE: RE: RE: RE: DelphiX pro DELPHI7 - jak nainstalovat
    Gnaag30.10.12:45RE: RE: RE: RE: RE: DelphiX pro DELPHI7 - jak nainstalovat
    Michal Machovic23.10.14:19DESIGN STUDIOS
    Miro-SK30.09.9:37Aj ja by som sa rad pridal do tymu
    Jakub Mareš17.06.14:38Mam Delphi 6.Je na něj Delphi X??Prosím pomožte!!
    PMan07.07.0:20RE: Mam Delphi 6.Je na něj Delphi X??Prosím pomožte!!
    Bobík24.08.20:06RE: RE: Mam Delphi 6.Je na něj Delphi X??Prosím pomožte!!
    Martin Daucik17.05.14:56DELPHI ---> C++
    mirek*26.10.10:57Joystik*
    gaspoda17.10.20:02alternativní 3d engine
    Martin17.05.14:48RE: alternativní 3d engine
    Slavo04.10.2:09DelphiX
    Robowlf09.07.10:44Kde najdem komponenty pre Direct X
    Autor27.08.17:39RE: Kde najdem komponenty pre Direct X
    Jaromír KRPEC23.01.13:13Chceme založit nový tým na vývoj PC Her.
    3Dthief29.01.14:04RE: Chceme založit nový tým na vývoj PC Her.
    Jakub Mareš17.06.14:33RE: RE: Chceme založit nový tým na vývoj PC Her.
    Filip14.04.9:24RE: Chceme založit nový tým na vývoj PC Her.
    Timothy04.05.19:35RE: RE: Chceme založit nový tým na vývoj PC Her.
    Magiksoft11.08.19:39Magiksoft RE: Chceme založit nový tým na vývoj PC Her.
    Frank Toman11.10.10:47RE: Chceme založit nový tým na vývoj PC Her.
    Jan žitník12.02.14:05RE: Chceme založit nový tým na vývoj PC Her.
    Miso-SK17.12.20:16hry v delphiX
    vitek28.11.20:25grafika
    Michal Svoboda06.11.14:11Co se takhle pridat k tymu, co existuje?
    Zdenek Susky03.01.23:06RE: Co se takhle pridat k tymu, co existuje?
    David20.10.21:35O TEN TYM BY SOM MAL ZAUJEM ALE IBA ZACINAM
    Kamil F21.10.18:34RE: O TEN TYM BY SOM MAL ZAUJEM ALE IBA ZACINAM
    Tomáš Koloušek09.10.11:28Spousteni se starsi verzi Dx
    HaT05.10.1:12Kde sehnat DelphiX
    Václav Krejčí05.10.17:11RE: Kde sehnat DelphiX
    Iso09.10.21:29Help DelphiXu
    Zemla27.08.13:17RE: RE: Kde sehnat DelphiX
    Honza28.09.17:41DirectX v C++ Builder
    Mirek Scholze jr.06.10.21:34RE: DirectX v C++ Builder
    David Majda25.09.20:28A co Direct3D?
    Jmm02.10.16:44Tvorba her
    Kamil F.15.10.19:23RE: Tvorba her
    Václav Krejčí17.10.16:51Co takhle založit nový tým....
    Kamil F.21.10.18:33RE: Co takhle založit nový tým....
    Martin Polak03.11.14:38RE: RE: Co takhle založit nový tým....
    Pavel Aubrecht10.11.13:12RE: Co takhle založit nový tým....
    Zdenek Susky03.01.23:17RE: RE: RE: Co takhle založit nový tým....
    Martas24.01.19:28RE: RE: RE: RE: Co takhle založit nový tým....
    Betonak02.02.15:24RE: RE: RE: RE: Co takhle založit nový tým....
    Wirg29.04.22:41RE: Založíme?
    Timothy04.05.19:34RE: Co takhle založit nový tým....
    Martin17.05.14:52DELPHI ---> C++
    Vojta20.03.20:13ja chci taky do tyymu!!!
    Nitramus13.11.22:06RE: Tvorba her
    Tum0r08.04.13:17RE: RE: Tvorba her
    petr21.05.16:44RE: A co Direct3D?
    eax27.07.19:23RE: RE: A co Direct3D?
    09.10.17:39Odpověď na: "Serte na všechno"
    g.freeman02.05.16:18RE: Odpověď na:
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena