Programarea jocurilor in XNA Game Studio 3.0
Cătălin Zima
Microsoft DirectX/XNA MVP [email protected]
Cuprins
Ce este XNA Game Studio ? Instalare
Anatomia unui joc XNA Framework
Graphics, Audio, Math, Input, Content Pipeline
Xbox 360 Resurse Intrebări
XNA Game Studio 3.0
Framework
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
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
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
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 }
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 }
Desenarea unui obiect 2D Animatie
Control utilizator
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
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
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);
}
spriteBatch.Draw(exampleTexture, new Vector2(100,100), Color.White);
Coloraţie
spriteBatch.Draw(exampleTexture, new Vector2(100,100), Color.Red);
Specificare Dimensiuni
spriteBatch.Draw(exampleTexture, new Rectangle(150,150,300,300), Color.White);
Selectare regiune
spriteBatch.Draw(exampleTexture, new Rectangle(150,150,300,300), new Rectangle(0,0,400,250), Color.White);
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);
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);
Fără Transparenţă
spriteBatch.Begin(SpriteBlendMode.None);
Însumare culori
spriteBatch.Begin(SpriteBlendMode.Additive);
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
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
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 - 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
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);
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));
Î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();
}
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;
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
Încărcarea unei imagini
Click-dreapta pe sub-proiectul Content
Încărcarea unei imagini
Click-dreapta pe sub-proiectul Content
Încărcarea unei imagini
Selectarea imaginii
Încărcarea unei imagini
Proprietăţi
Încărcarea unei imagini
Încărcarea din cod
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
Desenarea unui obiect 3D
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
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
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
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);
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);
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
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
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
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
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;
}
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
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!
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