programarea jocurilor in - profs.info.uaic.robusaco/teach/courses/interfaces/docs/hci-xna.pdf ·...
TRANSCRIPT
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?