Game Programming Class2
Contents
Objectives
- Time corrected move bases on elapsed game time Monogame
- Vector2 for direction with and without magnitude
- Single responsibility principal for methods
Skills
- Get samples from SVN and Git
Fonts
free game fonts XNA Redistributable Font Pack
note this font pack is now included in XNA 4
SVN Checkout
All of the examples for this class and the basic game library we wil be building is in our SVN repo this week we'll practice checking out a folder from the repo.
Tools
- Ahnk SVN for Visual Studio http://visualstudiogallery.msdn.microsoft.com/E721D830-7664-4E02-8D03-933C3F1477F2
- TortoiseSVN http://tortoisesvn.net/
Repo for Spring 2016
Trunk : this contains all the old student work as well as my demos so you probably don't want this at least not quite yet
https://iam.colum.edu:8443/svn/GPMonogame3.5/trunk
Just the Jeff folder
https://iam.colum.edu:8443/svn/GPMonogame3.5/trunk/jeff
Demos Projects : this is the link to my demos in SVN
https://iam.colum.edu:8443/svn/GPMonogame3.5/trunk/jeff
tortoisesvn http://tortoisesvn.tigris.org/
ankhsvn http://ankhsvn.open.collab.net/
SNV checkout demo.
In the coming weeks we'll learn how to commit to the SNV. Until then all you need to know is how to checkout.
http://stackoverflow.com/questions/21156065/how-to-locally-ignore-git-and-gitignore-in-a-svn-repo
Monogame Structures
Game Class
The MonogameGame class has two private properties
- GraphicsDeviceManager graphics;
- ContentManager content;
Graphics for windows and xbox are 60 fps. XBOx supports NTSC resolutions (480i, 480p, 720p, 1080i and 1080p 1080p is only on newer hdmi models).
//the game constuctor can be used to set some graphics settings. graphics.PreferredBackBufferHeight = 768; graphics.PreferredBackBufferWidth = 1024; //graphics.PreferredBackBufferHeight = 1080; //graphics.PreferredBackBufferWidth = 1920; //graphics.IsFullScreen = true;
Graphics for Mobile Game is 30 fps and 480 x 800.
// Frame rate is 30 fps by default for Windows Phone.
TargetElapsedTime = TimeSpan.FromTicks(333333);
// Pre-autoscale settings.
graphics.PreferredBackBufferWidth = 480;
graphics.PreferredBackBufferHeight = 800;
- Declare SpriteBatch spriteBatch;
- Initialize()
- LoadContent()
- UnloadContent()
- Update(GameTime gameTime)
GameTime
FrameRate and GameTime
Time and Timespan
Example of update using GameTime to calculate elapsed time
Demo
- SimpleUpdateMovement : move with Keyboard
- SimpleUpdateMovementWGravity: simple gravity moves sprite down
- SimpleUpdateMovementWState: better movement show different types with state selector
- SimpleMovementJump: Very simple Jump and Gravity
Understanding GameTime We'll revisit game time when we talk about performance profiling.
Texture2D and SpriteBatches
simple pacmac bouncing back and forth
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace GameUpdate
{
/// <summary>
/// This is the main type for your game.
/// </summar>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
Texture2D PacMan;
Vector2 PacManLoc; //Pacman location
Vector2 PacManDir; //Pacman direction
float PacManSpeed; //speed for the PacMan Sprite in pixels per frame per second
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
//Change the frame fate to 30 Frames per second the default is 60fps
//TargetElapsedTime = TimeSpan.FromTicks(333333); // you may need to add using System; to get the TimeSpan function
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: use this.Content to load your game content here
PacMan = Content.Load<Texture2D>("pacmanSingle");
//Center PacMan
PacManLoc = new Vector2(graphics.GraphicsDevice.Viewport.Width / 2,
graphics.GraphicsDevice.Viewport.Height / 2); //Start with PacManLoc in the center of the screen
PacManDir = new Vector2(1, 0); //start moving left
PacManSpeed = 20; //initial pacman speed
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: Add your update logic here
//Elapsed time since last update will be used to correct movement speed
float time = (float)gameTime.ElapsedGameTime.TotalMilliseconds;
//Turn PacMan Around if it hits the edge of the screen
if ((PacManLoc.X > graphics.GraphicsDevice.Viewport.Width - PacMan.Width)
|| (PacManLoc.X < 0)
)
{
PacManDir = Vector2.Negate(PacManDir);
}
//Move PacMan
//Simple move Moves PacMac by PacManDiv on every update
PacManLoc = PacManLoc + PacManDir * PacManSpeed; //no good not time corrected
//Time corrected move. MOves PacMan By PacManDiv every Second
//PacManLoc = PacManLoc + ((PacManDir * PacManSpeed) * (time/1000)); //Simple Move PacMan by PacManDir
base.Update(gameTime);
}
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
spriteBatch.Begin();
spriteBatch.Draw(PacMan, PacManLoc, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
}
About textures and Batching
Displays, ViewPorts, Client Bounds
Alpha channels
Demo
SpriteBatch
demo project
- IntroSimpleSpriteBatchOptionsWindows.zip
spriteBatch.Begin();
- Options SpriteBlendMode
- Additive Enable additive blending. http://blogs.msdn.com/etayrien/archive/2006/12/19/alpha-blending-part-3.aspx
- AlphaBlend Enable alpha blending. http://blogs.msdn.com/etayrien/archive/2006/12/19/alpha-blending-part-2.aspx
- None No blending specified.
Homework
- XNA Picture With Update
- Update your picture to include some movement with the update method. Use the keyboard or mouse to interact with something on the screen
- Read Chapter 2 in XNA 3.0
- Read Chapter 4 in XNA 3.0 (yes we skipped 3 we'll come back)