Top Banner
Računalna grafika Josip Vincek
31

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

Sep 02, 2019

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 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

Računalna grafika

Josip Vincek

Page 2: 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

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

Page 3: 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

3. 3D igre u XNA

Kamera u 3D

Kretanje i rotacija

3D iscrtavanje

Teksture

3D modeli

Sadržaj

Page 4: 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

• 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?

Page 5: 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

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

Page 6: 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

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

Page 7: 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

Osnovno o XNA – Životni ciklus

Initialize() LoadContent()

Update()

Draw()

UnloadContent() Game over

Page 8: 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

• 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

Page 9: 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

XNA 2D

Page 10: 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

2D igre u XNA

(0, 0)

(xMax, yMax)

(xMax, 0)

(0, yMax)

width = xMax

height = yMax

Page 11: 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

• 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");

Page 12: 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

• 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

Page 13: 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

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

2D igre u XNA – Animacije

Page 14: 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

• 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;

Page 15: 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

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);

}

Page 16: 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

• 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);

Page 17: 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

• 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

Page 18: 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

• 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( );

Page 19: 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

XNA 3D

Page 20: 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

• 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

Page 21: 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

• 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

Page 22: 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

3D igre u XNA – Kamera u 3D

Page 23: 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

• 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;

Page 24: 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

• 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);

Page 25: 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

• 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

Page 26: 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

• 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);

Page 27: 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

• 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));

Page 28: 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

• 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

Page 29: 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

• 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( );

}

Page 30: 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

• Primjer 3D modela u XNA

3D igre u XNA – 3D modeli

Page 31: 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

Pitanja?