#region File Description //----------------------------------------------------------------------------- // GameSprite2D.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion #region Using Statements using System; using System.Collections.Generic; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using RobotGameData.Render; using RobotGameData.Resource; using RobotGameData.Collision; using RobotGameData.GameInterface; #endregion namespace RobotGameData.GameObject { #region Sprite2DObject /// /// this structure stores an 2D sprite object’s information. /// public class Sprite2DObject : INamed { #region Fields String name = String.Empty; Rectangle screenRectangle = Rectangle.Empty; Rectangle sourceRectangle = Rectangle.Empty; Color color = new Color(0xFF, 0xFF, 0xFF); float rotation = 0.0f; float scale = 1.0f; bool visible = true; #endregion #region Properties public string Name { get { return name; } set { name = value; } } public bool Visible { get { return visible; } set { visible = value; } } public Rectangle ScreenRectangle { get { return screenRectangle; } set { screenRectangle = value; } } public Vector2 ScreenPosition { get { return new Vector2(screenRectangle.X, screenRectangle.Y); } set { screenRectangle.X = (int)value.X; screenRectangle.Y = (int)value.Y; } } public Vector2 ScreenSize { get { return new Vector2(screenRectangle.Width, screenRectangle.Height); } set { screenRectangle.Width = (int)value.X; screenRectangle.Height = (int)value.Y; } } public Rectangle SourceRectangle { get { return sourceRectangle; } set { sourceRectangle = value; } } public Vector2 SourcePosition { get { return new Vector2(sourceRectangle.X, sourceRectangle.Y); } set { sourceRectangle.X = (int)value.X; sourceRectangle.Y = (int)value.Y; } } public Vector2 SourceSize { get { return new Vector2(sourceRectangle.Width, sourceRectangle.Height); } set { sourceRectangle.Width = (int)value.X; sourceRectangle.Height = (int)value.Y; } } public Color Color { get { return color; } set { color = value; } } public byte Alpha { get { return color.A; } set { color = new Color(color.R, color.R, color.B, value); } } public float Rotation { get { return rotation; } set { rotation = value; } } public float Scale { get { return scale; } set { scale = value; } } #endregion #region Constructors public Sprite2DObject(string name, Texture2D tex) { Name = name; ScreenRectangle = new Rectangle(0, 0, tex.Width, tex.Height); SourceRectangle = new Rectangle(0, 0, tex.Width, tex.Height); } public Sprite2DObject(string name, Texture2D tex, Vector2 screenPosition) { Name = name; ScreenRectangle = new Rectangle( (int)screenPosition.X, (int)screenPosition.Y, tex.Width, tex.Height); SourceRectangle = new Rectangle(0, 0, tex.Width, tex.Height); } public Sprite2DObject(string name, Texture2D tex, Vector2 screenPosition, Vector2 screenSize) { Name = name; ScreenRectangle = new Rectangle( (int)screenPosition.X, (int)screenPosition.Y, (int)screenSize.X, (int)screenSize.Y); SourceRectangle = new Rectangle(0, 0, tex.Width, tex.Height); } public Sprite2DObject(string name, Vector2 screenPosition, Vector2 screenSize, Vector2 sourcePosition, Vector2 sourceSize) { Name = name; ScreenRectangle = new Rectangle( (int)screenPosition.X, (int)screenPosition.Y, (int)screenSize.X, (int)screenSize.Y); SourceRectangle = new Rectangle( (int)sourcePosition.X, (int)sourcePosition.Y, (int)sourceSize.X, (int)sourceSize.Y); } public Sprite2DObject(string name, Texture2D tex, Vector2 screenPosition, Rectangle sourceRectangle) { Name = name; ScreenRectangle = new Rectangle( (int)screenPosition.X, (int)screenPosition.Y, tex.Width, tex.Height); SourceRectangle = sourceRectangle; } public Sprite2DObject(string name, Rectangle screenRectangle, Rectangle sourceRectangle) { Name = name; ScreenRectangle = screenRectangle; SourceRectangle = sourceRectangle; } #endregion } #endregion /// /// this sprite draws an image to the 2D screen. /// public class GameSprite2D : GameSceneNode { #region Fields Texture2D texture2D = null; List spriteList = new List(); #endregion #region Properties public Texture2D TextureResource { get { return texture2D; } } #endregion /// /// draws the registered sprite objects by using the sprite batch. /// /// protected override void OnDraw(RenderTracer renderTracer) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); else if (TextureResource.IsDisposed ) throw new ObjectDisposedException("TextureResource"); for (int i = 0; i < spriteList.Count; i++) { Sprite2DObject sprite = spriteList[i]; if (sprite != null) { // If active visible if (sprite.Visible ) { renderTracer.SpriteBatch.Draw(TextureResource, sprite.ScreenRectangle, sprite.SourceRectangle, sprite.Color); } } } } protected override void UnloadContent() { spriteList.Clear(); base.UnloadContent(); } /// /// creates 2D sprite objects using the texture. /// /// sprite objects count /// texture file name public void Create(int count, string fileName) { for (int i = 0; i < count; i++) spriteList.Add(null); GameResourceTexture2D resource = FrameworkCore.ResourceManager.LoadTexture(fileName); texture2D = resource.Texture2D; } /// /// add a sprite object. /// /// an index of sprite object /// sprite object name /// public Sprite2DObject AddSprite(int index, string name) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); Sprite2DObject newSprite = new Sprite2DObject(name, TextureResource); AddSprite(index, newSprite); return newSprite; } /// /// add a sprite object. /// /// an index of sprite object /// sprite object name /// /// 2D screen position of sprite object (pixel) /// /// public Sprite2DObject AddSprite(int index, string name, Vector2 screenPosition) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); Sprite2DObject newSprite = new Sprite2DObject(name, TextureResource, screenPosition); AddSprite(index, newSprite); return newSprite; } /// /// add a sprite object. /// /// an index of sprite object /// sprite object name /// /// 2D screen position of sprite object (pixel) /// /// 2D screen size of sprite object (pixel) /// public Sprite2DObject AddSprite(int index, string name, Vector2 screenPosition, Vector2 screenSize) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); Sprite2DObject newSprite = new Sprite2DObject(name, TextureResource, screenPosition, screenSize); AddSprite(index, newSprite); return newSprite; } /// /// add a sprite object. /// /// an index of sprite object /// sprite object name /// /// 2D screen position of sprite object (pixel) /// /// 2D screen size of sprite object (pixel) /// position of the source image (pixel) /// size of the source image (pixel) /// public Sprite2DObject AddSprite(int index, string name, Vector2 screenPosition, Vector2 screenSize, Vector2 sourcePosition, Vector2 sourceSize) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); Sprite2DObject newSprite = new Sprite2DObject(name, screenPosition, screenSize, sourcePosition, sourceSize); AddSprite(index, newSprite); return newSprite; } /// /// add a sprite object. /// /// an index of sprite object /// sprite object name /// /// 2D screen position of sprite object (pixel) /// /// a rectangle of the source image (pixel) /// public Sprite2DObject AddSprite(int index, string name, Vector2 screenPosition, Rectangle sourceRectangle) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); Sprite2DObject newSprite = new Sprite2DObject(name, TextureResource, screenPosition, sourceRectangle); AddSprite(index, newSprite); return newSprite; } /// /// add a sprite object. /// /// an index of sprite object /// sprite object name /// a rectangle of sprite object (pixel) /// a rectangle of the source image (pixel) /// public Sprite2DObject AddSprite(int index, string name, Rectangle screenRectangle, Rectangle sourceRectangle) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); Sprite2DObject newSprite = new Sprite2DObject(name, screenRectangle, sourceRectangle); AddSprite(index, newSprite); return newSprite; } /// /// add a sprite object. /// /// an index of sprite object /// source sprite object public void AddSprite(int index, Sprite2DObject spriteObject) { if (TextureResource == null) throw new InvalidOperationException("The texture is empty"); if (spriteList.Count <= index || index < 0) throw new ArgumentException( "Cannot add sprite. Invalid index : " + index.ToString()); if( spriteList[index] != null) throw new ArgumentException( "Cannot add sprite. already exist other sprite : " + index.ToString()); spriteList[index] = spriteObject; } /// /// gets the sprite object. /// /// an index of sprite object /// sprite object public Sprite2DObject GetSprite(int index) { if( spriteList.Count >= index || index < 0) throw new ArgumentException( "Invalid index : " + index.ToString()); return spriteList[index]; } /// /// configures visibility of all sprite objects. /// /// visibility flag public void VisibleSprite(bool visible) { for (int i = 0; i < spriteList.Count; i++) spriteList[i].Visible = visible; } /// /// configures a visibility of each sprite object. /// /// an index of sprite object /// visibility flag public void VisibleSprite(int index, bool visible) { GetSprite(index).Visible = visible; } /// /// finds an index of sprite object by object /// /// /// public int FindSpriteIndex(Sprite2DObject sprite) { return spriteList.IndexOf(sprite); } /// /// swaps two sprite objects and changes the priority and the /// position in the list. /// /// /// public void SwapSprite(Sprite2DObject tex1, Sprite2DObject tex2) { int index1 = FindSpriteIndex(tex1); // Cannot find sprite if( index1 < 0) throw new ArgumentException("Cannot find tex1"); int index2 = FindSpriteIndex(tex2); // Cannot find sprite if (index2 < 0) throw new ArgumentException("Cannot find tex2"); spriteList[index1] = tex2; spriteList[index2] = tex1; } } }