SlideShare a Scribd company logo
Mohammad Shaker
mohammadshaker.com
@ZGTRShaker
2011, 2012, 2013, 2014
XNA Game Development
L09 – 2D Graphics and Particle Engines
2D Graphics
2D Graphics Topics
• Introduction to 2D Graphics
• SpriteBatches
• Drawing Text with SpriteFonts
• Texure Atlases
• Rotating Sprites
• Additive Blending with Sprites
• 2D Particle Engines
2D World - Intro
SpriteBatch
SpriteBatch
• Create a Place to Store the Images In Game
private Texture2D background;
private Texture2D shuttle;
private Texture2D earth;
SpriteBatch
• Create a Place to Store the Images In Game
• LoadContent() method
private Texture2D background;
private Texture2D shuttle;
private Texture2D earth;
background = Content.Load<Texture2D>("stars");
shuttle = Content.Load<Texture2D>("shuttle");
earth = Content.Load<Texture2D>("earth");
Textures,
Content
Textures,
Content
SpriteBatch
• SpriteBatches Declaration
SpriteBatch spriteBatch;
SpriteBatch
• SpriteBatches Declaration
• Initializing in LoadContent()
SpriteBatch spriteBatch;
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
}
SpriteBatch
• Drawing with SpriteBatches
spriteBatch.Begin();
spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White);
spriteBatch.End();
SpriteBatch
• Drawing with SpriteBatches
spriteBatch.Begin();
spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White);
spriteBatch.End();
SpriteBatch
• A Few More Sprites
spriteBatch.Begin();
spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White);
spriteBatch.Draw(earth, new Vector2(400, 250), Color.White);
spriteBatch.Draw(shuttle, new Vector2(450, 250), Color.White);
spriteBatch.End();
SpriteBatch
• A Few More Sprites
spriteBatch.Begin();
spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White);
spriteBatch.Draw(earth, new Vector2(400, 250), Color.White);
spriteBatch.Draw(shuttle, new Vector2(450, 250), Color.White);
spriteBatch.End();
SpriteBatch
• A Few More Sprites
spriteBatch.Begin();
spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White);
spriteBatch.Draw(earth, new Vector2(400, 250), Color.White);
spriteBatch.Draw(shuttle, new Vector2(450, 250), Color.White);
spriteBatch.End();
You can find this in
“App1-SimpleTextures”
Going on with 2D!
Acquiring Fonts
• Making a SpriteFont
Acquiring Fonts
• Down at about line 14 in the new created file you will see the following:
• You can use any font you want that’s installed in your system
• Fonts can be installed by dragging the font file to your Fonts folder, which is
located in C:/Windows/Fonts
<FontName>Segoe UI Mono</FontName>
Acquiring Fonts
• Down at about line 14 in the new created file you will see the following:
<FontName>Segoe UI Mono</FontName>
Acquiring Fonts
• Down at about line 14 in the new created file you will see the following:
• Also look down at line 20, where it says:
<FontName>Segoe UI Mono</FontName>
<Size>14</Size>
Acquiring Fonts – the using of
• Global Scope
private SpriteFont font;
private int score = 0;
Acquiring Fonts – the using of
• Global Scope
• LoadContent()
private SpriteFont font;
private int score = 0;
font = Content.Load<SpriteFont>("Score"); // Use the name of your font here instead of 'Score'.
Acquiring Fonts – the using of
• Global Scope
• LoadContent()
• Draw()
private SpriteFont font;
private int score = 0;
font = Content.Load<SpriteFont>("Score"); // Use the name of your font here instead of 'Score'.
spriteBatch.Begin();
spriteBatch.DrawString(font, "Score", new Vector2(100, 100), Color.Black);
spriteBatch.End();
Acquiring Fonts – the using of
Acquiring Fonts – the using of
• Enhancing visual with Update() method
Acquiring Fonts – the using of
• Enhancing visual with Update() method
score++;
Acquiring Fonts – the using of
• Enhancing visual with Update() method
• Now let's replace our original spriteBatch.DrawString() line with the following:
score++;
spriteBatch.DrawString(font, "Score: " + score, new Vector2(100, 100), Color.Black);
Acquiring Fonts – the using of
• “App2-ShowingText”
Texture Atlases
Texture Atlases
Texture Atlases
Texture Atlases
• Creating an AnimatedSprite Class
• Class scope members
public class AnimatedSprite
public Texture2D Texture { get; set; }
public int Rows { get; set; }
public int Columns { get; set; }
private int currentFrame;
private int totalFrames;
Texture Atlases
• Update() method
public void Update()
{
currentFrame++;
if (currentFrame == totalFrames)
currentFrame = 0;
}
Texture Atlases
• Draw() method
public void Draw(SpriteBatch spriteBatch, Vector2 location)
{
int width = Texture.Width / Rows;
int height = Texture.Height / Columns;
int row = (int)((float)currentFrame / (float)Columns);
int column = currentFrame % Columns;
Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height);
Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, width, height);
spriteBatch.Begin();
spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White);
spriteBatch.End();
}
Texture Atlases
• Draw() method
public void Draw(SpriteBatch spriteBatch, Vector2 location)
{
int width = Texture.Width / Rows;
int height = Texture.Height / Columns;
int row = (int)((float)currentFrame / (float)Columns);
int column = currentFrame % Columns;
Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height);
Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, width, height);
spriteBatch.Begin();
spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White);
spriteBatch.End();
}
Texture Atlases
• Draw() method
public void Draw(SpriteBatch spriteBatch, Vector2 location)
{
int width = Texture.Width / Rows;
int height = Texture.Height / Columns;
int row = (int)((float)currentFrame / (float)Columns);
int column = currentFrame % Columns;
Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height);
Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, width, height);
spriteBatch.Begin();
spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White);
spriteBatch.End();
}
Texture Atlases
• Now, in Game1 Class there’s just two calls!
Texture Atlases
• Now, in Game1 Class there’s just two calls!
Texture Atlases
• Now, in Game1 Class there’s just two calls!
Texture Atlases
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
animatedSprite.Update();
base.Update(gameTime);
}
Texture Atlases
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
animatedSprite.Update();
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
animatedSprite.Draw(spriteBatch, new Vector2(400, 200));
base.Draw(gameTime);
}
Texture Atlases
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
animatedSprite.Update();
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
animatedSprite.Draw(spriteBatch, new Vector2(400, 200));
base.Draw(gameTime);
}
Texture Atlases
• “App3-AnimatedSprite”
Rotating Sprites
Rotating Sprites
• Preparing the Content
private Texture2D arrow;
private float angle = 0;
Rotating Sprites
• Preparing the Content
private Texture2D arrow;
private float angle = 0;
Rotating Sprites
• Preparing the Content
• In LoadContent() method
• In Update() method
private Texture2D arrow;
private float angle = 0;
// use the name of your texture here, if you are using your own
arrow = Content.Load<Texture2D>("arrow");
angle += 0.01f;
Rotating Sprites
• Draw() Method
spriteBatch.Begin();
Vector2 location = new Vector2(400, 240);
Rectangle sourceRectangle = new Rectangle(0, 0, arrow.Width,
arrow.Height);
Vector2 origin = new Vector2(0, 0);
spriteBatch.Draw(arrow, location, sourceRectangle, Color.White,
angle, origin, 1.0f, SpriteEffects.None, 1);
spriteBatch.End();
XNA L09–2D Graphics and Particle Engines
XNA L09–2D Graphics and Particle Engines
Rotating Sprites
• Draw() Method
Rotating Sprites
• Compile and run and c it!
• “App3-RotatingSpriteV0.1”
Rotating Sprites
• It’s not what we need!
Rotating Sprites
• It’s not what we need!
• We need a“Center Point Rotation”!
Using a Center Point for Rotation
• In Draw(), change
Vector2 origin = new Vector2(0, 0);
Vector2 origin = new Vector2(arrow.Width / 2, arrow.Height);
• To
Using a Center Point for Rotation
• Compile and run
Using a Center Point for Rotation
• Compile and run
Particle Engines
The Concept
2D Particle Engine
2D Particle Engine
• Introduction
2D
Particle
Engine
2D Particle Engine
• images
2D Particle Engine
• Anatomy of a Particle Engine
2D Particle Engine
• Anatomy of a Particle Engine
– particles,
2D Particle Engine
• Anatomy of a Particle Engine
– particles,
– particle emitter,
2D Particle Engine
• Anatomy of a Particle Engine
– particles,
– particle emitter,
– the engine itself
2D Particle Engine
• Anatomy of a Particle Engine
– particles
• Velocity
– particle emitter,
– the engine itself
2D Particle Engine
• Anatomy of a Particle Engine
– particles
• Velocity, Angles
– particle emitter,
– the engine itself
2D Particle Engine
• Anatomy of a Particle Engine
– particles
• Velocity, Angles
– particle emitter
• Location that the particles are coming from
– the engine itself
2D Particle Engine
• Anatomy of a Particle Engine
– particles
• Velocity, Angles
– particle emitter
• Location that the particles are coming from
• Responsible for determining how many particles will be created at any given time
– the engine itself
2D Particle Engine
• Anatomy of a Particle Engine
– particles
• Velocity, Angles
– particle emitter
• Location that the particles are coming from
• Responsible for determining how many particles will be created at any given time
– the engine itself
• Manages the state of the previous two components
2D Particle Engine
• Anatomy of a Particle Engine
– particles
• Velocity, Angles
– particle emitter
• Location that the particles are coming from
• Responsible for determining how many particles will be created at any given time
– the engine itself
• Manages the state of the previous two components
• Responsible for removing dead particles from the system
2D Particle Engine
• Anatomy of a Particle Engine
– particles
• Velocity, Angles
– particle emitter
• Location that the particles are coming from
• Responsible for determining how many particles will be created at any given time
– the engine itself
• Manages the state of the previous two components
• Responsible for removing dead particles from the system.
2D Particle Engine
• Particle
Public class Particle
2D Particle Engine
• Particle
• ParticleEngine2D
Public class Particle
Public class ParticleEngine2D
2D Particle Engine
• Particle
Public class Particle
2D Particle Engine
• Particle
• The Particle's Properties
Public class Particle
2D Particle Engine
Public class Particle
public Texture2D Texture { get; set; }
public Vector2 Position { get; set; }
public Vector2 Velocity { get; set; }
public float Angle { get; set; }
public float AngularVelocity { get; set; }
public Color Color { get; set; }
public float Size { get; set; }
public int TTL { get; set; }
• Particle
• The Particle's Properties
2D Particle Engine
• Particle
• The Particle's Properties
Public class Particle
public Texture2D Texture { get; set; }
public Vector2 Position { get; set; }
public Vector2 Velocity { get; set; }
public float Angle { get; set; }
public float AngularVelocity { get; set; }
public Color Color { get; set; }
public float Size { get; set; }
public int TTL { get; set; }
2D Particle Engine
• Particle
• The Particle's Properties
Public class Particle
public Texture2D Texture { get; set; }
public Vector2 Position { get; set; }
public Vector2 Velocity { get; set; }
public float Angle { get; set; }
public float AngularVelocity { get; set; }
public Color Color { get; set; }
public float Size { get; set; }
public int TTL { get; set; }
2D Particle Engine
• Update()
2D Particle Engine
• Update()
public void Update()
{
TTL--;
Position += Velocity;
Angle += AngularVelocity;
}
2D Particle Engine
• Update()
public void Update()
{
TTL--;
Position += Velocity;
Angle += AngularVelocity;
}
2D Particle Engine
• Draw()
public void Draw(SpriteBatch spriteBatch)
{
Rectangle sourceRectangle = new Rectangle(0, 0, Texture.Width, Texture.Height);
Vector2 origin = new Vector2(Texture.Width / 2, Texture.Height / 2);
spriteBatch.Draw(Texture, Position, sourceRectangle, Color,
Angle, origin, Size, SpriteEffects.None, 0f);
}
2D Particle Engine
• Particle
• ParticleEngine2D
Public class Particle
Public class ParticleEngine2D
2D Particle Engine
Public class ParticleEngine2D
2D Particle Engine
Public class ParticleEngine2D
• Properties
private Random random;
public Vector2 EmitterLocation { get; set; }
private List<Particle> particles;
private List<Texture2D> textures;
2D Particle Engine
public void Update()
{
int total = 10;
for (int i = 0; i < total; i++)
{
particles.Add(GenerateNewParticle());
}
for (int particle = 0; particle < particles.Count; particle++)
{
particles[particle].Update();
if (particles[particle].TTL <= 0)
{
particles.RemoveAt(particle);
particle--;
}
}
}
2D Particle Engine
public void Update()
{
int total = 10;
for (int i = 0; i < total; i++)
{
particles.Add(GenerateNewParticle());
}
for (int particle = 0; particle < particles.Count; particle++)
{
particles[particle].Update();
if (particles[particle].TTL <= 0)
{
particles.RemoveAt(particle);
particle--;
}
}
}
2D Particle Engine
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Begin();
for (int index = 0; index < particles.Count; index++)
{
particles[index].Draw(spriteBatch);
}
spriteBatch.End();
}
2D Particle Engine
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Begin();
for (int index = 0; index < particles.Count; index++)
{
particles[index].Draw(spriteBatch);
}
spriteBatch.End();
}
2D Particle Engine
• Game1 calling
2D Particle Engine
• In Update()
• In Draw()
2D Particle Engine
• In Update()
• In Draw()
particleEngine.EmitterLocation = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
particleEngine.Update();
2D Particle Engine
• In Update()
• In Draw()
particleEngine.EmitterLocation = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
particleEngine.Update();
particleEngine.Draw(spriteBatch);
2D Particle Engine
• In Update()
• In Draw()
particleEngine.EmitterLocation = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
particleEngine.Update();
particleEngine.Draw(spriteBatch);
2D Particle Engine
• Test it, Very nice!
• Can easily be ported to windows phone!
– Visit my mobile crash course on slideshare / Windows Phone slide:
http://www.slideshare.net/ZGTRZGTR/mobile-software-engineering-crash-course-c06-windowsphone/
• App-2DParticleEngines
• You can test it on Windows Mobile!

More Related Content

PDF
XNA L08–Amazing XNA Utilities
PDF
XNA L03–Models, Basic Effect and Animation
PDF
XNA L02–Basic Matrices and Transformations
PDF
XNA L04–Primitives, IndexBuffer and VertexBuffer
PDF
SVGo workshop
PDF
Exploring Canvas
PDF
Coding for
PDF
XNA L08–Amazing XNA Utilities
XNA L03–Models, Basic Effect and Animation
XNA L02–Basic Matrices and Transformations
XNA L04–Primitives, IndexBuffer and VertexBuffer
SVGo workshop
Exploring Canvas
Coding for

What's hot (20)

PDF
Image recognition applications and dataset preparation - DevFest Baghdad 2018
PPT
Chapter 13
KEY
ARTDM 170, Week 13: Text Elements + Arrays
PDF
Chaco Step-by-Step
PPTX
Introduction to HTML5 Canvas
PDF
Intro to HTML5 Canvas
PPTX
Drawing with the HTML5 Canvas
PDF
The Ring programming language version 1.5.4 book - Part 30 of 185
PPTX
Stamps - a better way to object composition
PDF
2011 11-mozcamp
PDF
Html5 canvas
PPT
JavaScript Obfuscation
PDF
The Ring programming language version 1.10 book - Part 39 of 212
PDF
Swift, via "swift-2048"
PPTX
Canvas al ajillo
PPS
CS101- Introduction to Computing- Lecture 35
PDF
The Ring programming language version 1.7 book - Part 49 of 196
PDF
Hidden Gems in Swift
PDF
Willustrator
 
Image recognition applications and dataset preparation - DevFest Baghdad 2018
Chapter 13
ARTDM 170, Week 13: Text Elements + Arrays
Chaco Step-by-Step
Introduction to HTML5 Canvas
Intro to HTML5 Canvas
Drawing with the HTML5 Canvas
The Ring programming language version 1.5.4 book - Part 30 of 185
Stamps - a better way to object composition
2011 11-mozcamp
Html5 canvas
JavaScript Obfuscation
The Ring programming language version 1.10 book - Part 39 of 212
Swift, via "swift-2048"
Canvas al ajillo
CS101- Introduction to Computing- Lecture 35
The Ring programming language version 1.7 book - Part 49 of 196
Hidden Gems in Swift
Willustrator
 
Ad

Viewers also liked (7)

PPTX
A View of 3D PLE
PPT
Raster Scan And Random Scan
PPTX
Random scan displays and raster scan displays
PPT
applications of computer graphics
PPT
Raster Scan and Raster Scan Displays
PPT
Parts of a Computer
PPT
basics of computer system ppt
A View of 3D PLE
Raster Scan And Random Scan
Random scan displays and raster scan displays
applications of computer graphics
Raster Scan and Raster Scan Displays
Parts of a Computer
basics of computer system ppt
Ad

Similar to XNA L09–2D Graphics and Particle Engines (20)

PPTX
How to make a video game
PDF
C++ Windows Forms L08 - GDI P1
KEY
Getting Started with CoreGraphics
PDF
Jetpack Compose - Hands-on February 2020
PPT
HTML5 Canvas
PDF
Adventures In Data Compilation
PDF
Sceneform SDK на практиці - UA Mobile 2019
PDF
Sceneform SDK на практиці - UA Mobile 2019
PPT
OOP v3
PDF
Introduction to Coding
PPTX
Chapter 02 sprite and texture
PDF
Opensource gis development - part 3
PDF
Creating Dynamic Charts With JFreeChart
PPTX
DOC
XNA coding series
PPTX
Introduction to open gl in android droidcon - slides
PDF
Intro to computer vision in .net
PDF
Android UI Development: Tips, Tricks, and Techniques
PDF
Android UI Tips, Tricks and Techniques
PDF
Visual sedimentation - IEEE VIS 2013 Atlanta
How to make a video game
C++ Windows Forms L08 - GDI P1
Getting Started with CoreGraphics
Jetpack Compose - Hands-on February 2020
HTML5 Canvas
Adventures In Data Compilation
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019
OOP v3
Introduction to Coding
Chapter 02 sprite and texture
Opensource gis development - part 3
Creating Dynamic Charts With JFreeChart
XNA coding series
Introduction to open gl in android droidcon - slides
Intro to computer vision in .net
Android UI Development: Tips, Tricks, and Techniques
Android UI Tips, Tricks and Techniques
Visual sedimentation - IEEE VIS 2013 Atlanta

More from Mohammad Shaker (20)

PDF
12 Rules You Should to Know as a Syrian Graduate
PDF
Ultra Fast, Cross Genre, Procedural Content Generation in Games [Master Thesis]
PDF
Interaction Design L06 - Tricks with Psychology
PDF
Short, Matters, Love - Passioneers Event 2015
PDF
Unity L01 - Game Development
PDF
Android L07 - Touch, Screen and Wearables
PDF
Interaction Design L03 - Color
PDF
Interaction Design L05 - Typography
PDF
Interaction Design L04 - Materialise and Coupling
PDF
Android L05 - Storage
PDF
Android L04 - Notifications and Threading
PDF
Android L09 - Windows Phone and iOS
PDF
Interaction Design L01 - Mobile Constraints
PDF
Interaction Design L02 - Pragnanz and Grids
PDF
Android L10 - Stores and Gaming
PDF
Android L06 - Cloud / Parse
PDF
Android L08 - Google Maps and Utilities
PDF
Android L03 - Styles and Themes
PDF
Android L02 - Activities and Adapters
PDF
Android L01 - Warm Up
12 Rules You Should to Know as a Syrian Graduate
Ultra Fast, Cross Genre, Procedural Content Generation in Games [Master Thesis]
Interaction Design L06 - Tricks with Psychology
Short, Matters, Love - Passioneers Event 2015
Unity L01 - Game Development
Android L07 - Touch, Screen and Wearables
Interaction Design L03 - Color
Interaction Design L05 - Typography
Interaction Design L04 - Materialise and Coupling
Android L05 - Storage
Android L04 - Notifications and Threading
Android L09 - Windows Phone and iOS
Interaction Design L01 - Mobile Constraints
Interaction Design L02 - Pragnanz and Grids
Android L10 - Stores and Gaming
Android L06 - Cloud / Parse
Android L08 - Google Maps and Utilities
Android L03 - Styles and Themes
Android L02 - Activities and Adapters
Android L01 - Warm Up

Recently uploaded (20)

PDF
Approach and Philosophy of On baking technology
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
sap open course for s4hana steps from ECC to s4
PPTX
Spectroscopy.pptx food analysis technology
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
MYSQL Presentation for SQL database connectivity
PDF
cuic standard and advanced reporting.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
KodekX | Application Modernization Development
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Machine learning based COVID-19 study performance prediction
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Approach and Philosophy of On baking technology
Digital-Transformation-Roadmap-for-Companies.pptx
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
MIND Revenue Release Quarter 2 2025 Press Release
Reach Out and Touch Someone: Haptics and Empathic Computing
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
The AUB Centre for AI in Media Proposal.docx
sap open course for s4hana steps from ECC to s4
Spectroscopy.pptx food analysis technology
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
The Rise and Fall of 3GPP – Time for a Sabbatical?
MYSQL Presentation for SQL database connectivity
cuic standard and advanced reporting.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
KodekX | Application Modernization Development
Chapter 3 Spatial Domain Image Processing.pdf
Machine learning based COVID-19 study performance prediction
Profit Center Accounting in SAP S/4HANA, S4F28 Col11

XNA L09–2D Graphics and Particle Engines

  • 1. Mohammad Shaker mohammadshaker.com @ZGTRShaker 2011, 2012, 2013, 2014 XNA Game Development L09 – 2D Graphics and Particle Engines
  • 3. 2D Graphics Topics • Introduction to 2D Graphics • SpriteBatches • Drawing Text with SpriteFonts • Texure Atlases • Rotating Sprites • Additive Blending with Sprites • 2D Particle Engines
  • 4. 2D World - Intro
  • 6. SpriteBatch • Create a Place to Store the Images In Game private Texture2D background; private Texture2D shuttle; private Texture2D earth;
  • 7. SpriteBatch • Create a Place to Store the Images In Game • LoadContent() method private Texture2D background; private Texture2D shuttle; private Texture2D earth; background = Content.Load<Texture2D>("stars"); shuttle = Content.Load<Texture2D>("shuttle"); earth = Content.Load<Texture2D>("earth");
  • 11. SpriteBatch • SpriteBatches Declaration • Initializing in LoadContent() SpriteBatch spriteBatch; 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 }
  • 12. SpriteBatch • Drawing with SpriteBatches spriteBatch.Begin(); spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White); spriteBatch.End();
  • 13. SpriteBatch • Drawing with SpriteBatches spriteBatch.Begin(); spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White); spriteBatch.End();
  • 14. SpriteBatch • A Few More Sprites spriteBatch.Begin(); spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White); spriteBatch.Draw(earth, new Vector2(400, 250), Color.White); spriteBatch.Draw(shuttle, new Vector2(450, 250), Color.White); spriteBatch.End();
  • 15. SpriteBatch • A Few More Sprites spriteBatch.Begin(); spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White); spriteBatch.Draw(earth, new Vector2(400, 250), Color.White); spriteBatch.Draw(shuttle, new Vector2(450, 250), Color.White); spriteBatch.End();
  • 16. SpriteBatch • A Few More Sprites spriteBatch.Begin(); spriteBatch.Draw(background, new Rectangle(0, 0, 800, 480), Color.White); spriteBatch.Draw(earth, new Vector2(400, 250), Color.White); spriteBatch.Draw(shuttle, new Vector2(450, 250), Color.White); spriteBatch.End(); You can find this in “App1-SimpleTextures”
  • 19. Acquiring Fonts • Down at about line 14 in the new created file you will see the following: • You can use any font you want that’s installed in your system • Fonts can be installed by dragging the font file to your Fonts folder, which is located in C:/Windows/Fonts <FontName>Segoe UI Mono</FontName>
  • 20. Acquiring Fonts • Down at about line 14 in the new created file you will see the following: <FontName>Segoe UI Mono</FontName>
  • 21. Acquiring Fonts • Down at about line 14 in the new created file you will see the following: • Also look down at line 20, where it says: <FontName>Segoe UI Mono</FontName> <Size>14</Size>
  • 22. Acquiring Fonts – the using of • Global Scope private SpriteFont font; private int score = 0;
  • 23. Acquiring Fonts – the using of • Global Scope • LoadContent() private SpriteFont font; private int score = 0; font = Content.Load<SpriteFont>("Score"); // Use the name of your font here instead of 'Score'.
  • 24. Acquiring Fonts – the using of • Global Scope • LoadContent() • Draw() private SpriteFont font; private int score = 0; font = Content.Load<SpriteFont>("Score"); // Use the name of your font here instead of 'Score'. spriteBatch.Begin(); spriteBatch.DrawString(font, "Score", new Vector2(100, 100), Color.Black); spriteBatch.End();
  • 25. Acquiring Fonts – the using of
  • 26. Acquiring Fonts – the using of • Enhancing visual with Update() method
  • 27. Acquiring Fonts – the using of • Enhancing visual with Update() method score++;
  • 28. Acquiring Fonts – the using of • Enhancing visual with Update() method • Now let's replace our original spriteBatch.DrawString() line with the following: score++; spriteBatch.DrawString(font, "Score: " + score, new Vector2(100, 100), Color.Black);
  • 29. Acquiring Fonts – the using of • “App2-ShowingText”
  • 33. Texture Atlases • Creating an AnimatedSprite Class • Class scope members public class AnimatedSprite public Texture2D Texture { get; set; } public int Rows { get; set; } public int Columns { get; set; } private int currentFrame; private int totalFrames;
  • 34. Texture Atlases • Update() method public void Update() { currentFrame++; if (currentFrame == totalFrames) currentFrame = 0; }
  • 35. Texture Atlases • Draw() method public void Draw(SpriteBatch spriteBatch, Vector2 location) { int width = Texture.Width / Rows; int height = Texture.Height / Columns; int row = (int)((float)currentFrame / (float)Columns); int column = currentFrame % Columns; Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height); Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, width, height); spriteBatch.Begin(); spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White); spriteBatch.End(); }
  • 36. Texture Atlases • Draw() method public void Draw(SpriteBatch spriteBatch, Vector2 location) { int width = Texture.Width / Rows; int height = Texture.Height / Columns; int row = (int)((float)currentFrame / (float)Columns); int column = currentFrame % Columns; Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height); Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, width, height); spriteBatch.Begin(); spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White); spriteBatch.End(); }
  • 37. Texture Atlases • Draw() method public void Draw(SpriteBatch spriteBatch, Vector2 location) { int width = Texture.Width / Rows; int height = Texture.Height / Columns; int row = (int)((float)currentFrame / (float)Columns); int column = currentFrame % Columns; Rectangle sourceRectangle = new Rectangle(width * column, height * row, width, height); Rectangle destinationRectangle = new Rectangle((int)location.X, (int)location.Y, width, height); spriteBatch.Begin(); spriteBatch.Draw(Texture, destinationRectangle, sourceRectangle, Color.White); spriteBatch.End(); }
  • 38. Texture Atlases • Now, in Game1 Class there’s just two calls!
  • 39. Texture Atlases • Now, in Game1 Class there’s just two calls!
  • 40. Texture Atlases • Now, in Game1 Class there’s just two calls!
  • 41. Texture Atlases protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); animatedSprite.Update(); base.Update(gameTime); }
  • 42. Texture Atlases protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); animatedSprite.Update(); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); animatedSprite.Draw(spriteBatch, new Vector2(400, 200)); base.Draw(gameTime); }
  • 43. Texture Atlases protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); animatedSprite.Update(); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); animatedSprite.Draw(spriteBatch, new Vector2(400, 200)); base.Draw(gameTime); }
  • 46. Rotating Sprites • Preparing the Content private Texture2D arrow; private float angle = 0;
  • 47. Rotating Sprites • Preparing the Content private Texture2D arrow; private float angle = 0;
  • 48. Rotating Sprites • Preparing the Content • In LoadContent() method • In Update() method private Texture2D arrow; private float angle = 0; // use the name of your texture here, if you are using your own arrow = Content.Load<Texture2D>("arrow"); angle += 0.01f;
  • 49. Rotating Sprites • Draw() Method spriteBatch.Begin(); Vector2 location = new Vector2(400, 240); Rectangle sourceRectangle = new Rectangle(0, 0, arrow.Width, arrow.Height); Vector2 origin = new Vector2(0, 0); spriteBatch.Draw(arrow, location, sourceRectangle, Color.White, angle, origin, 1.0f, SpriteEffects.None, 1); spriteBatch.End();
  • 53. Rotating Sprites • Compile and run and c it! • “App3-RotatingSpriteV0.1”
  • 54. Rotating Sprites • It’s not what we need!
  • 55. Rotating Sprites • It’s not what we need! • We need a“Center Point Rotation”!
  • 56. Using a Center Point for Rotation • In Draw(), change Vector2 origin = new Vector2(0, 0); Vector2 origin = new Vector2(arrow.Width / 2, arrow.Height); • To
  • 57. Using a Center Point for Rotation • Compile and run
  • 58. Using a Center Point for Rotation • Compile and run
  • 61. 2D Particle Engine • Introduction
  • 64. 2D Particle Engine • Anatomy of a Particle Engine
  • 65. 2D Particle Engine • Anatomy of a Particle Engine – particles,
  • 66. 2D Particle Engine • Anatomy of a Particle Engine – particles, – particle emitter,
  • 67. 2D Particle Engine • Anatomy of a Particle Engine – particles, – particle emitter, – the engine itself
  • 68. 2D Particle Engine • Anatomy of a Particle Engine – particles • Velocity – particle emitter, – the engine itself
  • 69. 2D Particle Engine • Anatomy of a Particle Engine – particles • Velocity, Angles – particle emitter, – the engine itself
  • 70. 2D Particle Engine • Anatomy of a Particle Engine – particles • Velocity, Angles – particle emitter • Location that the particles are coming from – the engine itself
  • 71. 2D Particle Engine • Anatomy of a Particle Engine – particles • Velocity, Angles – particle emitter • Location that the particles are coming from • Responsible for determining how many particles will be created at any given time – the engine itself
  • 72. 2D Particle Engine • Anatomy of a Particle Engine – particles • Velocity, Angles – particle emitter • Location that the particles are coming from • Responsible for determining how many particles will be created at any given time – the engine itself • Manages the state of the previous two components
  • 73. 2D Particle Engine • Anatomy of a Particle Engine – particles • Velocity, Angles – particle emitter • Location that the particles are coming from • Responsible for determining how many particles will be created at any given time – the engine itself • Manages the state of the previous two components • Responsible for removing dead particles from the system
  • 74. 2D Particle Engine • Anatomy of a Particle Engine – particles • Velocity, Angles – particle emitter • Location that the particles are coming from • Responsible for determining how many particles will be created at any given time – the engine itself • Manages the state of the previous two components • Responsible for removing dead particles from the system.
  • 75. 2D Particle Engine • Particle Public class Particle
  • 76. 2D Particle Engine • Particle • ParticleEngine2D Public class Particle Public class ParticleEngine2D
  • 77. 2D Particle Engine • Particle Public class Particle
  • 78. 2D Particle Engine • Particle • The Particle's Properties Public class Particle
  • 79. 2D Particle Engine Public class Particle public Texture2D Texture { get; set; } public Vector2 Position { get; set; } public Vector2 Velocity { get; set; } public float Angle { get; set; } public float AngularVelocity { get; set; } public Color Color { get; set; } public float Size { get; set; } public int TTL { get; set; } • Particle • The Particle's Properties
  • 80. 2D Particle Engine • Particle • The Particle's Properties Public class Particle public Texture2D Texture { get; set; } public Vector2 Position { get; set; } public Vector2 Velocity { get; set; } public float Angle { get; set; } public float AngularVelocity { get; set; } public Color Color { get; set; } public float Size { get; set; } public int TTL { get; set; }
  • 81. 2D Particle Engine • Particle • The Particle's Properties Public class Particle public Texture2D Texture { get; set; } public Vector2 Position { get; set; } public Vector2 Velocity { get; set; } public float Angle { get; set; } public float AngularVelocity { get; set; } public Color Color { get; set; } public float Size { get; set; } public int TTL { get; set; }
  • 83. 2D Particle Engine • Update() public void Update() { TTL--; Position += Velocity; Angle += AngularVelocity; }
  • 84. 2D Particle Engine • Update() public void Update() { TTL--; Position += Velocity; Angle += AngularVelocity; }
  • 85. 2D Particle Engine • Draw() public void Draw(SpriteBatch spriteBatch) { Rectangle sourceRectangle = new Rectangle(0, 0, Texture.Width, Texture.Height); Vector2 origin = new Vector2(Texture.Width / 2, Texture.Height / 2); spriteBatch.Draw(Texture, Position, sourceRectangle, Color, Angle, origin, Size, SpriteEffects.None, 0f); }
  • 86. 2D Particle Engine • Particle • ParticleEngine2D Public class Particle Public class ParticleEngine2D
  • 87. 2D Particle Engine Public class ParticleEngine2D
  • 88. 2D Particle Engine Public class ParticleEngine2D • Properties private Random random; public Vector2 EmitterLocation { get; set; } private List<Particle> particles; private List<Texture2D> textures;
  • 89. 2D Particle Engine public void Update() { int total = 10; for (int i = 0; i < total; i++) { particles.Add(GenerateNewParticle()); } for (int particle = 0; particle < particles.Count; particle++) { particles[particle].Update(); if (particles[particle].TTL <= 0) { particles.RemoveAt(particle); particle--; } } }
  • 90. 2D Particle Engine public void Update() { int total = 10; for (int i = 0; i < total; i++) { particles.Add(GenerateNewParticle()); } for (int particle = 0; particle < particles.Count; particle++) { particles[particle].Update(); if (particles[particle].TTL <= 0) { particles.RemoveAt(particle); particle--; } } }
  • 91. 2D Particle Engine public void Draw(SpriteBatch spriteBatch) { spriteBatch.Begin(); for (int index = 0; index < particles.Count; index++) { particles[index].Draw(spriteBatch); } spriteBatch.End(); }
  • 92. 2D Particle Engine public void Draw(SpriteBatch spriteBatch) { spriteBatch.Begin(); for (int index = 0; index < particles.Count; index++) { particles[index].Draw(spriteBatch); } spriteBatch.End(); }
  • 93. 2D Particle Engine • Game1 calling
  • 94. 2D Particle Engine • In Update() • In Draw()
  • 95. 2D Particle Engine • In Update() • In Draw() particleEngine.EmitterLocation = new Vector2(Mouse.GetState().X, Mouse.GetState().Y); particleEngine.Update();
  • 96. 2D Particle Engine • In Update() • In Draw() particleEngine.EmitterLocation = new Vector2(Mouse.GetState().X, Mouse.GetState().Y); particleEngine.Update(); particleEngine.Draw(spriteBatch);
  • 97. 2D Particle Engine • In Update() • In Draw() particleEngine.EmitterLocation = new Vector2(Mouse.GetState().X, Mouse.GetState().Y); particleEngine.Update(); particleEngine.Draw(spriteBatch);
  • 98. 2D Particle Engine • Test it, Very nice! • Can easily be ported to windows phone! – Visit my mobile crash course on slideshare / Windows Phone slide: http://www.slideshare.net/ZGTRZGTR/mobile-software-engineering-crash-course-c06-windowsphone/ • App-2DParticleEngines • You can test it on Windows Mobile!