#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;
}
}
}