NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Lekce 7 - XNA tvorba ve 3D - Engine integrace do hry

Vítejte po osmé. V minulé lekci, XNA tvorba ve 3D - Engine podruhé a ne naposledy, jsme si dokončili základ našeho 3D enginu.

V dnešním díle psaném od šesti ráno se podíváme na to, jak námi vytvořený místy balast používat. Už v prvním díle o enginu jsme si nalinkovali výslednou knihovnu do projektu se hrou. Otevřeme si tedy soubor Game1.cs. Vložíme jmenný prostor s enginem:

using VodacekEngine;

Dále si vytvoříme proměnnou, kde budeme engine skladovat:

Engine Engine;

A v metodě LoadContent ji inicializujeme. Je to nutné provést právě zde a nikde jinde. Protože je možné, že ihned po vytvoření enginu přidáme okno a nějaké ty komponenty a ty budou potřebovat nahrát obsah.

Engine = new Engine(this);

Engine by tedy byl připravený. Do metod Update a Draw přidáme volání stejných metod našeho enginu a veškerá příprava ve hře je hotova.

Engine.Update(gameTime);

a

Engine.Draw(gameTime);

Skvěle. Vše podstatné jsme provedli. Jak vidno implementace je velmi snadná. Když nyní pustíme naši hru, vidíme naše krásné modré nic. Může se zdát, že celé to martyrium jsme podstoupili zbytečně, protože výsledek je stejný jako předtím. Vytvoříme si tedy naši první komponentu. Nebude to nic světoborného, pouze barevné pozadí. Přidejme si tedy do enginu složku Components, kde budeme naše komponenty skladovat. Uvnitř pak soubor BarevnePozadi.cs nebo jakýkoliv název, který vás pro to napadne. Učiníme třídu veřejnou. Pozměníme jmenný prostor tak, aby se shodoval s tím u enginu. Přidáme také knihovny XNA:

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

Nezapomeňte také, aby třída dědila ze třídy Component.

namespace VodacekEngine{
    public class BarevnePozadi: Component{
    }
}

Naše nová komponenta bude v konstruktoru přebírat barvu a s tou bude posléze "čistit" celou obrazovku okna. Vytvoříme si tedy konstruktor přebírající v parametru naši barvu a také proměnnou, kde si barvu budeme schovávat:

public Color Barva{
  get;
  set;
}

public BarevnePozadi(Color barva){
  Barva = barva;
}

Dále bude potřeba přepsat metodu Draw, kde potom pouze naší barvou vyčistíme celé herní okno. Jistě si vzpomenete, že tento příkaz jsme již potkali ve hře samotné. Musíme se přes herní okno ve kterém komponenta bude umístěna dostat k enginu ,kde máme instanci třídy GraphicsDevice a tam zavolat metodu Clear:

public override void Draw(){
  Parent.Engine.GraphicsDevice.Clear(Barva);
}

Nyní je vše připraveno. Vrátíme se do třídy s naší hrou, konkrétně do metody LoadContent, kde na nás čeká vytvořená instance enginu. Přidejme si tam proměnnou okno s herním oknem. Pojmenujeme si jej přízračně jako okenko:

GameScreen okno = new GameScreen("okenko");

Toto okno přidáme na vrchol našeho zásobníku v enginu:

Engine.PushGameScreen(okno);

A do okna přidáme nově vytvořenou komponentu našeho barevného pozadí s oranžovou barvou:

okno.AddComponent(new BarevnePozadi(Color.Orange));

To je vše. Opravdu je to vše. Více toho potřeba udělat není. Když si nyní hru spustíme, uvidíte namísto modré barvu oranžovou. Tedy pokud někde nemáte chybu. Pořadí, které jsem naznačil výše, je nutné dodržet. Nejprve přidáváme herní okno do enginu a pak komponenty do něj. Tento způsob se ovšem hodí pouze pro potřeby testování. Je rychlý na napsání, ale většinou budeme používat způsob jiný. Vytvoříme si třídu, která bude dědit od našeho herního okna. Nazveme si ji třeba MojeHerniOkno. Opět ji učiníme veřejnou a přidáme potřebné jmenné prostory:

using VodacekEngine;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

Třída bude dědit od herního okna takže to provedeme a vytvoříme konstruktor:

public MojeHerniOkno()
  : base("Moje herni okno"){

}

Komponenty budeme přidávat jak jsem naznačil v minulém díle v chráněné metodě Load, proto si ji přepíšeme a přidáme v ní naše oranžové pozadí:

protected override void Load(){
  AddComponent(new BarevnePozadi(Color.Orange));
}

Zbavíme se předešlého kódu a v metodě LoadContent přidáme naše herní okno:

Engine.PushGameScreen(new MojeHerniOkno());

Nic více nic méně. Pokud nyní hru spustíme, uvidíme krásně oranDžové okno. :-)

Herní obrazovka enginu v XNA - Základy 3D grafiky a tvorba enginu

Uf. Byla to místy fuška dostat vás všechny až sem. Alespoň doufám, že jsem vás dostal všechny až sem. Pokud by byl někde problém, tak víte kde se máte ptát buď v komentářích zde pod článkem nebo porovnejte svůj výsledek s mojím. A co příště? Popravdě nevím, ale stejně je to jedno, bude konec světa, takže to vlastně i bude jedno. Jako úkol byste si ale mohli zkusit vytvořit komponentu, která by měnila barvu v čase (použili byste metodu Update) třeba od jedné barvy k druhé.

A teď už vážně :). V příští lekci, XNA tvorba ve 3D - Sprity a Text, se podíváme na Sprity a Text.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 264x (1.59 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
XNA tvorba ve 3D - Engine podruhé a ne naposledy
Všechny články v sekci
Základy 3D grafiky a tvorba enginu
Přeskočit článek
(nedoporučujeme)
XNA tvorba ve 3D - Sprity a Text
Článek pro vás napsal vodacek
Avatar
Uživatelské hodnocení:
4 hlasů
Vodáček dělá že umí C#, naplno se již pět let angažuje v projektu ŽvB. Nyní studuje na FEI Upa informatiku, ikdyž si připadá spíš na ekonomice. Není mu také cizí PHP a SQL. Naopak cizí mu je Java a Python.
Aktivity