2D hra v XNA - 2. díl - Pozadí a základní herní objekt
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

2D hra v XNA - 2. díl - Pozadí a základní herní objekt2D hra v XNA - 2. díl - Pozadí a základní herní objekt

 

2D hra v XNA - 2. díl - Pozadí a základní herní objekt

Google       Google       28. 9. 2008       34 352×

V dnešním díle seriálu se podíváme na Content Pipeline, hře vytvoříme pozadí, napíšeme třídu základního herního objektu a na závěr vám povím něco o vektorech.

Reklama
Reklama

Vítejte zpět u seriálu o tvorbě 2D hry v XNA Game Studiu. Dnes do hry přidáme pozadí a třídu základního herního objektu.

Přidání obsahu

Jak jsem psal v minulém díle, seriál bude z větší části založen na videotutoriálu z creators.xna.com, takže i obsah bude odtud, jsem totiž výtvarný antitalent. Potřebné soubory naleznete zde. Soubory nakopírujte do složky Content přes Solution Explorer.

Content Pipeline

XNA s sebou přineslo zajímavou novinku, a tou je Content Pipeline. Je to rozhraní pro načítání a práci s herním obsahem (textury, shadery, modely, …). Při kompilaci se všechen obsah složky Content zkonvertuje do formátu xnb a přidá do Content Pipeline. Je to především kvůli Xbox 360, který neumí pracovat se soubory tak, jako Windows a pomocí Content Pipeline mu to usnadníme.

Pozadí

Pozadí bude první věc, co si dnes naprogramujeme, nic těžkého.

Viewport rectangle

Ze všeho nejdřív si vytvoříme viewport rectangle. Viewport rect. je obdélník s velikostí plochy, na které se promítá hra. Díky němu můžeme umísťovat objekty na relativní pozici, roztahovat sprity na celou plochu (pozadí) nebo kontrolovat, zda je nějaký bod mimo "obrazovku".

Pro jeho implementaci ve hře, deklarujeme v třídě Game1 nový statický člen viewportRect typu Rectangle a v metodě LoadContent jej nastavíme na velikost viewportu.

viewportRect = new Rectangle(0,0,
                graphics.GraphicsDevice.Viewport.Width,
                graphics.GraphicsDevice.Viewport.Height);

Načtení pozadí

Ve třídě Game1 deklarujeme proměnnou background typu Texture2D.

private Texture2D background;

A v metodě LoadContent do ní načteme texturu pozadí.

background = Content.Load<Texture2D>("Sprites\\background");

Pokud jste se ještě nesetkali s lomenými závorkami, tak vám povím, že metoda Load je generická, generika je způsob, jak se zbavit boxingu a unboxingu. Generika umožňuje pracovat s objekty, o kterých nevíme, jakého typu jsou. Známý příklad je generická třída List.

Za názvy načítaných souborů nemusíte psát žádnou příponu, stejně to bude mít po kompilaci všechno příponu xnb.

Vykreslení pozadí

K vykreslování spritů používáme objekt spriteBatch. Všechny prvky, které chceme zobrazit, musíme vykreslit mezi voláním metod spriteBatch.Begin a spriteBatch.End. Příprava grafického zařízení pro vykreslení spritu totiž chvíli trvá a když vykreslíme několik spritů najednou, ušetříme tím mnoho času. K vykreslení samotných spritů se používá metoda spriteBatch.Draw.

Do metody Draw si přidejte tento kód:

spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
spriteBatch.Draw(background, viewportRect, Color.White);
spriteBatch.End();

Metodu spriteBatch.Begin voláme s parametrem SpriteBlendMode.AlphaBlend. Tento parametr nám umožní použít alpha blending. Metodě spriteBatch.Draw předáváme sprite, viewport a barvu osvětlení, bílá nechá sprite takový, jaký je.

Základní objekt

Podstatou naší hry bude sestřelování létajících těles pomocí viditelných střel z objektu, který nemění pozici, jen rotuje. Pro tyto účely nám bude stačit jednoduchá třída GameObject která ponese informace o spritu, pozici, rotaci a středu a třídy z ní dědící. Zde jsem využil jiný postup, než použil autor videotutoriálu, tento způsob se mi zdá lepší (přehlednější, jasnější).

Pro větší přehlednost si vytvořte nový soubor a pojmenujte ho GameObjects.cs. Následně do něj nakopírujte tento kód:

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

namespace Hra
{
    class GameObject
    {
        protected Texture2D sprite;
        protected Vector2 position;
        protected Vector2 center;
        protected float rotation;
    }
}

Sprite je textura, position obsahuje souřadnice pozice objektu a center souřadnice jeho středu (X = polovina šířky spritu, Y = polovina výšky spritu). Dále budeme potřebovat nějaký konstruktor.

public GameObject(Texture2D loadedTexture)
{
     sprite = loadedTexture;
     position = Vector2.Zero;
     center = new Vector2(sprite.Width / 2.0f, sprite.Height / 2.0f);
}

A nakonec přidáme metodu Draw, ta bude vždy stejná.

public virtual void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(sprite, position, null, Color.White, rotation, center, 1.0f, SpriteEffects.None, 0);
}

Jen kvůli tomu, že jsme chtěli předat metodě rotaci objektu, musíme použít nejukecanější verzi spriteBatch.Draw. Pojďme si shrnout význam jejich parametrů.

  • sprite – textura spritu
  • position – pozice spritu ve viewportu
  • rectangle – obdélník (viewport), v rámci kterého se má sprite vykreslovat; my nevyplníme nic, je to zbytečné, když používáme celé okno
  • color – barva osvětlení. Pokud zvolíme bílou, bude sprite vykreslen beze změny, když zvolíme zelenou, bude mít sprite zelený nádech.
  • rotation – rotace spritu
  • origin – bod otáčení, v našem případě střed
  • scale – násobek původní velikosti spritu. Pokud chcete sprite vykreslit zvětšený či zmenšený, je tento parametr ten pravý.
  • effects – efekt použitý při vykreslování. Vypadá to zajímavě, ale za atraktivním názvem se skrývá pouze horizontální či vertikální převrácení.
  • layerDepth – vrstva, ve které je objekt umístěn (0 – front, 1 – back)

Metoda Draw přijímá referenci spriteBatch. Budeme ji totiž volat v metodě Draw třídy Game1 a pokud chceme, aby naše metod mohla vykreslovat, musíme jí SpriteBatch předat. Je to nejjednodušší způsob. Metodu budeme také překrývat, proto klíčové slovo virtual.

A tímto máme naši třídu kompletní, další třídy herních objektů budeme odvozovat od této.

Vector

Vector2, Vector3 a Vector4 jsou další z věcí, které nám XNA Framework přichystal, abychom je nemuseli psát sami. Vektory jsou totiž součást téměř každé hry, velice usnadňují práci. Prostě místo toho, abyste museli psát ChangePosition(float positionX, float positionY), napíšete ChangePosition(Vector2 position). Číslo za názvem Vector značí počet rozměrů. Vektory v XNA jsou struktury, takže se nacházejí v bufferu, což s sebou taktéž nese jisté výhody (oproti třídě). Navíc obsahují některé užitečné metody a díky přetíženým operátorům můžete vectory jednoduše sčítat, odečítat, násobit, porovnávat,… Jako bonus nabízí vektory v XNA již předdefinované vektory, např. Vector2.Zero.

Závěr

Dnešní díl je u konce, v příštím vytvoříme herní objekty.

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
Autor se věnuje programování pro platformu .NET v jazyce C# (ASP.NET, XNA, Windows Forms). Souběžně s tím programuje v herním modu Police Brutality
Web    

Nové články

Obrázek ke článku Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres přiveze v září do Prahy špičky světové kryptoanarchie

Hackerský kongres HCPP16 pořádá od 30. září do 2. října nezisková organizace Paralelní Polis již potřetí, a to ve stejnojmenném bitcoinovém prostoru v pražských Holešovicích. Letos přiveze na třídenní konferenci přes 40 většinou zahraničních speakerů – lídrů z oblastí technologií, decentralizované ekonomiky, politických umění a aktivismu. Náměty jejich přednášek budou také hacking, kryptoměny, věda, svoboda nebo kryptoanarchie.

Reklama
Reklama
Obrázek ke článku ICT PRO školení zaměřené nejenom na ICT

ICT PRO školení zaměřené nejenom na ICT

Dovolte, abychom se představili. Jsme zaměstnanci společnosti ICT Pro, profesionálové v oblasti poskytování komplexních ICT služeb. Neboli služeb spojených s informačními a komunikačními technologiemi, které dnes - ve 21. století - tvoří  nedílnou součást běžného provozu všech moderních firem.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý