diff --git a/SpriteLibrary/SpriteDatabase.cs b/SpriteLibrary/SpriteDatabase.cs
new file mode 100644
index 0000000..278d5a1
--- /dev/null
+++ b/SpriteLibrary/SpriteDatabase.cs
@@ -0,0 +1,224 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Drawing;
+using System.Xml;
+using System.Xml.Serialization;
+using System.Resources;
+using System.IO;
+
+namespace SpriteLibrary
+{
+ internal struct ImageStruct
+ {
+ internal Image TheImage;
+ internal string ImageName;
+ }
+
+ ///
+ /// Store of all the types of things in the ADVDemo
+ ///
+ public class SpriteDatabase
+ {
+ List SpriteInfoList = new List();
+ List TheImages = new List();
+ ResourceManager myResourceManager = null;
+ string Filename = "";
+
+ public SpriteDatabase(ResourceManager theResourceManager, string filename)
+ {
+ myResourceManager = theResourceManager;
+ Filename = filename;
+ Load();
+ }
+
+ internal void Load()
+ {
+ LoadSpriteInfo();
+ }
+
+
+ //*******************************
+ //**** Sprite Info Functions ***
+ //*******************************
+ #region SpriteInfo Functions
+ void LoadSpriteInfo()
+ {
+ if (DoesResourceExist(Filename))
+ {
+ //This clears out the old list, as it gets replaced.
+ SpriteInfoList = LoadObjectFromXmlFile>(Filename, myResourceManager);
+ }
+ else
+ {
+ //try loading it from an actual filename
+ if (File.Exists(Filename))
+ SpriteInfoList = ReadFromXmlFile>(Filename);
+ }
+ //If neither works, we end up with an empty file.
+ //If it fails, SpriteInfoList is null and things explode.
+ if (SpriteInfoList == null)
+ SpriteInfoList = new List(); //make an empty one so things do not explode.
+ }
+
+ public List SpriteNames()
+ {
+ List theNames = new List();
+ foreach (SpriteInfo si in SpriteInfoList)
+ {
+ theNames.Add(si.SpriteName);
+ }
+ return theNames;
+ }
+
+ internal bool DoesResourceExist(string resourcename)
+ {
+ if (myResourceManager == null) return false;
+ if (myResourceManager.GetObject(resourcename) != null)
+ return true;
+ return false;
+ }
+
+ public Image GetImageFromName(string Name, bool UseSmartImages)
+ {
+ Image MyImage = null;
+ if (UseSmartImages)
+ {
+ foreach (ImageStruct IS in TheImages)
+ {
+ if (IS.ImageName.Equals(Name, StringComparison.InvariantCultureIgnoreCase))
+ {
+ MyImage = IS.TheImage;
+ break;
+ }
+ }
+ }
+ if (MyImage == null)
+ {
+ ResourceManager rm = myResourceManager;
+ MyImage = (Bitmap)rm.GetObject(Name);
+ if (UseSmartImages)
+ {
+ ImageStruct NewIS = new ImageStruct();
+ NewIS.ImageName = Name;
+ NewIS.TheImage = MyImage;
+ TheImages.Add(NewIS);
+ }
+ }
+ return MyImage;
+ }
+
+ public Sprite SmartDuplicateSprite(SpriteController theController, string SpriteName, bool UseSmartImages = true)
+ {
+ Sprite DestSprite = theController.DuplicateSprite(SpriteName);
+ if (DestSprite != null) return DestSprite;
+
+ //If it does not exist, make it
+ foreach (SpriteInfo SI in SpriteInfoList)
+ {
+ if (SI.SpriteName == SpriteName)
+ {
+ //This is the sprite. Pull out the image resource. then pull out the sprite.
+ ResourceManager rm = myResourceManager;
+ Image myImage = (Bitmap)rm.GetObject(SI.ImageName);
+ if (myImage == null) return null; //break out if we do not have the image defined for this
+ DestSprite = new Sprite(SI.StartPoint, theController, myImage, SI.Width, SI.Height, SI.AnimSpeed, SI.NumAnimations);
+ int sizepercent = SI.ViewPercent;
+ if (sizepercent < 5) sizepercent = 100;
+ if (sizepercent > 300) sizepercent = 100;
+ double delta = (double)sizepercent / 100.0; //turn it into a double, and into something we can multiply.
+ DestSprite.SetSize(new Size((int)(DestSprite.GetSize.Width * delta), (int)(DestSprite.GetSize.Height * delta)));
+ DestSprite.SetName(SpriteName);
+ //We have created a new sprite. Now, return a duplicate of that sprite.
+ return theController.DuplicateSprite(SpriteName);
+ }
+ }
+ return null;
+ }
+ #endregion
+
+ #region Generic XML Funcs
+
+ ///
+ /// Load in an XML serialized item from the specified ResourceManager. You will usually make one of these by
+ /// creating an object and using SpriteDatabase.WriteToXmlFile to
+ /// save it to a file on your desktop. Then you can drag and drop that file into your project and then use this
+ /// LoadObjectFromXmlFile function.
+ ///
+ /// The type of object to load. It could be something as simple as an int, a class, or a list of classes.
+ /// The resource item to load. If you would access it like: properties.resources.myFile,
+ /// the correct value to put here would be "myFile"
+ /// The resource manager. Usually Properties.Resources.ResourceManager
+ /// An object of the value you specified. Or null if it fails.
+ public static T LoadObjectFromXmlFile(string XMLResourceToLoad, ResourceManager MyManager) where T : new()
+ {
+ //Load in the sprite data
+ XmlSerializer serializer = new XmlSerializer(typeof(T));
+
+ // Retrieves String and Image resources.
+ object titem = MyManager.GetObject(XMLResourceToLoad);
+ byte[] item = (byte[])System.Text.Encoding.UTF8.GetBytes((string)titem);
+
+ try
+ {
+ return (T)serializer.Deserialize(new MemoryStream(item));
+ }
+ finally
+ {
+
+ }
+ }
+
+ ///
+ /// Writes the given object instance to an XML file.
+ /// Only Public properties and variables will be written to the file. These can be any type though, even other classes.
+ /// If there are public properties/variables that you do not want written to the file, decorate them with the [XmlIgnore] attribute.
+ /// Object type must have a parameterless constructor.
+ ///
+ /// The type of object being written to the file.
+ /// The file path to write the object instance to.
+ /// The object instance to write to the file.
+ internal static void WriteToXmlFile(string filePath, T objectToWrite) where T : new()
+ {
+ TextWriter writer = null;
+ try
+ {
+ var serializer = new XmlSerializer(typeof(T));
+ writer = new StreamWriter(filePath);
+ serializer.Serialize(writer, objectToWrite);
+ }
+ finally
+ {
+ if (writer != null)
+ writer.Close();
+ }
+ }
+
+ ///
+ /// Reads an object instance from an XML file.
+ /// Object type must have a parameterless constructor.
+ ///
+ /// The type of object to read from the file.
+ /// The file path to read the object instance from.
+ /// Returns a new instance of the object read from the XML file.
+ public static T ReadFromXmlFile(string filePath) where T : new()
+ {
+ TextReader reader = null;
+ try
+ {
+ var serializer = new XmlSerializer(typeof(T));
+ reader = new StreamReader(filePath);
+ return (T)serializer.Deserialize(reader);
+ }
+ finally
+ {
+ if (reader != null)
+ reader.Close();
+ }
+ }
+ #endregion
+ }
+
+}
diff --git a/SpriteLibrary/SpriteEntryForm.Designer.cs b/SpriteLibrary/SpriteEntryForm.Designer.cs
new file mode 100644
index 0000000..ff299c1
--- /dev/null
+++ b/SpriteLibrary/SpriteEntryForm.Designer.cs
@@ -0,0 +1,276 @@
+namespace SpriteLibrary
+{
+ partial class SpriteEntryForm
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.pbImageField = new System.Windows.Forms.PictureBox();
+ this.cbStartingImage = new System.Windows.Forms.ComboBox();
+ this.lblStartingImage = new System.Windows.Forms.Label();
+ this.lblChosenArea = new System.Windows.Forms.Label();
+ this.tbNumFrames = new System.Windows.Forms.TextBox();
+ this.lblFrames = new System.Windows.Forms.Label();
+ this.tbSpriteName = new System.Windows.Forms.TextBox();
+ this.lblSpriteName = new System.Windows.Forms.Label();
+ this.btnDone = new System.Windows.Forms.Button();
+ this.btnCancel = new System.Windows.Forms.Button();
+ this.btnApply = new System.Windows.Forms.Button();
+ this.btnNew = new System.Windows.Forms.Button();
+ this.tbAmimationSpeed = new System.Windows.Forms.TextBox();
+ this.lblAnimationSpeed = new System.Windows.Forms.Label();
+ this.lblDefaultSize = new System.Windows.Forms.Label();
+ this.tbDefaultSize = new System.Windows.Forms.TextBox();
+ this.btnBack = new System.Windows.Forms.Button();
+ this.btnFwd = new System.Windows.Forms.Button();
+ this.lblCountSprites = new System.Windows.Forms.Label();
+ ((System.ComponentModel.ISupportInitialize)(this.pbImageField)).BeginInit();
+ this.SuspendLayout();
+ //
+ // pbImageField
+ //
+ this.pbImageField.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)));
+ this.pbImageField.Location = new System.Drawing.Point(5, 10);
+ this.pbImageField.Name = "pbImageField";
+ this.pbImageField.Size = new System.Drawing.Size(213, 253);
+ this.pbImageField.TabIndex = 0;
+ this.pbImageField.TabStop = false;
+ //
+ // cbStartingImage
+ //
+ this.cbStartingImage.FormattingEnabled = true;
+ this.cbStartingImage.Location = new System.Drawing.Point(349, 40);
+ this.cbStartingImage.Name = "cbStartingImage";
+ this.cbStartingImage.Size = new System.Drawing.Size(131, 24);
+ this.cbStartingImage.TabIndex = 1;
+ this.cbStartingImage.SelectedIndexChanged += new System.EventHandler(this.cbStartingImage_SelectedIndexChanged);
+ //
+ // lblStartingImage
+ //
+ this.lblStartingImage.AutoSize = true;
+ this.lblStartingImage.Location = new System.Drawing.Point(244, 43);
+ this.lblStartingImage.Name = "lblStartingImage";
+ this.lblStartingImage.Size = new System.Drawing.Size(99, 17);
+ this.lblStartingImage.TabIndex = 2;
+ this.lblStartingImage.Text = "Starting Image";
+ //
+ // lblChosenArea
+ //
+ this.lblChosenArea.AutoSize = true;
+ this.lblChosenArea.Location = new System.Drawing.Point(350, 77);
+ this.lblChosenArea.Name = "lblChosenArea";
+ this.lblChosenArea.Size = new System.Drawing.Size(46, 17);
+ this.lblChosenArea.TabIndex = 3;
+ this.lblChosenArea.Text = "label2";
+ //
+ // tbNumFrames
+ //
+ this.tbNumFrames.Location = new System.Drawing.Point(349, 109);
+ this.tbNumFrames.Name = "tbNumFrames";
+ this.tbNumFrames.Size = new System.Drawing.Size(47, 22);
+ this.tbNumFrames.TabIndex = 4;
+ //
+ // lblFrames
+ //
+ this.lblFrames.AutoSize = true;
+ this.lblFrames.Location = new System.Drawing.Point(288, 109);
+ this.lblFrames.Name = "lblFrames";
+ this.lblFrames.Size = new System.Drawing.Size(55, 17);
+ this.lblFrames.TabIndex = 5;
+ this.lblFrames.Text = "Frames";
+ //
+ // tbSpriteName
+ //
+ this.tbSpriteName.Location = new System.Drawing.Point(349, 10);
+ this.tbSpriteName.Name = "tbSpriteName";
+ this.tbSpriteName.Size = new System.Drawing.Size(100, 22);
+ this.tbSpriteName.TabIndex = 6;
+ //
+ // lblSpriteName
+ //
+ this.lblSpriteName.AutoSize = true;
+ this.lblSpriteName.Location = new System.Drawing.Point(251, 14);
+ this.lblSpriteName.Name = "lblSpriteName";
+ this.lblSpriteName.Size = new System.Drawing.Size(86, 17);
+ this.lblSpriteName.TabIndex = 7;
+ this.lblSpriteName.Text = "Sprite Name";
+ //
+ // btnDone
+ //
+ this.btnDone.Location = new System.Drawing.Point(434, 259);
+ this.btnDone.Name = "btnDone";
+ this.btnDone.Size = new System.Drawing.Size(75, 23);
+ this.btnDone.TabIndex = 8;
+ this.btnDone.Text = "Done";
+ this.btnDone.UseVisualStyleBackColor = true;
+ //
+ // btnCancel
+ //
+ this.btnCancel.Location = new System.Drawing.Point(353, 259);
+ this.btnCancel.Name = "btnCancel";
+ this.btnCancel.Size = new System.Drawing.Size(75, 23);
+ this.btnCancel.TabIndex = 9;
+ this.btnCancel.Text = "Cancel";
+ this.btnCancel.UseVisualStyleBackColor = true;
+ //
+ // btnApply
+ //
+ this.btnApply.Location = new System.Drawing.Point(434, 230);
+ this.btnApply.Name = "btnApply";
+ this.btnApply.Size = new System.Drawing.Size(75, 23);
+ this.btnApply.TabIndex = 10;
+ this.btnApply.Text = "Apply";
+ this.btnApply.UseVisualStyleBackColor = true;
+ //
+ // btnNew
+ //
+ this.btnNew.Location = new System.Drawing.Point(353, 230);
+ this.btnNew.Name = "btnNew";
+ this.btnNew.Size = new System.Drawing.Size(75, 23);
+ this.btnNew.TabIndex = 11;
+ this.btnNew.Text = "New";
+ this.btnNew.UseVisualStyleBackColor = true;
+ //
+ // tbAmimationSpeed
+ //
+ this.tbAmimationSpeed.Location = new System.Drawing.Point(349, 145);
+ this.tbAmimationSpeed.Name = "tbAmimationSpeed";
+ this.tbAmimationSpeed.Size = new System.Drawing.Size(100, 22);
+ this.tbAmimationSpeed.TabIndex = 12;
+ //
+ // lblAnimationSpeed
+ //
+ this.lblAnimationSpeed.AutoSize = true;
+ this.lblAnimationSpeed.Location = new System.Drawing.Point(228, 148);
+ this.lblAnimationSpeed.Name = "lblAnimationSpeed";
+ this.lblAnimationSpeed.Size = new System.Drawing.Size(115, 17);
+ this.lblAnimationSpeed.TabIndex = 13;
+ this.lblAnimationSpeed.Text = "Animation Speed";
+ //
+ // lblDefaultSize
+ //
+ this.lblDefaultSize.AutoSize = true;
+ this.lblDefaultSize.Location = new System.Drawing.Point(261, 188);
+ this.lblDefaultSize.Name = "lblDefaultSize";
+ this.lblDefaultSize.Size = new System.Drawing.Size(84, 17);
+ this.lblDefaultSize.TabIndex = 14;
+ this.lblDefaultSize.Text = "Default Size";
+ //
+ // tbDefaultSize
+ //
+ this.tbDefaultSize.Location = new System.Drawing.Point(349, 185);
+ this.tbDefaultSize.Name = "tbDefaultSize";
+ this.tbDefaultSize.Size = new System.Drawing.Size(100, 22);
+ this.tbDefaultSize.TabIndex = 15;
+ //
+ // btnBack
+ //
+ this.btnBack.Location = new System.Drawing.Point(43, 269);
+ this.btnBack.Name = "btnBack";
+ this.btnBack.Size = new System.Drawing.Size(29, 23);
+ this.btnBack.TabIndex = 16;
+ this.btnBack.Text = "<";
+ this.btnBack.UseVisualStyleBackColor = true;
+ //
+ // btnFwd
+ //
+ this.btnFwd.Location = new System.Drawing.Point(125, 269);
+ this.btnFwd.Name = "btnFwd";
+ this.btnFwd.Size = new System.Drawing.Size(29, 23);
+ this.btnFwd.TabIndex = 17;
+ this.btnFwd.Text = ">";
+ this.btnFwd.UseVisualStyleBackColor = true;
+ //
+ // lblCountSprites
+ //
+ this.lblCountSprites.AutoSize = true;
+ this.lblCountSprites.Location = new System.Drawing.Point(89, 272);
+ this.lblCountSprites.Name = "lblCountSprites";
+ this.lblCountSprites.Size = new System.Drawing.Size(16, 17);
+ this.lblCountSprites.TabIndex = 18;
+ this.lblCountSprites.Text = "0";
+ //
+ // SpriteEntryForm
+ //
+ this.AcceptButton = this.btnApply;
+ this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.CancelButton = this.btnCancel;
+ this.ClientSize = new System.Drawing.Size(524, 294);
+ this.Controls.Add(this.lblCountSprites);
+ this.Controls.Add(this.btnFwd);
+ this.Controls.Add(this.btnBack);
+ this.Controls.Add(this.tbDefaultSize);
+ this.Controls.Add(this.lblDefaultSize);
+ this.Controls.Add(this.lblAnimationSpeed);
+ this.Controls.Add(this.tbAmimationSpeed);
+ this.Controls.Add(this.btnNew);
+ this.Controls.Add(this.btnApply);
+ this.Controls.Add(this.btnCancel);
+ this.Controls.Add(this.btnDone);
+ this.Controls.Add(this.lblSpriteName);
+ this.Controls.Add(this.tbSpriteName);
+ this.Controls.Add(this.lblFrames);
+ this.Controls.Add(this.tbNumFrames);
+ this.Controls.Add(this.lblChosenArea);
+ this.Controls.Add(this.lblStartingImage);
+ this.Controls.Add(this.cbStartingImage);
+ this.Controls.Add(this.pbImageField);
+ this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.SizableToolWindow;
+ this.MaximizeBox = false;
+ this.MinimizeBox = false;
+ this.Name = "SpriteEntryForm";
+ this.Text = "SpriteEntryForm";
+ ((System.ComponentModel.ISupportInitialize)(this.pbImageField)).EndInit();
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.PictureBox pbImageField;
+ private System.Windows.Forms.ComboBox cbStartingImage;
+ private System.Windows.Forms.Label lblStartingImage;
+ private System.Windows.Forms.Label lblChosenArea;
+ private System.Windows.Forms.TextBox tbNumFrames;
+ private System.Windows.Forms.Label lblFrames;
+ private System.Windows.Forms.TextBox tbSpriteName;
+ private System.Windows.Forms.Label lblSpriteName;
+ private System.Windows.Forms.Button btnDone;
+ private System.Windows.Forms.Button btnCancel;
+ private System.Windows.Forms.Button btnApply;
+ private System.Windows.Forms.Button btnNew;
+ private System.Windows.Forms.TextBox tbAmimationSpeed;
+ private System.Windows.Forms.Label lblAnimationSpeed;
+ private System.Windows.Forms.Label lblDefaultSize;
+ private System.Windows.Forms.TextBox tbDefaultSize;
+ private System.Windows.Forms.Button btnBack;
+ private System.Windows.Forms.Button btnFwd;
+ private System.Windows.Forms.Label lblCountSprites;
+ }
+}
\ No newline at end of file
diff --git a/SpriteLibrary/SpriteEntryForm.cs b/SpriteLibrary/SpriteEntryForm.cs
new file mode 100644
index 0000000..a5514ad
--- /dev/null
+++ b/SpriteLibrary/SpriteEntryForm.cs
@@ -0,0 +1,83 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml;
+using System.Xml.Serialization;
+using System.IO;
+using System.Resources;
+using System.Windows.Forms;
+using System.Windows;
+using System.Collections;
+
+
+
+namespace SpriteLibrary
+{
+ public partial class SpriteEntryForm : Form
+ {
+ SpriteController MyController;
+ ResourceManager myResources = null;
+
+ public SpriteEntryForm(ResourceManager theResourceManager)
+ {
+ InitializeComponent();
+ myResources = theResourceManager;
+ LocalSetup();
+ }
+
+ public void LocalSetup()
+ {
+ pbImageField.BackgroundImageLayout = ImageLayout.Stretch;
+ MyController = new SpriteController(pbImageField);
+ PopulateMenu();
+ }
+
+ public void PopulateMenu()
+ {
+ ResourceManager rm = Properties.Resources.ResourceManager;
+ if (myResources != null) rm = myResources;
+ PopulateMenu(rm);
+
+ }
+ public void PopulateMenu(ResourceManager rm)
+ {
+ if (myResources == null) myResources = rm;
+ ResourceSet RS = rm.GetResourceSet(System.Globalization.CultureInfo.CurrentCulture, true, true);
+ cbStartingImage.Items.Clear();
+ foreach (DictionaryEntry entry in RS)
+ {
+ string resourceKey = entry.Key.ToString();
+ object resource = entry.Value;
+ if (resource is Image)
+ {
+ cbStartingImage.Items.Add(resourceKey);
+ }
+ }
+ cbStartingImage.SelectedIndex = 0;
+ }
+
+ private void cbStartingImage_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ ResourceManager rm;
+ if (myResources != null) rm = myResources;
+ else rm = Properties.Resources.ResourceManager;
+ //We have a selected item
+ if (cbStartingImage.SelectedIndex >= 0)
+ {
+ //Load in a new image into our background
+ Image NewImage = (Bitmap)rm.GetObject(cbStartingImage.SelectedItem.ToString());
+ if (NewImage != null)
+ {
+ MyController.ReplaceOriginalImage(new Bitmap(NewImage));
+ pbImageField.BackgroundImage = new Bitmap(NewImage);
+ pbImageField.Invalidate();
+ }
+ }
+ }
+ }
+}
diff --git a/SpriteLibrary/SpriteInfo.cs b/SpriteLibrary/SpriteInfo.cs
new file mode 100644
index 0000000..a727c30
--- /dev/null
+++ b/SpriteLibrary/SpriteInfo.cs
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Drawing;
+
+namespace SpriteLibrary
+{
+ internal class SpriteInfo
+ {
+ public string SpriteName = "";
+ public Point StartPoint = new Point(-1, -1);
+ public string ImageName = "";
+ public int Width = -1;
+ public int Height = -1;
+ public int AnimSpeed = 200;
+ public int NumAnimations = 1;
+ public int ViewPercent = 100; //The percent size of the sprite. 100 is full. 50 is half-size
+ }
+}
diff --git a/SpriteLibrary/SpriteLibrary.csproj b/SpriteLibrary/SpriteLibrary.csproj
index c9b2631..a3eb328 100644
--- a/SpriteLibrary/SpriteLibrary.csproj
+++ b/SpriteLibrary/SpriteLibrary.csproj
@@ -62,6 +62,14 @@
+
+
+ Form
+
+
+ SpriteEntryForm.cs
+
+