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
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 532×

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 NEWTON Media prohledá 200  milionů mediálních zpráv během sekund díky Cisco UCS

NEWTON Media prohledá 200 milionů mediálních zpráv během sekund díky Cisco UCS

Česká společnost NEWTON Media provozuje největší archiv mediálních zpráv ve střední a východní Evropě. Mezi její zákazníky patří například ministerstva, evropské instituce nebo komerční firmy z nejrůznějších oborů. NEWTON Media rozesílá svým zákazníkům každý den monitoring médií podle nastavených klíčových slov a nabízí online službu, kde lze vyhledat mediální výstupy v plném znění od roku 1996.

Reklama
Reklama
Obrázek ke článku Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Touto roční dobou, kdy je zem pokrytá barevným listím a prsty křehnou v mrazivých ránech, se obvykle těšíme na zbrusu novou verzi RAD Studia. Letos si však ale budeme muset počkat na Godzillu a Linux až do jara. Vezměme tedy za vděk alespoň updatem 2 a jelikož dle vyjádření pánů z Embarcadero se budou nové věci objevovat průběžně, pojďme se na to tedy podívat.

Obrázek ke článku Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Stále rostoucí zájem o cloudové služby i maximální důraz na pružnost, spolehlivost a bezpečnost IT vedou k výrazným inovacím v datových centrech. V infrastruktuře datových center hraje stále významnější roli software a stále častěji se lze setkat s hybridními přístupy k jejich budování i provozu.

Obrázek ke článku Konference: Mobilní technologie mají velký potenciál pro byznys

Konference: Mobilní technologie mají velký potenciál pro byznys

Firmy by se podle analytiků společnosti Gartner měly  rychle přizpůsobit skutečnosti, že mobilní technologie už zdaleka nejsou horkou novinkou, ale standardní součástí byznysu. I přesto - nebo možná právě proto - tu nabízejí velký potenciál. Kde tedy jsou ty největší příležitosti? I tomu se bude věnovat již čtvrtý ročník úspěšné konference Mobilní řešení pro business.

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ý