• Nu S-Au Găsit Rezultate

XNA Game Studio 3.0

N/A
N/A
Protected

Academic year: 2022

Share "XNA Game Studio 3.0"

Copied!
51
0
0

Text complet

(1)
(2)

Programarea jocurilor in XNA Game Studio 3.0

Cătălin Zima

Microsoft DirectX/XNA MVP [email protected]

(3)

Cuprins

Ce este XNA Game Studio ? Instalare

Anatomia unui joc XNA Framework

Graphics, Audio, Math, Input, Content Pipeline

Xbox 360 Resurse Intrebări

(4)

XNA Game Studio 3.0

Framework

(5)

XNA Framework

Un set de biblioteci destinate programării jocurilor

C#

Grafică bazată pe DirectX 9.0c

Funcţionalităti uzuale implementate

Initializarea ferestrei si a placii video Managementul resurselor

Incarcarea de modele, texturi, sunete Comunicare in retea

Dispozitive de input (Mouse, Tastatura, Gamepad)

Cross Platform

(6)

Instalare si Rulare

1. Visual C# 2008 (Pro sau Express)

MSDNAA sau www.dreamspark.com

http://www.microsoft.com/express/vcsharp/

2. XNA Game Studio 3.0

http://creators.xna.com/en-us/xnags_islive

(7)

Anatomia unui Joc

O bucla continua

Elemente ale scenei

Starea lor modificata in Update() Desenate pe ecran in Draw()

Input => Raspuns

Initialize(); //create window, initialize video card, etc.

while (!userWantsToQuit) {

Update(); // update state of the game Draw(); // draw objects in the game }

CleanUp(); // release used memory

(8)

XNA GS 3.0 – clasa Game

public class Game1 : Microsoft.Xna.Framework.Game {

GraphicsDeviceManager graphics;

public Game1() {

graphics = new GraphicsDeviceManager(this);

Content.RootDirectory = "Content";

}

protected override void Initialize() {

// TODO: Add your initialization logic here base.Initialize();

}

protected override void LoadContent() {

// TODO: use this.Content to load your game content here }

(9)

XNA GS 3.0 – clasa Game

protected override void Update(GameTime gameTime) {

// TODO: Add your update logic here base.Update(gameTime);

}

protected override void Draw(GameTime gameTime) {

GraphicsDevice.Clear(Color.CornflowerBlue);

// TODO: Add your drawing code here base.Draw(gameTime);

}

protected override void UnloadContent() {

// TODO: Unload any non ContentManager content here }

(10)

Desenarea unui obiect 2D Animatie

Control utilizator

(11)

XNA Framework

Core Framework

Graphics Audio Input Math Storage

Networking Gamer Services

Extended Framework

Application Model Content Pipeline

Games

Starter Kits

Your Code Your Content Components

Platform

DirectX .NET Framework .NET CF

Networking Gamer Services

(12)

Grafică 2D

Imaginile se încarcă în obiecte Texture2D Se folosește clasa SpriteBatch

Colorare, Scalare, Rotire, Oglindire Desenare de text

Transparente si Alpha Blending Optimizată pentru performanţă

2D și 3D pot fi combinate

(13)

Grafică 2D - exemple

Texture2D exampleTexture; //Texture object [...]

protected override void LoadContent() {

// Create a new SpriteBatch,used to draw textures.

spriteBatch = new SpriteBatch(GraphicsDevice);

exampleTexture = Content.Load<Texture2D>("nog");

}

[...]

protected override void Draw(GameTime gameTime) {

GraphicsDevice.Clear(Color.CornflowerBlue);

spriteBatch.Begin();

spriteBatch.Draw(exampleTexture, new Vector2(100,100),      Color.White);

spriteBatch.End();

base.Draw(gameTime);

}

(14)

spriteBatch.Draw(exampleTexture, new Vector2(100,100), Color.White);

(15)

Coloraţie

spriteBatch.Draw(exampleTexture, new Vector2(100,100), Color.Red);

(16)

Specificare Dimensiuni

spriteBatch.Draw(exampleTexture, new Rectangle(150,150,300,300), Color.White);

(17)

Selectare regiune

spriteBatch.Draw(exampleTexture, new Rectangle(150,150,300,300), new Rectangle(0,0,400,250), Color.White);

(18)

Rotire în jurul unui punct

spriteBatch.Draw(exampleTexture, new Vector2(400, 300), null, Color.White,  MathHelper.ToRadians(‐45), new Vector2(200,200),1.0f, SpriteEffects.None, 0);

(19)

Scalare și Oglindire

spriteBatch.Draw(exampleTexture, new Vector2(400, 300), null, Color.White,  MathHelper.ToRadians(‐45), new Vector2(200,200),

0.5f, SpriteEffects.FlipHorizontally, 0);

(20)

Fără Transparenţă

spriteBatch.Begin(SpriteBlendMode.None);

(21)

Însumare culori

spriteBatch.Begin(SpriteBlendMode.Additive);

(22)

Grafică 3D

Bazată pe DirectX 9.0c

Suport pentru majoritatea

funcţionalităţilor standard DirectX:

Effects, Shaders, Vertex Streams, Textures, Vertex Textures, Render To Texture, Hardware Instancing, etc.

De asemenea clase ajutătoare

Model

BasicEffect

Biblioteca matematică

Managementul dispozitivului grafic

(23)

Grafică 3D - Camera

Camera definește de unde vede jucătorul scena

Definită de 2 matrici de transformare

View Matrix – stabilește poziţia și orientarea camerei în scenă

Projection Matrix – definește unghiul de deschidere, distanţa minimă și maximă de desenare, raportul între lăţimea și înălţimea imaginii

(24)

Matrici pentru cameră

Matrix.CreateLookAt(cameraPosition, cameraTarget, 

cameraUpVector);

Matrix view = Matrix.CreateLookAt(new Vector3(0,100,100),  Vector3.Zero,

Vector3.UnitY);

Matrix.CreatePerspectiveFieldOfView(fieldOfView, aspectRation,  nearPlaneDistance, farPlaneDistance);

Matrix projection = Matrix.CreatePerspectiveFieldOfView(

MathHelper.PiOver4, 

GraphicsDevice.Viewport.AspectRatio,  1.0f, 10000.0f);

(25)

Grafică 3D - Model

Clasa folosită pentru a desena modele 3D Nu poate fi creată prin cod, doar

încărcată dintr-un fișier

Pentru geometrie creată prin cod se folosește clasa VertexBuffer

Model = colecţie de ModelMesh

ModelMesh = colecţie de ModelMeshPart ModeMeshPart = geometrie + material

(26)

Grafică 3D – Poziţionare

Modelele trebuie poziţionate în scenă

Poziţionarea se face în momentul desenării =>

Același model poate fi desenat în mai multe locaţii

Se crează o matrice numită World Matrix

World Matrix = produs de mai multe matrici

Scalare Matrix.CreateScale(xScale, yScale, zScale);

Rotaţie - Matrix.CreateRotationX(radians);

- Matrix.CreateFromYawPitchRoll(y, p, r);

Translaţie - Matrix.CreateTranslation(new Vector3(x, y, z));

Poziţie + Orientare - Matrix.CreateWorld(position,    forwardVector, upVector);

(27)

Grafică 3D – Poziţionare

Exemplu:

Atenţie la ordinea operaţiilor!

De obicei scalare * rotaţie * translaţie

Matrix world;

world = Matrix.CreateScale(2) * 

Matrix.CreateRotationY(MathHelper.ToRadians(35)) * Matrix.CreateTranslation(new Vector3(50, 0, ‐30));

(28)

Încărcare unui model

Desenarea unui model

Model myModel;

myModel = Content.Load<Model>("modelul_meu");

foreach (ModelMesh mesh in myModel.Meshes) {

foreach (BasicEffect effect in mesh.Effects) {

effect.World = worldMatrix; //different for each model effect.View = viewMatrix; //from camera

effect.Projection = projectionMatrix; //from camera effect.EnableDefaultLighting();

}

mesh.Draw();

}

(29)

Probleme 2D + 3D

Când se combină 2D (spriteBatch) cu 3D, pot aparea unele probleme

Modele 3D transparente

Obiecte din depărtare apar în faţa celor din apropiere

SpriteBatch setează anumiţi parametrii 2 soluţii

spriteBatch.Begin(..., ..., SaveStateMode.SaveState);

Setarea manuală a parametriilor modificați înainte de 3D

http://blogs.msdn.com/shawnhar/archive/2006/11/13/spritebatch‐and‐renderstates.aspx

GraphicsDevice.RenderState.DepthBufferEnable = true;

GraphicsDevice.RenderState.AlphaBlendEnable = false;

GraphicsDevice.RenderState.AlphaTestEnable = false;

GraphicsDevice.SamplerStates[0].AddressU = TextureAddressMode.Wrap;

GraphicsDevice.SamplerStates[0].AddressV = TextureAddressMode.Wrap; 

(30)

Content Loading

XNA ajută la încărcatul de conţinut

Fișierele sunt adaugate la proiect în Visual Studio

Corectitudinea verificată la compilare

Transformate și comprimate în formate interne =>

performanţă mai mare la execuţie Nu se pot încarca fișiere “dinamic”

Suport integrat pentru:

Modele 3D: .X and .FBX

Imagini 2D: .DDS .BMP .JPG .PNG .TGA Materiale: .FX

Fișiere audio: .wav, .mp3, .wma .XML

(31)

Încărcarea unei imagini

Click-dreapta pe sub-proiectul Content

(32)

Încărcarea unei imagini

Click-dreapta pe sub-proiectul Content

(33)

Încărcarea unei imagini

Selectarea imaginii

(34)

Încărcarea unei imagini

Proprietăţi

(35)

Încărcarea unei imagini

Încărcarea din cod

(36)

Funcţionalităţi avansate

Se pot defini ”procesoare” pentru resurse Folosite pentru a aplica transformări,

calcule, conversii, verificări

Pentru a încărca alte tipuri de fișiere decât cele standard

Sunt executate la compilare

(37)

Desenarea unui obiect 3D

(38)

Sunet

Se folosesc clasele Song și SoundEffect Formate suportate: .mp3, .wav, .wma Song

Folosit pentru melodii lungi (muzică) Suport pentru playlists

SoundEffect

Recomandat pentru sunete scurte

Sunete dintr-un joc (meniuri, arme, efecte speciale) Control mai mare asupra sunetului

Volum, pitch, pozitionare 3D

(39)

Song

Song exampleSong; //Song object [...]

protected override void LoadContent() {

exampleSong = Content.Load<Song>(“music”);

}

[...]

//play the song

MediaPlayer.Play(exampleSong);

//playback control MediaPlayer.Pause();

MediaPlayer.Resume();

MediaPlayer.Stop();

MediaPlayer.MoveNext();

MediaPlayer.MovePrevious();

//some properties

MediaPlayer.Volume = 0.6f;

MediaPlayer.Queue

(40)

SoundEffect

Diferenţe? Pitch, Pan, Loop și 3D

SoundEffect exampleSound; //SoundEffect object

SoundEffectInstance soundInstance; //Sound instance //load the sound

exampleSound = Content.Load<SoundEffect>(“sound”);

//play a sound

soundInstance = exampleSound.Play();

soundInstance = exampleSound.Play(volume, pitch, pan, loop);

//control a playing sound soundInstance.Play();

soundInstance.Pause();

soundInstance.Resume();

soundInstance.Stop();

//some properties (controllable) Pitch, Pan, Volume

(41)

SoundEffect în 3D

Poziţionare în spaţiu

AudioListener – poziţia, orientarea și viteza ascultătorului

AudioEmitter – poziţia, orientarea și viteza emiţătorului

AudioEmitter

AudioEmitter emitter = new AudioEmitter();

AudioListener listener = new AudioListener();

//proprietăți pentru emitter si listener Position, Velocity, Forward, Up

//redearea unui sunet poziționat 3D sound.Play3D(listener, emitter);

soundInstance.Apply3D(listener,emitter);

(42)

Input

Suport pentru Mouse, Tastatură și Gamepad

//Mouse

Mouse.GetState().X //pozitia pe axa X (sau Y)

if (Mouse.GetState().LeftButton == ButtonState.Pressed) ...

//Tastatură

Keyboard.GetState().IsKeyDown(Keys.F);

Keyboard.GetState().IsKeyUp(Keys.Escape);

Keyboard.GetState().GetPressedKeys();

//gamepad

GamePadState state = GamePad.GetState(PlayerIndex.One);

state.Buttons.A, state.Buttons.Start,  state.ThumbSticks.Left.X

state.Triggers.Left

GamePad.SetVibration(PlayerIndex.One, leftMorot, rightMotor);

(43)

Biblioteca de Matematică

XNA conţine o bibliotecă pentru matematică foarte puternică

Vector, Matrix, Quaternion, Plane, BoundingBox, BoundingSphere, Sphere, Ray, Curve, Frustum

Right Handed system

Teste pentru determinat intersecţii

Funcţionalitate: operatori definiţi pe toate clasele, rutine de conversie,

constante pentru valori uzuale

(44)

Reţea

Suport pentru jocuri în reţea, folosind Xbox Live! sau Games for Windows Live!

Managementul sesiunilor de joc

Ușor de creat și căutat sesiuni

Nu e nevoie de servere specializate

Dacă “gazda” pleacă, migrare automată Managementul fluxului de joc

Creare/Cautare sesiune -> Lobby -> Joc

(45)

Reţea

Mesaje transmise prin

SendData și ReceiveData Conexiune UDP sigură

Client-Server sau Peer-to-Peer

Suport pentru voce automat

Se poate simula latenţă și pierderi de pachete

Exemple de cod

http://creators.xna.com/en-US/starterkit/netrumble

http://creators.xna.com/en-US/education/catalog/?contenttype=0&devarea=19&sort=1

(46)

Programare Xbox 360

Lucraţi în Windows, testaţi pe Xbox Jocurile pentru Windows

pot fi convertite în proiecte pentru Xbox

Se crează un nou proiect, dar fișierele sunt aceleași La compilare, alegeţi

platforma pentru care doriţi să compilaţi

(47)

Programare Xbox 360

Rezoluţia recomandată: 1280*720

Atenţie la “garbage collection”!

512 MB memorie (principală + video) Input: Gamepad recomandat, posibil tastatură (USB), nu mouse

public Game1() {

graphics = new GraphicsDeviceManager(this);

graphics.PreferredBackBufferWidth = 1280;

graphics.PreferredBackBufferHeight = 720;

}

(48)

Deployment Xbox360

Necesar:

Cont de Xbox Live!

Subscripţie Creator’s Club

Trial: MSDNAA sau DreamSpark Premium

Conexiune la internet pt Xbox (tcp/udp 3074, 53, 88) Xbox și calculatorul în același subnet

Instrucţiuni:

http://msdn.microsoft.com/en-us/library/bb975643.aspx http://msdn.microsoft.com/en-us/library/bb976062.aspx

(49)

Debugging

Cand rulează jocul pe Xbox, puteţi pune breakpoints în Visual Studio,

și jocul se va opri la linia respectivă Puteţi analiza variabilele,

executa pas cu pas o porţiune de cod, etc.

XNA GS vine cu un utilitar:

“XNA Framework Remote Performance Monitor”

Nu optimizaţi înainte sa aveţi nevoie!

(50)

Resurse

Documentaţia inclusă in XNA GS 3.0 Site oficial: creators.xna.com

http://creators.xna.com/en-US/education/

Tutoriale, exemple, starter kits, utilităţi Forums http://forums.xna.com/forums/

Alte resurse utile

http://creators.xna.com/en-US/community_resources

Lista de resurse create de comunitate

www.xnadevelopment.com www.riemers.net

(51)

Întrebări?

Referințe

DOCUMENTE SIMILARE

Includerea de cod-sursă din alte fișiere (suport pentru

suport pentru REST prin obiectul XMLHttpRequest, și/sau API-uri HTML5: Fetch ori WebSocket..

Pe baza RDF, se oferă suport pentru modelarea cunoștințelor în termeni „înțeleși” de

oferă suport pentru efectuarea de raționamente în timp polinomial pentru ontologii cu număr mare. de clase

Lucrarea își propune atât o prezentare metodico-științifică a celor mai importante teoreme ale calculului diferențial, cât și o sistematizare a principalelor

Daca destinatia este intr-o retea conectata direct cu G, atunci G foloseste o intrare care arata costul folosirii retelei, si faptul ca nu este folosita nici o gateway (poarta)

– – Ofera suport pentru constituirea de clase de Ofera suport pentru constituirea de clase de cluster. cluster - - e ( e ( low low - - end end / / high high - - end end

○ Spațiul este unul foarte mare, așa că s-au folosit două aspersoare T200 configurate pentru un unghi de 90 de grade... Pentru transportarea apei s-a folosit o țeavă PE80