diff --git a/Glee2D.License.txt b/Glee2D.License.txt new file mode 100644 index 0000000..125a926 --- /dev/null +++ b/Glee2D.License.txt @@ -0,0 +1,32 @@ +Microsoft Public License (Ms-PL) +Microsoft Public License (Ms-PL) + +This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software. + +1. Definitions + +The terms "reproduce," "reproduction," "derivative works," and "distribution" have the same meaning here as under U.S. copyright law. + +A "contribution" is the original software, or any additions or changes to the software. + +A "contributor" is any person that distributes its contribution under this license. + +"Licensed patents" are a contributor's patent claims that read directly on its contribution. + +2. Grant of Rights + +(A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create. + +(B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software. + +3. Conditions and Limitations + +(A) No Trademark License- This license does not grant you rights to use any contributors' name, logo, or trademarks. + +(B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically. + +(C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software. + +(D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license. + +(E) The software is licensed "as-is." You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement. \ No newline at end of file diff --git a/README b/README new file mode 100644 index 0000000..a245ee3 --- /dev/null +++ b/README @@ -0,0 +1,54 @@ +Axios Engine +============ + +Axios Engine is an open source 2D XNA Game Engine. + +Mission Statement +----------------- + +To create an open source game engine that thrives on simplicity without sacrificing usability. + +Supported Platforms +------------------- + +- Windows 7 +- Windows Phone 7 +- Xbox 360 + +Documentation +------------- + +Official wiki: +http://wiki.axiosengine.com/ + +Build Instructions +------------------ + +Open the solution and hit build. DLLs for each platform will be put into the "Combined" folder. + +Where can I download pre-built DLLs? +------------------- + +Official versions can be downloaded here: + + http://code.google.com/p/axiosengine/downloads/list + +Of course you can always build from source from: + + http://code.google.com/p/axiosengine/source/checkout + +Authors +------- + +General questions/comments/concerns can be directed at: +Nathan Adams - adamsna[at]datanethost.net + +Copyright and License Information +--------------------------------- + +Axios - See Axios License.txt +- Written by Nathan Adams and released under the Apache License + +Farseer - See Farseer License.txt + +Glee2D - See Glee2D License.txt \ No newline at end of file diff --git a/axios.suo b/axios.suo index d52e932..08bbf26 100644 Binary files a/axios.suo and b/axios.suo differ diff --git a/axios/Axios_WP7.csproj b/axios/Axios_WP7.csproj index c08a9d5..cd66723 100644 --- a/axios/Axios_WP7.csproj +++ b/axios/Axios_WP7.csproj @@ -172,7 +172,14 @@ + + + + + + + diff --git a/axios/Axios_Windows.csproj b/axios/Axios_Windows.csproj index e97654d..9fba062 100644 --- a/axios/Axios_Windows.csproj +++ b/axios/Axios_Windows.csproj @@ -215,7 +215,14 @@ + + + + + + + diff --git a/axios/Axios_Xbox_360.csproj b/axios/Axios_Xbox_360.csproj index a982dc3..362f107 100644 --- a/axios/Axios_Xbox_360.csproj +++ b/axios/Axios_Xbox_360.csproj @@ -165,7 +165,14 @@ + + + + + + + diff --git a/axios/Engine/Glee2D/CircleItem.cs b/axios/Engine/Glee2D/CircleItem.cs new file mode 100644 index 0000000..4b71bd9 --- /dev/null +++ b/axios/Engine/Glee2D/CircleItem.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FarseerPhysics.Dynamics; +using FarseerPhysics.Common; +using FarseerPhysics.SamplesFramework; +using FarseerPhysics.Factories; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; + +namespace Axios.Engine.Glee2D +{ + public partial class CircleItem : Item + { + public float Radius; + public Color FillColor; + + Body _body; + + public CircleItem() + { + } + + public override void load(ContentManager cm, World world) + { + base.load(cm, world); + + _body = BodyFactory.CreateCircle(world, Radius, 1f); + _body.Position = Position; + _body.UserData = this; + } + + } +} diff --git a/axios/Engine/Glee2D/CustomProperty.cs b/axios/Engine/Glee2D/CustomProperty.cs new file mode 100644 index 0000000..31dfd7b --- /dev/null +++ b/axios/Engine/Glee2D/CustomProperty.cs @@ -0,0 +1,165 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FarseerPhysics.Dynamics; +using FarseerPhysics.Common; +using FarseerPhysics.SamplesFramework; +using FarseerPhysics.Factories; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using System.Xml; +using System.Xml.Serialization; + +namespace Axios.Engine.Glee2D +{ + /////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////// + // + // NEEDED FOR SERIALIZATION. YOU SHOULDN'T CHANGE ANYTHING BELOW! + // + /////////////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////////////////////// + + + public class CustomProperty + { + public string name; + public object value; + public Type type; + public string description; + + public CustomProperty() + { + } + + public CustomProperty(string n, object v, Type t, string d) + { + name = n; + value = v; + type = t; + description = d; + } + + public CustomProperty clone() + { + CustomProperty result = new CustomProperty(name, value, type, description); + return result; + } + } + + + public class SerializableDictionary : Dictionary, IXmlSerializable + { + + public SerializableDictionary() + : base() + { + + } + + public SerializableDictionary(SerializableDictionary copyfrom) + : base(copyfrom) + { + string[] keyscopy = new string[Keys.Count]; + Keys.CopyTo(keyscopy, 0); + foreach (string key in keyscopy) + { + this[key] = this[key].clone(); + } + } + + public System.Xml.Schema.XmlSchema GetSchema() + { + return null; + } + + public void ReadXml(System.Xml.XmlReader reader) + { + + bool wasEmpty = reader.IsEmptyElement; + reader.Read(); + + if (wasEmpty) return; + + while (reader.NodeType != System.Xml.XmlNodeType.EndElement) + { + CustomProperty cp = new CustomProperty(); + cp.name = reader.GetAttribute("Name"); + cp.description = reader.GetAttribute("Description"); + + string type = reader.GetAttribute("Type"); + if (type == "string") cp.type = typeof(string); + if (type == "bool") cp.type = typeof(bool); + if (type == "Vector2") cp.type = typeof(Vector2); + if (type == "Color") cp.type = typeof(Color); + if (type == "Item") cp.type = typeof(Item); + + if (cp.type == typeof(Item)) + { + cp.value = reader.ReadInnerXml(); + this.Add(cp.name, cp); + } + else + { + reader.ReadStartElement("Property"); + XmlSerializer valueSerializer = new XmlSerializer(cp.type); + object obj = valueSerializer.Deserialize(reader); +#if WINDOWS + cp.value = Convert.ChangeType(obj, cp.type); +#elif WINDOWS_PHONE || XBOX360 + cp.value = Convert.ChangeType(obj, cp.type, null); +#endif + this.Add(cp.name, cp); + reader.ReadEndElement(); + } + + reader.MoveToContent(); + } + reader.ReadEndElement(); + } + + public void WriteXml(System.Xml.XmlWriter writer) + { + foreach (String key in this.Keys) + { + writer.WriteStartElement("Property"); + writer.WriteAttributeString("Name", this[key].name); + if (this[key].type == typeof(string)) writer.WriteAttributeString("Type", "string"); + if (this[key].type == typeof(bool)) writer.WriteAttributeString("Type", "bool"); + if (this[key].type == typeof(Vector2)) writer.WriteAttributeString("Type", "Vector2"); + if (this[key].type == typeof(Color)) writer.WriteAttributeString("Type", "Color"); + if (this[key].type == typeof(Item)) writer.WriteAttributeString("Type", "Item"); + writer.WriteAttributeString("Description", this[key].description); + + if (this[key].type == typeof(Item)) + { + Item item = (Item)this[key].value; + if (item != null) writer.WriteString(item.Name); + else writer.WriteString("$null$"); + } + else + { + XmlSerializer valueSerializer = new XmlSerializer(this[key].type); + valueSerializer.Serialize(writer, this[key].value); + } + writer.WriteEndElement(); + } + } + + /// + /// Must be called after all Items have been deserialized. + /// Restores the Item references in CustomProperties of type Item. + /// + public void RestoreItemAssociations(Level level) + { + foreach (CustomProperty cp in Values) + { + if (cp.type == typeof(Item)) cp.value = level.getItemByName((string)cp.value); + } + } + + + } +} diff --git a/axios/Engine/Glee2D/Item.cs b/axios/Engine/Glee2D/Item.cs new file mode 100644 index 0000000..edea7e9 --- /dev/null +++ b/axios/Engine/Glee2D/Item.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Content; +using FarseerPhysics.Dynamics; + +namespace Axios.Engine.Glee2D +{ + [XmlInclude(typeof(TextureItem))] + [XmlInclude(typeof(RectangleItem))] + [XmlInclude(typeof(CircleItem))] + [XmlInclude(typeof(PathItem))] + public partial class Item + { + /// + /// The name of this item. + /// + [XmlAttribute()] + public String Name; + + /// + /// Should this item be visible? + /// + [XmlAttribute()] + public bool Visible; + + /// + /// The item's position in world space. + /// + public Vector2 Position; + + /// + /// A Dictionary containing any user-defined Properties. + /// + public SerializableDictionary CustomProperties; + + + public Item() + { + CustomProperties = new SerializableDictionary(); + } + + /// + /// Called by Level.FromFile(filename) on each Item after the deserialization process. + /// Should be overriden and can be used to load anything needed by the Item (e.g. a texture). + /// + public virtual void load(ContentManager cm, World world) + { + } + + public virtual void draw(SpriteBatch sb) + { + } + } +} diff --git a/axios/Engine/Glee2D/Layer.cs b/axios/Engine/Glee2D/Layer.cs new file mode 100644 index 0000000..5247c35 --- /dev/null +++ b/axios/Engine/Glee2D/Layer.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; + +namespace Axios.Engine.Glee2D +{ + public partial class Layer + { + /// + /// The name of the layer. + /// + [XmlAttribute()] + public String Name; + + /// + /// Should this layer be visible? + /// + [XmlAttribute()] + public bool Visible; + + /// + /// The list of the items in this layer. + /// + public List Items; + + /// + /// The Scroll Speed relative to the main camera. The X and Y components are + /// interpreted as factors, so (1;1) means the same scrolling speed as the main camera. + /// Enables parallax scrolling. + /// + public Vector2 ScrollSpeed; + + + public Layer() + { + Items = new List(); + ScrollSpeed = Vector2.One; + } + + public void draw(SpriteBatch sb) + { + if (!Visible) return; + foreach (Item item in Items) item.draw(sb); + } + + } +} diff --git a/axios/Engine/Glee2D/Level.cs b/axios/Engine/Glee2D/Level.cs index eba32c8..9d98e0d 100644 --- a/axios/Engine/Glee2D/Level.cs +++ b/axios/Engine/Glee2D/Level.cs @@ -102,404 +102,8 @@ namespace Axios.Engine.Glee2D } + - public partial class Layer - { - /// - /// The name of the layer. - /// - [XmlAttribute()] - public String Name; - /// - /// Should this layer be visible? - /// - [XmlAttribute()] - public bool Visible; - - /// - /// The list of the items in this layer. - /// - public List Items; - - /// - /// The Scroll Speed relative to the main camera. The X and Y components are - /// interpreted as factors, so (1;1) means the same scrolling speed as the main camera. - /// Enables parallax scrolling. - /// - public Vector2 ScrollSpeed; - - - public Layer() - { - Items = new List(); - ScrollSpeed = Vector2.One; - } - - public void draw(SpriteBatch sb) - { - if (!Visible) return; - foreach (Item item in Items) item.draw(sb); - } - - } - - - [XmlInclude(typeof(TextureItem))] - [XmlInclude(typeof(RectangleItem))] - [XmlInclude(typeof(CircleItem))] - [XmlInclude(typeof(PathItem))] - public partial class Item - { - /// - /// The name of this item. - /// - [XmlAttribute()] - public String Name; - - /// - /// Should this item be visible? - /// - [XmlAttribute()] - public bool Visible; - - /// - /// The item's position in world space. - /// - public Vector2 Position; - - /// - /// A Dictionary containing any user-defined Properties. - /// - public SerializableDictionary CustomProperties; - - - public Item() - { - CustomProperties = new SerializableDictionary(); - } - - /// - /// Called by Level.FromFile(filename) on each Item after the deserialization process. - /// Should be overriden and can be used to load anything needed by the Item (e.g. a texture). - /// - public virtual void load(ContentManager cm, World world) - { - } - - public virtual void draw(SpriteBatch sb) - { - } - } - - - public partial class TextureItem : Item - { - /// - /// The item's rotation in radians. - /// - public float Rotation; - - /// - /// The item's scale factor. - /// - public float Scale; - - /// - /// The color to tint the item's texture with (use white for no tint). - /// - public Color TintColor; - - /// - /// If true, the texture is flipped horizontally when drawn. - /// - public bool FlipHorizontally; - - /// - /// If true, the texture is flipped vertically when drawn. - /// - public bool FlipVertically; - - /// - /// The path to the texture's filename (including the extension) relative to ContentRootFolder. - /// - public String texture_filename; - - /// - /// The texture_filename without extension. For using in Content.Load(). - /// - public String asset_name; - - /// - /// The XNA texture to be drawn. Can be loaded either from file (using "texture_filename") - /// or via the Content Pipeline (using "asset_name") - then you must ensure that the texture - /// exists as an asset in your project. - /// Loading is done in the Item's load() method. - /// - Texture2D texture; - - /// - /// The item's origin relative to the upper left corner of the texture. Usually the middle of the texture. - /// Used for placing and rotating the texture when drawn. - /// - public Vector2 Origin; - - - public TextureItem() - { - } - - /// - /// Called by Level.FromFile(filename) on each Item after the deserialization process. - /// Loads all assets needed by the TextureItem, especially the Texture2D. - /// You must provide your own implementation. However, you can rely on all public fields being - /// filled by the level deserialization process. - /// - public override void load(ContentManager cm, World world) - { - //throw new NotImplementedException(); - - //TODO: provide your own implementation of how a TextureItem loads its assets - //for example: - //this.texture = Texture2D.FromFile(, texture_filename); - //or by using the Content Pipeline: - this.texture = cm.Load(asset_name); - - } - - public override void draw(SpriteBatch sb) - { - if (!Visible) return; - SpriteEffects effects = SpriteEffects.None; - if (FlipHorizontally) effects |= SpriteEffects.FlipHorizontally; - if (FlipVertically) effects |= SpriteEffects.FlipVertically; - sb.Draw(texture, Position, null, TintColor, Rotation, Origin, Scale, effects, 0); - } - } - - - public partial class RectangleItem : Item - { - public float Width; - public float Height; - public Color FillColor; - - Body _body; - - public RectangleItem() - { - } - - public override void load(ContentManager cm, World world) - { - base.load(cm, world); - - _body = BodyFactory.CreateRectangle(world, Width, Height, 1f); - _body.Position = Position; - _body.UserData = this; - } - } - - - public partial class CircleItem : Item - { - public float Radius; - public Color FillColor; - - Body _body; - - public CircleItem() - { - } - - public override void load(ContentManager cm, World world) - { - base.load(cm, world); - - _body = BodyFactory.CreateCircle(world, Radius, 1f); - _body.Position = Position; - _body.UserData = this; - } - - } - - - public partial class PathItem : Item - { - public Vector2[] LocalPoints; - public Vector2[] WorldPoints; - public bool IsPolygon; - public int LineWidth; - public Color LineColor; - - Body _body; - - public PathItem() - { - } - - public override void load(ContentManager cm, World world) - { - base.load(cm, world); - - Vertices v = new Vertices(WorldPoints.Length); - foreach (Vector2 vec in WorldPoints) - v.Add(new Vector2(ConvertUnits.ToSimUnits(vec.X), ConvertUnits.ToSimUnits(vec.Y))); - - _body = BodyFactory.CreateLoopShape(world, v); - _body.Position = this.Position; - _body.UserData = this; - } - - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////// - // - // NEEDED FOR SERIALIZATION. YOU SHOULDN'T CHANGE ANYTHING BELOW! - // - /////////////////////////////////////////////////////////////////////////////////////////// - /////////////////////////////////////////////////////////////////////////////////////////// - - - public class CustomProperty - { - public string name; - public object value; - public Type type; - public string description; - - public CustomProperty() - { - } - - public CustomProperty(string n, object v, Type t, string d) - { - name = n; - value = v; - type = t; - description = d; - } - - public CustomProperty clone() - { - CustomProperty result = new CustomProperty(name, value, type, description); - return result; - } - } - - - public class SerializableDictionary : Dictionary, IXmlSerializable - { - - public SerializableDictionary() - : base() - { - - } - - public SerializableDictionary(SerializableDictionary copyfrom) - : base(copyfrom) - { - string[] keyscopy = new string[Keys.Count]; - Keys.CopyTo(keyscopy, 0); - foreach (string key in keyscopy) - { - this[key] = this[key].clone(); - } - } - - public System.Xml.Schema.XmlSchema GetSchema() - { - return null; - } - - public void ReadXml(System.Xml.XmlReader reader) - { - - bool wasEmpty = reader.IsEmptyElement; - reader.Read(); - - if (wasEmpty) return; - - while (reader.NodeType != System.Xml.XmlNodeType.EndElement) - { - CustomProperty cp = new CustomProperty(); - cp.name = reader.GetAttribute("Name"); - cp.description = reader.GetAttribute("Description"); - - string type = reader.GetAttribute("Type"); - if (type == "string") cp.type = typeof(string); - if (type == "bool") cp.type = typeof(bool); - if (type == "Vector2") cp.type = typeof(Vector2); - if (type == "Color") cp.type = typeof(Color); - if (type == "Item") cp.type = typeof(Item); - - if (cp.type == typeof(Item)) - { - cp.value = reader.ReadInnerXml(); - this.Add(cp.name, cp); - } - else - { - reader.ReadStartElement("Property"); - XmlSerializer valueSerializer = new XmlSerializer(cp.type); - object obj = valueSerializer.Deserialize(reader); -#if WINDOWS - cp.value = Convert.ChangeType(obj, cp.type); -#elif WINDOWS_PHONE || XBOX360 - cp.value = Convert.ChangeType(obj, cp.type, null); -#endif - this.Add(cp.name, cp); - reader.ReadEndElement(); - } - - reader.MoveToContent(); - } - reader.ReadEndElement(); - } - - public void WriteXml(System.Xml.XmlWriter writer) - { - foreach (String key in this.Keys) - { - writer.WriteStartElement("Property"); - writer.WriteAttributeString("Name", this[key].name); - if (this[key].type == typeof(string)) writer.WriteAttributeString("Type", "string"); - if (this[key].type == typeof(bool)) writer.WriteAttributeString("Type", "bool"); - if (this[key].type == typeof(Vector2)) writer.WriteAttributeString("Type", "Vector2"); - if (this[key].type == typeof(Color)) writer.WriteAttributeString("Type", "Color"); - if (this[key].type == typeof(Item)) writer.WriteAttributeString("Type", "Item"); - writer.WriteAttributeString("Description", this[key].description); - - if (this[key].type == typeof(Item)) - { - Item item = (Item)this[key].value; - if (item != null) writer.WriteString(item.Name); - else writer.WriteString("$null$"); - } - else - { - XmlSerializer valueSerializer = new XmlSerializer(this[key].type); - valueSerializer.Serialize(writer, this[key].value); - } - writer.WriteEndElement(); - } - } - - /// - /// Must be called after all Items have been deserialized. - /// Restores the Item references in CustomProperties of type Item. - /// - public void RestoreItemAssociations(Level level) - { - foreach (CustomProperty cp in Values) - { - if (cp.type == typeof(Item)) cp.value = level.getItemByName((string)cp.value); - } - } - - - } + } diff --git a/axios/Engine/Glee2D/PathItem.cs b/axios/Engine/Glee2D/PathItem.cs new file mode 100644 index 0000000..0c2c1d6 --- /dev/null +++ b/axios/Engine/Glee2D/PathItem.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FarseerPhysics.Dynamics; +using FarseerPhysics.Common; +using FarseerPhysics.SamplesFramework; +using FarseerPhysics.Factories; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; + +namespace Axios.Engine.Glee2D +{ + public partial class PathItem : Item + { + public Vector2[] LocalPoints; + public Vector2[] WorldPoints; + public bool IsPolygon; + public int LineWidth; + public Color LineColor; + + Body _body; + + public PathItem() + { + } + + public override void load(ContentManager cm, World world) + { + base.load(cm, world); + + Vertices v = new Vertices(WorldPoints.Length); + foreach (Vector2 vec in WorldPoints) + v.Add(new Vector2(ConvertUnits.ToSimUnits(vec.X), ConvertUnits.ToSimUnits(vec.Y))); + + _body = BodyFactory.CreateLoopShape(world, v); + _body.Position = this.Position; + _body.UserData = this; + } + + } +} diff --git a/axios/Engine/Glee2D/RectangleItem.cs b/axios/Engine/Glee2D/RectangleItem.cs new file mode 100644 index 0000000..15741e3 --- /dev/null +++ b/axios/Engine/Glee2D/RectangleItem.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FarseerPhysics.Dynamics; +using FarseerPhysics.Common; +using FarseerPhysics.SamplesFramework; +using FarseerPhysics.Factories; +using Microsoft.Xna.Framework.Content; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework; + +namespace Axios.Engine.Glee2D +{ + public partial class RectangleItem : Item + { + public float Width; + public float Height; + public Color FillColor; + + Body _body; + + public RectangleItem() + { + } + + public override void load(ContentManager cm, World world) + { + base.load(cm, world); + + _body = BodyFactory.CreateRectangle(world, Width, Height, 1f); + _body.Position = Position; + _body.UserData = this; + } + } +} diff --git a/axios/Engine/Glee2D/TextureItem.cs b/axios/Engine/Glee2D/TextureItem.cs new file mode 100644 index 0000000..31d36fb --- /dev/null +++ b/axios/Engine/Glee2D/TextureItem.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Content; +using System.IO; +using FarseerPhysics.Dynamics; +using FarseerPhysics.Common; +using FarseerPhysics.SamplesFramework; +using FarseerPhysics.Factories; + +namespace Axios.Engine.Glee2D +{ + public partial class TextureItem : Item + { + /// + /// The item's rotation in radians. + /// + public float Rotation; + + /// + /// The item's scale factor. + /// + public float Scale; + + /// + /// The color to tint the item's texture with (use white for no tint). + /// + public Color TintColor; + + /// + /// If true, the texture is flipped horizontally when drawn. + /// + public bool FlipHorizontally; + + /// + /// If true, the texture is flipped vertically when drawn. + /// + public bool FlipVertically; + + /// + /// The path to the texture's filename (including the extension) relative to ContentRootFolder. + /// + public String texture_filename; + + /// + /// The texture_filename without extension. For using in Content.Load(). + /// + public String asset_name; + + /// + /// The XNA texture to be drawn. Can be loaded either from file (using "texture_filename") + /// or via the Content Pipeline (using "asset_name") - then you must ensure that the texture + /// exists as an asset in your project. + /// Loading is done in the Item's load() method. + /// + Texture2D texture; + + /// + /// The item's origin relative to the upper left corner of the texture. Usually the middle of the texture. + /// Used for placing and rotating the texture when drawn. + /// + public Vector2 Origin; + + + public TextureItem() + { + } + + /// + /// Called by Level.FromFile(filename) on each Item after the deserialization process. + /// Loads all assets needed by the TextureItem, especially the Texture2D. + /// You must provide your own implementation. However, you can rely on all public fields being + /// filled by the level deserialization process. + /// + public override void load(ContentManager cm, World world) + { + //throw new NotImplementedException(); + + //TODO: provide your own implementation of how a TextureItem loads its assets + //for example: + //this.texture = Texture2D.FromFile(, texture_filename); + //or by using the Content Pipeline: + this.texture = cm.Load(asset_name); + + } + + public override void draw(SpriteBatch sb) + { + if (!Visible) return; + SpriteEffects effects = SpriteEffects.None; + if (FlipHorizontally) effects |= SpriteEffects.FlipHorizontally; + if (FlipVertically) effects |= SpriteEffects.FlipVertically; + sb.Draw(texture, Position, null, TintColor, Rotation, Origin, Scale, effects, 0); + } + } +}