Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
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
• 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
• 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
• 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
• 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 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
• 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( );
}