31
Računalna grafika Josip Vincek

Josip Vincek - rg.c-hip.netrg.c-hip.net/2011/seminari/vincek/prezentacija/XNA_jvincek.pdf · • Jezik: C# , Visual Basic Osnovno o XNA – Što je XNA? Osnovno o XNA – Profili

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Računalna grafika

Josip Vincek

1. Osnovno o XNA

Što je XNA

XNA profili

Način rada XNA, životni ciklus

Organizacija kôda

2. 2D igre u XNA

Sprites, iscrtavanje, animacije

Keyboard & Mouse input, Xbox 360 controller

Game Components

Zvuk u XNA

Tekst

Sadržaj

3. 3D igre u XNA

Kamera u 3D

Kretanje i rotacija

3D iscrtavanje

Teksture

3D modeli

Sadržaj

• XNA Game Studio je programsko okruženje (skup alata) koji služi za kreiranje igara

• Platforme:

Windows

Xbox 360

Windows Phone

• Uključuje XNA Framework

Skup biblioteka za razvoj igara temeljenih na Microsoft .NET Frameworku

• Jezik: C# , Visual Basic

Osnovno o XNA – Što je XNA?

Osnovno o XNA – Profili

• Postoje dva profila XNA igara

1. Reach

Windows Phone 7, Xbox 360, Windows DirectX 9 GPU (min. shader model 2.0)

2. HiDef

Xbox 360, Windows DirectX 10 (ili više) GPU

• GraphicsAdapter.IsProfileSupported

Osnovno o XNA – Način rada

• Razlika u načinu rada igara i klasičnih „event driven” aplikacija

• Svaki „frame” se uvijek ponovno iscrtava, bez obzira da li je došlo do promjena ili ne

• XNA stalno ispituje stanja, ne čeka na događaje

• Nakon inicijalizacije i učitavanja sadržaja ulazi se u tzv. „game loop” koji se vrti do kraja igre

Osnovno o XNA – Životni ciklus

Initialize() LoadContent()

Update()

Draw()

UnloadContent() Game over

• Resursi i kôd su odvojeni dijelovi projekta od XNA 4

• Svi vanjski resursi (slike, zvuk, fontovi) smještaju se u odvojeni dio i dobivaju identifikator preko kojeg se referenciraju u projektu

Osnovno o XNA – Organizacija kôda

XNA 2D

2D igre u XNA

(0, 0)

(xMax, yMax)

(xMax, 0)

(0, yMax)

width = xMax

height = yMax

• Content pipeline

Sve grafike, zvukovi, efekti

Pretvara „standardne” formate u interne XNA formate

• Sprite – 2D bitmapa koja se može iscrtati na ekran

• SpriteBatch – osnovni objekt za upravljanje i iscrtavanje spriteova

2D igre u XNA – Sprites

// LoadContent()

Texture2D texture =

Content.Load<Texture2D>(@"images/automobil");

• Svi spriteovi moraju se iscrtavati između poziva Begin i End

2D igre u XNA – Iscrtavanje

// Draw()

spriteBatch.Begin( );

spriteBatch.Draw(texture, Vector2.Zero, Color.White);

spriteBatch.End( );

Parametar Tip Opis

Texture Texture2D Tekstura (slika) koja će se iscrtati

Position Vector2 Koordinata gornjeg lijevog ugla iscrtane slike

SourceRectangle Rectangle Dozvoljava iscrtavanje samo dijela slike

Color Color Boja sjenčanja

Rotation float Rotiranje slike

Origin Vector2 Točka slike oko koje će se vršiti rotacija

Scale float Skaliranje slike (1 za originalnu veličinu)

Effects SpriteEffects „Flip” slike horizontalno ili vertikalno

LayerDepth Float Specificiranje koja slika će se iscrtati iznad drugih

• Animacije likova u 2D XNA se obično rade pomoću tzv. sprite sheetova

2D igre u XNA – Animacije

• Svaki frame igre provjerava da li je neka tipka pritisnuta ili je došlo do promjene pozicije miša

2D igre u XNA – Keyboard & Mouse

// Update()

KeyboardState keyboardState = Keyboard.GetState( );

if (keyboardState.IsKeyDown(Keys.Left))

playerPosition.X −= playerSpeed;

if (keyboardState.IsKeyDown(Keys.Right))

playerPosition.X += playerSpeed;

// Update()

MouseState prevMouseState;

MouseState mouseState = Mouse.GetState( );

if(mouseState.X != prevMouseState.X || mouseState.Y !=

prevMouseState.Y)

playerPosition = new Vector2(mouseState.X, mouseState.Y);

prevMouseState = mouseState;

2D igre u XNA – Xbox 360 controller

// Update()

GamePadState gamepadState =

GamePad.GetState(PlayerIndex.One);

if (gamepadState.Buttons.A == ButtonState.Pressed)

{

ringsPosition.X += ringsSpeed * 2 *

gamepadState.ThumbSticks.Left.X;

ringsPosition.Y −= ringsSpeed * 2 *

gamepadState.ThumbSticks.Left.Y;

GamePad.SetVibration(PlayerIndex.One, 1f, 1f);

}

else

{

ringsPosition.X += ringsSpeed *

gamepadState.ThumbSticks.Left.X;

ringsPosition.Y −= ringsSpeed *

gamepadState.ThumbSticks.Left.Y;

GamePad.SetVibration(PlayerIndex.One, 0, 0);

}

• GameComponent je klasa koja omogućava kreiranje komponenti koje lako mogu po potrebi biti uključene ili isključene iz glavne petlje igre (Update/Draw ciklus)

2D igre u XNA – Game Components

public class SpriteManager : DrawableGameComponent

public class DebugInfo : GameComponent {

public override void Initialize() { … }

public override void LoadContent() { … }

public override void Update() { … }

}

// MAIN Game Class

SpriteManager spriteManager;

// Initialize()

spriteManager = new SpriteManager(this);

Components.Add(spriteManager);

• Učitavanje preko Content Pipeline-a

• Dva načina korištenja zvuka:

pojednostavljeni Sound API

XACT engine (Microsoft Cross-Platform Audio Creation Tool)

2D igre u XNA – Zvuk

• SpriteFont resurs

definiranje fonta preko XML datoteke (veličina, debljina…)

slova se pretvaraju u slike pa se iscrtavaju na sličan način kao i spriteovi

2D igre u XNA – Iscrtavanje teksta

SpriteFont scoreFont;

// LoadContent

scoreFont = Content.Load<SpriteFont>(@"fonts\score");

// Draw()

spriteBatch.Begin( );

spriteBatch.DrawString(scoreFont, "Score: " +

currentScore, new Vector2(10, 10), Color.DarkBlue, 0,

Vector2.Zero, 1, SpriteEffects.None, 1);

spriteBatch.End( );

XNA 3D

• XNA koristi tzv. „right-handed” koordinatni sustav

• Dva Matrix objekta sačinjavaju kameru u XNA:

view matrica – sadrži informacije o tome gdje se kamera nalazi, u kojem smjeru je okrenuta i koja joj je orijentacija

projection matrica – određuje svojstva kamere na temelju kuta pogleda, koliko daleko kamera može vidjeti…

3D igre u XNA – Kamera u 3D

• Kreiranje view matrice – koristimo statičku metodu Matrix klase: Matrix.CreateLookAt

• Kreiranje projection matrice – koristimo statičku metodu Matrix klase: Matrix.CreatePerspectiveFieldOfView

3D igre u XNA – Kamera u 3D

Parametar Tip Opis

cameraPosition Vector3 Koordinata pozicije kamere

cameraTarget Vector3 Koordinata točke u koju kamera gleda

cameraUpVector Vector3 Vektor koji određuje koji smjer je „gore”

Parametar Tip Opis

fieldOfView float Kut kamera u radijanima (obično 45°, tj. π/4)

aspectRatio float Obično širina ekrana / visina ekrana

nearPlaneDistance float Najmanja i najveća udaljenost od kamere (prije noo što se objekt prestane iscrtavati) farPlaneDistance float

3D igre u XNA – Kamera u 3D

• Za pomicanje i rotaciju objekta množimo pripadnu world matricu sa odgovarajućim matricama koje kreiramo preko statičkih metoda klase Matrix

• world matrica ne predstavlja cijeli svijet nego položaj i svojstva objekta u svijetu (rotacija, skaliranje…)

3D igre u XNA – Kretanje i rotacija

Matrix world = Matrix.Identity;

// Update()

KeyboardState keyboardState = Keyboard.GetState( );

if (keyboardState.IsKeyDown(Keys.Left))

world *= Matrix.CreateTranslation(−.01f, 0, 0);

if (keyboardState.IsKeyDown(Keys.Right))

world *= Matrix.CreateTranslation(.01f, 0, 0);

// Draw()

effect.World = world;

• Metoda Matrix.CreateFromYawPitchRoll primjenjuje rotacije oko sve tri osi istovremeno

3D igre u XNA – Kretanje i rotacija // Update()

world *= Matrix.CreateRotationY(MathHelper.PiOver4 / 60);

// Update()

worldRotation *= Matrix.CreateFromYawPitchRoll(

MathHelper.PiOver4 / 60, 0, 0);

• Sve u XNA 3D iscrtava se koristeći HLSL (High Level Shader Language)

• Iscrtavanje se radi preko klase Effect

• Klasa Effect zapravo daje „sučelje” do HLSL kôda, omogućuje slanje podatka HLSL-u itd.

• U XNA već postoji jedna „pripremljena” klasa koja nasljeđuje Effect pod nazivom BasicEffect

• Svaki Effect ima jednu ili više technique a ona svaka ima jedan ili više pass-eva (vezano za HLSL)

3D igre u XNA – Iscrtavanje

• U XNA možemo iscrtavati primitivne tipove prosljeđujući njegove 3D koordinate

• TriangleStrip, TriangleList, TriangleFan

3D igre u XNA – Iscrtavanje

// LoadContent()

verts = new VertexPositionColor[4];

verts[0] = new VertexPositionColor(new Vector3(−1, 1, 0), Color.Blue);

verts[1] = new VertexPositionColor(new Vector3(1, 1, 0), Color.Yellow);

verts[2] = new VertexPositionColor(new Vector3(−1, −1, 0), Color.Green);

verts[3] = new VertexPositionColor(new Vector3(1, −1, 0), Color.Red);

// Draw()

GraphicsDevice.DrawUserPrimitives<VertexPositionColor>

(PrimitiveType.TriangleStrip, verts, 0, 2);

• Primjenjivanje tekstura svodi se na uparivanje koordinata likova sa koordinatama slike

3D igre u XNA – Teksture

// LoadContent()

verts = new VertexPositionTexture[4];

verts[0] = new VertexPositionTexture(

new Vector3(−1, 1, 0), new Vector2(0, 0));

verts[1] = new VertexPositionTexture(

new Vector3(1, 1, 0), new Vector2(1, 0));

verts[2] = new VertexPositionTexture(

new Vector3(−1, −1, 0), new Vector2(0, 1));

verts[3] = new VertexPositionTexture(

new Vector3(1, −1, 0), new Vector2(1, 1));

• Kod bilo kakvih složenijih modela unođenje koordinata „ručno” je neprihvatljivo

• XNA podržava importiranje sa .x ekstenzijom (DirectX model), kroz Content pipeline

3D igre u XNA – 3D modeli

• Model sadrži jedan ili više objekata pod nazivom Mesh

• Mesh može imati više dijelova od kojih svaki može imati svoju teksturu, boje i slično

• Kôd za osnovno iscrtavanje modela:

3D igre u XNA – 3D modeli

Matrix[] transforms = new Matrix[model.Bones.Count];

model.CopyAbsoluteBoneTransformsTo(transforms);

foreach (ModelMesh mesh in model.Meshes)

{

foreach (BasicEffect be in mesh.Effects)

{

be.EnableDefaultLighting( );

be.Projection = camera.projection;

be.View = camera.view;

be.World = world * mesh.ParentBone.Transform;

}

mesh.Draw( );

}

• Primjer 3D modela u XNA

3D igre u XNA – 3D modeli

Pitanja?