programarea jocurilor in - profs.info.uaic.robusaco/teach/courses/interfaces/docs/hci-xna.pdf ·...

Post on 07-Sep-2019

15 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Programarea jocurilor inXNA Game Studio 3.0

Cătălin Zima

Microsoft DirectX/XNA MVPcatalinzima@gmail.com

CuprinsCe este XNA Game Studio ?InstalareAnatomia unui jocXNA Framework

Graphics, Audio, Math, Input, Content Pipeline

Xbox 360ResurseIntrebări

XNA Game Studio 3.0

Framework

XNA FrameworkUn set de biblioteci destinate programării jocurilorC#Grafică bazată pe DirectX 9.0cFuncţionalităti uzuale implementate

Initializarea ferestrei si a placii videoManagementul resurselorIncarcarea de modele, texturi, suneteComunicare in reteaDispozitive de input (Mouse, Tastatura, Gamepad)

Cross Platform

Instalare si Rulare1. 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

Anatomia unui JocO bucla continua

Elemente ale sceneiStarea 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 gameDraw(); // draw objects in the game

}CleanUp(); // release used memory

XNA GS 3.0 – clasa Gamepublic 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 herebase.Initialize();

}

protected override void LoadContent(){

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

XNA GS 3.0 – clasa Gameprotected override void Update(GameTime gameTime){

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

}

protected override void Draw(GameTime gameTime){

GraphicsDevice.Clear(Color.CornflowerBlue);// TODO: Add your drawing code herebase.Draw(gameTime);

}

protected override void UnloadContent(){

// TODO: Unload any non ContentManager content here}

Desenarea unui obiect 2DAnimatieControl utilizator

XNA Framework

Core Framework

Graphics Audio Input Math Storage

Networking Gamer Services

Extended Framework

Application Model Content Pipeline

Games

Starter KitsYour Code Your Content Components

Platform

DirectX .NET Framework .NET CF

Networking Gamer Services

Grafică 2DImaginile se încarcă în obiecte Texture2DSe folosește clasa SpriteBatch

Colorare, Scalare, Rotire, OglindireDesenare de textTransparente si Alpha BlendingOptimizată pentru performanţă

2D și 3D pot fi combinate

Grafică 2D - exempleTexture2D 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);

}

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

ColoraţiespriteBatch.Draw(exampleTexture, new Vector2(100,100), Color.Red);

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

Selectare regiunespriteBatch.Draw(exampleTexture, new Rectangle(150,150,300,300),

new Rectangle(0,0,400,250), Color.White);

Rotire în jurul unui punctspriteBatch.Draw(exampleTexture, new Vector2(400, 300), null, Color.White, MathHelper.ToRadians(‐45), new Vector2(200,200),1.0f, SpriteEffects.None, 0);

Scalare și OglindirespriteBatch.Draw(exampleTexture, new Vector2(400, 300), null, Color.White, 

MathHelper.ToRadians(‐45), new Vector2(200,200),0.5f, SpriteEffects.FlipHorizontally, 0);

Fără TransparenţăspriteBatch.Begin(SpriteBlendMode.None);

Însumare culorispriteBatch.Begin(SpriteBlendMode.Additive);

Grafică 3DBazată pe DirectX 9.0cSuport pentru majoritatea funcţionalităţilor standard DirectX:

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

De asemenea clase ajutătoareModelBasicEffectBiblioteca matematicăManagementul dispozitivului grafic

Grafică 3D - CameraCamera definește de unde vede jucătorul scenaDefinită 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

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

Grafică 3D - ModelClasa folosită pentru a desena modele 3DNu poate fi creată prin cod, doar încărcată dintr-un fișierPentru geometrie creată prin cod se folosește clasa VertexBufferModel = colecţie de ModelMeshModelMesh = colecţie de ModelMeshPartModeMeshPart = geometrie + material

Grafică 3D – PoziţionareModelele 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 MatrixWorld 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);

Grafică 3D – PoziţionareExemplu:

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

Î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 modeleffect.View = viewMatrix; //from cameraeffect.Projection = projectionMatrix; //from cameraeffect.EnableDefaultLighting();

}mesh.Draw();

}

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

Modele 3D transparenteObiecte din depărtare apar în faţa celor din apropiere

SpriteBatch setează anumiţi parametrii2 soluţii

spriteBatch.Begin(..., ..., SaveStateMode.SaveState);Setarea manuală a parametriilor modificați înainte de 3Dhttp://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; 

Content LoadingXNA ajută la încărcatul de conţinutFișierele sunt adaugate la proiect în Visual Studio

Corectitudinea verificată la compilareTransformate și comprimate în formate interne =>performanţă mai mare la execuţieNu se pot încarca fișiere “dinamic”

Suport integrat pentru:Modele 3D: .X and .FBXImagini 2D: .DDS .BMP .JPG .PNG .TGAMateriale: .FXFișiere audio: .wav, .mp3, .wma.XML

Încărcarea unei imaginiClick-dreapta pe sub-proiectul Content

Încărcarea unei imaginiClick-dreapta pe sub-proiectul Content

Încărcarea unei imaginiSelectarea imaginii

Încărcarea unei imaginiProprietăţi

Încărcarea unei imaginiÎncărcarea din cod

Funcţionalităţi avansateSe pot defini ”procesoare” pentru resurseFolosite pentru a aplica transformări, calcule, conversii, verificăriPentru a încărca alte tipuri de fișiere decât cele standardSunt executate la compilare

Desenarea unui obiect 3D

SunetSe folosesc clasele Song și SoundEffectFormate suportate: .mp3, .wav, .wmaSong

Folosit pentru melodii lungi (muzică)Suport pentru playlists

SoundEffectRecomandat pentru sunete scurteSunete dintr-un joc (meniuri, arme, efecte speciale)Control mai mare asupra sunetuluiVolum, pitch, pozitionare 3D

SongSong exampleSong; //Song object[...]protected override void LoadContent(){

exampleSong = Content.Load<Song>(“music”);}[...]//play the songMediaPlayer.Play(exampleSong);//playback controlMediaPlayer.Pause();MediaPlayer.Resume();MediaPlayer.Stop();MediaPlayer.MoveNext();MediaPlayer.MovePrevious();//some propertiesMediaPlayer.Volume = 0.6f;MediaPlayer.Queue

SoundEffect

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

SoundEffect exampleSound; //SoundEffect objectSoundEffectInstance soundInstance; //Sound instance//load the soundexampleSound = Content.Load<SoundEffect>(“sound”);//play a soundsoundInstance = exampleSound.Play();soundInstance = exampleSound.Play(volume, pitch, pan, loop);//control a playing soundsoundInstance.Play();soundInstance.Pause();soundInstance.Resume();soundInstance.Stop();//some properties (controllable)Pitch, Pan, Volume

SoundEffect în 3DPoziţionare în spaţiuAudioListener – poziţia, orientarea și viteza ascultătoruluiAudioEmitter – poziţia, orientarea și viteza emiţătoruluiAudioEmitter AudioEmitter emitter = new AudioEmitter();

AudioListener listener = new AudioListener();//proprietăți pentru emitter si listenerPosition, Velocity, Forward, Up//redearea unui sunet poziționat 3Dsound.Play3D(listener, emitter);soundInstance.Apply3D(listener,emitter);

InputSuport pentru Mouse, Tastaturăși Gamepad

//MouseMouse.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();

//gamepadGamePadState state = GamePad.GetState(PlayerIndex.One);state.Buttons.A, state.Buttons.Start, state.ThumbSticks.Left.Xstate.Triggers.LeftGamePad.SetVibration(PlayerIndex.One, leftMorot, rightMotor);

Biblioteca de MatematicăXNA conţine o bibliotecă pentru matematică foarte puternicăVector, Matrix, Quaternion, Plane, BoundingBox, BoundingSphere, Sphere, Ray, Curve, Frustum

Right Handed systemTeste pentru determinat intersecţiiFuncţionalitate: operatori definiţi pe toate clasele, rutine de conversie, constante pentru valori uzuale

ReţeaSuport pentru jocuri în reţea, folosind Xbox Live! sau Games for Windows Live!Managementul sesiunilor de joc

Ușor de creat și căutat sesiuniNu e nevoie de servere specializateDacă “gazda” pleacă, migrare automatăManagementul fluxului de joc

Creare/Cautare sesiune -> Lobby -> Joc

ReţeaMesaje transmise prin

SendData și ReceiveDataConexiune UDP sigurăClient-Server sau Peer-to-Peer

Suport pentru voce automatSe poate simula latenţă și pierderi de pachete

Exemple de codhttp://creators.xna.com/en-US/starterkit/netrumblehttp://creators.xna.com/en-US/education/catalog/?contenttype=0&devarea=19&sort=1

Programare Xbox 360 Lucraţi în Windows, testaţi pe XboxJocurile pentru Windows pot fi convertite în proiecte pentru XboxSe crează un nou proiect,dar fișierele sunt aceleașiLa compilare, alegeţi platforma pentru care doriţi să compilaţi

Programare Xbox 360Rezoluţ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;

}

Deployment Xbox360Necesar:

Cont de Xbox Live!Subscripţie Creator’s Club

Trial: MSDNAA sau DreamSparkPremium

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

DebuggingCand 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!

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

http://creators.xna.com/en-US/education/Tutoriale, exemple, starter kits, utilităţiForums http://forums.xna.com/forums/

Alte resurse utilehttp://creators.xna.com/en-US/community_resources

Lista de resurse create de comunitate

www.xnadevelopment.comwww.riemers.net

Întrebări?

top related