Multi-Sprite Selection Implemented

This commit is contained in:
quinnvoker
2018-11-30 22:57:08 -08:00
parent 4a09f48266
commit d7fc242aa7
3 changed files with 256 additions and 116 deletions
+39 -30
View File
@@ -28,6 +28,7 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
this.components = new System.ComponentModel.Container();
this.spriteList = new System.Windows.Forms.ListBox(); this.spriteList = new System.Windows.Forms.ListBox();
this.addSpriteButton = new System.Windows.Forms.Button(); this.addSpriteButton = new System.Windows.Forms.Button();
this.removeSpriteButton = new System.Windows.Forms.Button(); this.removeSpriteButton = new System.Windows.Forms.Button();
@@ -49,14 +50,13 @@
this.widthLabel = new System.Windows.Forms.Label(); this.widthLabel = new System.Windows.Forms.Label();
this.yPosLabel = new System.Windows.Forms.Label(); this.yPosLabel = new System.Windows.Forms.Label();
this.xPosLabel = new System.Windows.Forms.Label(); this.xPosLabel = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label(); this.spriteNameLabel = new System.Windows.Forms.Label();
this.spriteSettingsLabel = new System.Windows.Forms.Label(); this.spriteSettingsLabel = new System.Windows.Forms.Label();
this.spriteNameBox = new System.Windows.Forms.TextBox(); this.spriteNameBox = new System.Windows.Forms.TextBox();
this.loadSpriteSheetDialog = new System.Windows.Forms.OpenFileDialog(); this.loadSpriteSheetDialog = new System.Windows.Forms.OpenFileDialog();
this.loadMapDialog = new System.Windows.Forms.OpenFileDialog(); this.loadMapDialog = new System.Windows.Forms.OpenFileDialog();
this.saveMapDialog = new System.Windows.Forms.SaveFileDialog(); this.saveMapDialog = new System.Windows.Forms.SaveFileDialog();
this.spriteViewerPanel = new System.Windows.Forms.Panel(); this.spriteViewerPanel = new System.Windows.Forms.Panel();
this.spriteSheetViewer = new SpriteMapEditor.PictureBoxWithInterpolationMode();
this.zoomInButton = new System.Windows.Forms.Button(); this.zoomInButton = new System.Windows.Forms.Button();
this.zoomOutButton = new System.Windows.Forms.Button(); this.zoomOutButton = new System.Windows.Forms.Button();
this.zoomLabel = new System.Windows.Forms.Label(); this.zoomLabel = new System.Windows.Forms.Label();
@@ -68,6 +68,8 @@
this.saveSpriteMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveSpriteMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveSpriteMapAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveSpriteMapAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.highlightCheckBox = new System.Windows.Forms.CheckBox(); this.highlightCheckBox = new System.Windows.Forms.CheckBox();
this.outlineTimer = new System.Windows.Forms.Timer(this.components);
this.spriteSheetViewer = new SpriteMapEditor.PictureBoxWithInterpolationMode();
this.spriteListPanel.SuspendLayout(); this.spriteListPanel.SuspendLayout();
this.spritePanel.SuspendLayout(); this.spritePanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.originYPosBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.originYPosBox)).BeginInit();
@@ -77,8 +79,8 @@
((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).BeginInit();
this.spriteViewerPanel.SuspendLayout(); this.spriteViewerPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).BeginInit();
this.menuStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
// spriteList // spriteList
@@ -175,7 +177,7 @@
this.spritePanel.Controls.Add(this.widthLabel); this.spritePanel.Controls.Add(this.widthLabel);
this.spritePanel.Controls.Add(this.yPosLabel); this.spritePanel.Controls.Add(this.yPosLabel);
this.spritePanel.Controls.Add(this.xPosLabel); this.spritePanel.Controls.Add(this.xPosLabel);
this.spritePanel.Controls.Add(this.label2); this.spritePanel.Controls.Add(this.spriteNameLabel);
this.spritePanel.Controls.Add(this.spriteSettingsLabel); this.spritePanel.Controls.Add(this.spriteSettingsLabel);
this.spritePanel.Controls.Add(this.spriteNameBox); this.spritePanel.Controls.Add(this.spriteNameBox);
this.spritePanel.Location = new System.Drawing.Point(2, 291); this.spritePanel.Location = new System.Drawing.Point(2, 291);
@@ -340,14 +342,14 @@
this.xPosLabel.TabIndex = 8; this.xPosLabel.TabIndex = 8;
this.xPosLabel.Text = "X Pos."; this.xPosLabel.Text = "X Pos.";
// //
// label2 // spriteNameLabel
// //
this.label2.AutoSize = true; this.spriteNameLabel.AutoSize = true;
this.label2.Location = new System.Drawing.Point(6, 30); this.spriteNameLabel.Location = new System.Drawing.Point(6, 30);
this.label2.Name = "label2"; this.spriteNameLabel.Name = "spriteNameLabel";
this.label2.Size = new System.Drawing.Size(38, 13); this.spriteNameLabel.Size = new System.Drawing.Size(38, 13);
this.label2.TabIndex = 6; this.spriteNameLabel.TabIndex = 6;
this.label2.Text = "Name:"; this.spriteNameLabel.Text = "Name:";
// //
// spriteSettingsLabel // spriteSettingsLabel
// //
@@ -395,23 +397,6 @@
this.spriteViewerPanel.TabIndex = 14; this.spriteViewerPanel.TabIndex = 14;
this.spriteViewerPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.spriteViewerPanel_Scroll); this.spriteViewerPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.spriteViewerPanel_Scroll);
// //
// spriteSheetViewer
//
this.spriteSheetViewer.BackgroundImage = global::SpriteMapEditor.Properties.Resources.transparentUI;
this.spriteSheetViewer.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
this.spriteSheetViewer.Location = new System.Drawing.Point(0, 0);
this.spriteSheetViewer.Margin = new System.Windows.Forms.Padding(0);
this.spriteSheetViewer.Name = "spriteSheetViewer";
this.spriteSheetViewer.Size = new System.Drawing.Size(147, 143);
this.spriteSheetViewer.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.spriteSheetViewer.TabIndex = 13;
this.spriteSheetViewer.TabStop = false;
this.spriteSheetViewer.Paint += new System.Windows.Forms.PaintEventHandler(this.spriteSheetViewer_Paint);
this.spriteSheetViewer.MouseDown += new System.Windows.Forms.MouseEventHandler(this.spriteSheetViewer_MouseDown);
this.spriteSheetViewer.MouseLeave += new System.EventHandler(this.spriteSheetViewer_MouseLeave);
this.spriteSheetViewer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.spriteSheetViewer_MouseMove);
this.spriteSheetViewer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.spriteSheetViewer_MouseUp);
//
// zoomInButton // zoomInButton
// //
this.zoomInButton.Location = new System.Drawing.Point(659, 30); this.zoomInButton.Location = new System.Drawing.Point(659, 30);
@@ -509,6 +494,29 @@
this.highlightCheckBox.UseVisualStyleBackColor = true; this.highlightCheckBox.UseVisualStyleBackColor = true;
this.highlightCheckBox.CheckedChanged += new System.EventHandler(this.highlightCheckBox_CheckedChanged); this.highlightCheckBox.CheckedChanged += new System.EventHandler(this.highlightCheckBox_CheckedChanged);
// //
// outlineTimer
//
this.outlineTimer.Enabled = true;
this.outlineTimer.Interval = 66;
this.outlineTimer.Tick += new System.EventHandler(this.outlineTimer_Tick);
//
// spriteSheetViewer
//
this.spriteSheetViewer.BackgroundImage = global::SpriteMapEditor.Properties.Resources.transparentUI;
this.spriteSheetViewer.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
this.spriteSheetViewer.Location = new System.Drawing.Point(0, 0);
this.spriteSheetViewer.Margin = new System.Windows.Forms.Padding(0);
this.spriteSheetViewer.Name = "spriteSheetViewer";
this.spriteSheetViewer.Size = new System.Drawing.Size(147, 143);
this.spriteSheetViewer.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.spriteSheetViewer.TabIndex = 13;
this.spriteSheetViewer.TabStop = false;
this.spriteSheetViewer.Paint += new System.Windows.Forms.PaintEventHandler(this.spriteSheetViewer_Paint);
this.spriteSheetViewer.MouseDown += new System.Windows.Forms.MouseEventHandler(this.spriteSheetViewer_MouseDown);
this.spriteSheetViewer.MouseLeave += new System.EventHandler(this.spriteSheetViewer_MouseLeave);
this.spriteSheetViewer.MouseMove += new System.Windows.Forms.MouseEventHandler(this.spriteSheetViewer_MouseMove);
this.spriteSheetViewer.MouseUp += new System.Windows.Forms.MouseEventHandler(this.spriteSheetViewer_MouseUp);
//
// Form1 // Form1
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -536,9 +544,9 @@
((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).EndInit();
this.spriteViewerPanel.ResumeLayout(false); this.spriteViewerPanel.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).EndInit();
this.menuStrip1.ResumeLayout(false); this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout(); this.menuStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).EndInit();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@@ -554,7 +562,7 @@
private System.Windows.Forms.Panel spritePanel; private System.Windows.Forms.Panel spritePanel;
private System.Windows.Forms.Label spriteSettingsLabel; private System.Windows.Forms.Label spriteSettingsLabel;
private System.Windows.Forms.TextBox spriteNameBox; private System.Windows.Forms.TextBox spriteNameBox;
private System.Windows.Forms.Label label2; private System.Windows.Forms.Label spriteNameLabel;
private System.Windows.Forms.Label xPosLabel; private System.Windows.Forms.Label xPosLabel;
private System.Windows.Forms.Label heightLabel; private System.Windows.Forms.Label heightLabel;
private System.Windows.Forms.Label widthLabel; private System.Windows.Forms.Label widthLabel;
@@ -586,6 +594,7 @@
private System.Windows.Forms.ToolStripMenuItem saveSpriteMapAsToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveSpriteMapAsToolStripMenuItem;
private System.Windows.Forms.CheckBox editingOriginCheckBox; private System.Windows.Forms.CheckBox editingOriginCheckBox;
private System.Windows.Forms.CheckBox highlightCheckBox; private System.Windows.Forms.CheckBox highlightCheckBox;
private System.Windows.Forms.Timer outlineTimer;
} }
} }
+214 -86
View File
@@ -20,9 +20,10 @@ namespace SpriteMapEditor
public partial class Form1 : Form public partial class Form1 : Form
{ {
private BindingList<SpriteMapRegion> sprites; private BindingList<SpriteMapRegion> sprites;
private List<SpriteMapRegion> selectedSprites;
private bool highlight = false; private bool highlight = false;
private SpriteMapRegion currentSprite { get { return sprites[spriteList.SelectedIndices[0]]; } } //private SpriteMapRegion currentSprite { get { return sprites[spriteList.SelectedIndices[0]]; } }
private int zoomLevel = 3; private int zoomLevel = 3;
private bool loadingSprite = false; private bool loadingSprite = false;
@@ -44,6 +45,9 @@ namespace SpriteMapEditor
Image originPointer_black; Image originPointer_black;
Image originPointer_white; Image originPointer_white;
Pen blackPen;
Pen whitePen;
DirectBitmap baseMask; DirectBitmap baseMask;
DirectBitmap highlightMask; DirectBitmap highlightMask;
@@ -70,6 +74,7 @@ namespace SpriteMapEditor
spriteSheetViewer.Height = 1; spriteSheetViewer.Height = 1;
sprites = new BindingList<SpriteMapRegion> { new SpriteMapRegion() }; sprites = new BindingList<SpriteMapRegion> { new SpriteMapRegion() };
selectedSprites = new List<SpriteMapRegion>();
spriteList.DataSource = sprites; spriteList.DataSource = sprites;
spriteList.DisplayMember = "Name"; spriteList.DisplayMember = "Name";
@@ -78,6 +83,10 @@ namespace SpriteMapEditor
originPointer_black = Properties.Resources.originPointer_black; originPointer_black = Properties.Resources.originPointer_black;
originPointer_white = Properties.Resources.originPointer_white; originPointer_white = Properties.Resources.originPointer_white;
blackPen = new Pen(Color.Black);
whitePen = new Pen(Color.White);
whitePen.DashPattern = new float[] { 4, 4 };
highlight = highlightCheckBox.Checked; highlight = highlightCheckBox.Checked;
LoadSpriteEditorValues(); LoadSpriteEditorValues();
@@ -102,32 +111,14 @@ namespace SpriteMapEditor
if (highlight) if (highlight)
{ {
//SurroundWithTranslucentRects(GetDrawingRect(currentSprite.Bounds, false), Color.Gray, e.Graphics);
//e.Graphics.DrawImage(highlightMask.Bitmap, Point.Empty);
Rectangle highlightBounds = new Rectangle(0,0, highlightMask.Width * zoomLevel, highlightMask.Height * zoomLevel); Rectangle highlightBounds = new Rectangle(0,0, highlightMask.Width * zoomLevel, highlightMask.Height * zoomLevel);
e.Graphics.DrawImage(highlightMask.Bitmap, highlightBounds); e.Graphics.DrawImage(highlightMask.Bitmap, highlightBounds);
} }
DrawHighContrastOutline(GetDrawingRect(currentSprite.Bounds), e.Graphics);
//origin drawing code foreach (SpriteMapRegion currentSprite in selectedSprites)
if (editingOrigin)
{ {
var spriteSheet = (Bitmap)spriteSheetViewer.Image; DrawHighContrastOutline(GetDrawingRect(currentSprite.Bounds), e.Graphics);
var colorAtOrigin = spriteSheet.GetPixel((int)(currentSprite.Bounds.X + currentSprite.Origin.X), DrawOriginPoint(currentSprite, e.Graphics);
(int)(currentSprite.Bounds.Y + currentSprite.Origin.Y));
var highContrastPointer = originPointer_black;
if (colorAtOrigin.GetBrightness() < 0.5f)
{
highContrastPointer = originPointer_white;
}
var drawPoint = GetOriginDrawingPoint(currentSprite);
drawPoint.X -= 5;
drawPoint.Y -= 5;
e.Graphics.DrawImage(highContrastPointer, drawPoint);
} }
} }
base.OnPaint(e); base.OnPaint(e);
@@ -136,26 +127,37 @@ namespace SpriteMapEditor
private void LoadSpriteEditorValues() private void LoadSpriteEditorValues()
{ {
loadingSprite = true; loadingSprite = true;
spriteNameBox.Text = currentSprite.Name; if (spriteList.SelectedIndices.Count > 1)
spriteXPosBox.Value = currentSprite.Bounds.X; {
spriteYPosBox.Value = currentSprite.Bounds.Y; spriteNameBox.Text = "";
spriteWidthBox.Value = currentSprite.Bounds.Width; spriteXPosBox.Text = "";
spriteHeightBox.Value = currentSprite.Bounds.Height; spriteYPosBox.Text = "";
originXPosBox.Value = (int)currentSprite.Origin.X; spriteWidthBox.Text = "";
originYPosBox.Value = (int)currentSprite.Origin.Y; spriteHeightBox.Text = "";
originXPosBox.Text = "";
originYPosBox.Text = "";
}
else if(spriteList.SelectedIndices.Count > 0)
{
SpriteMapRegion currentSprite = selectedSprites[0];
spriteNameBox.Text = currentSprite.Name;
spriteXPosBox.Value = currentSprite.Bounds.X;
spriteXPosBox.Text = currentSprite.Bounds.X.ToString();
spriteYPosBox.Value = currentSprite.Bounds.Y;
spriteYPosBox.Text = currentSprite.Bounds.Y.ToString();
spriteWidthBox.Value = currentSprite.Bounds.Width;
spriteWidthBox.Text = currentSprite.Bounds.Width.ToString();
spriteHeightBox.Value = currentSprite.Bounds.Height;
spriteHeightBox.Text = currentSprite.Bounds.Height.ToString();
originXPosBox.Value = (int)currentSprite.Origin.X;
originXPosBox.Text = ((int)currentSprite.Origin.X).ToString();
originYPosBox.Value = (int)currentSprite.Origin.Y;
originYPosBox.Text = ((int)currentSprite.Origin.Y).ToString();
}
loadingSprite = false; loadingSprite = false;
} }
private void UpdateSpriteBounds()
{
currentSprite.Bounds = new Microsoft.Xna.Framework.Rectangle((int)spriteXPosBox.Value, (int)spriteYPosBox.Value, (int)spriteWidthBox.Value, (int)spriteHeightBox.Value);
}
private void UpdateSpriteOrigin()
{
currentSprite.Origin = new Microsoft.Xna.Framework.Vector2((int)originXPosBox.Value, (int)originYPosBox.Value);
}
private Rectangle GetDrawingRect(Microsoft.Xna.Framework.Rectangle baseRect, bool outline = true) private Rectangle GetDrawingRect(Microsoft.Xna.Framework.Rectangle baseRect, bool outline = true)
{ {
var drawingRect = new Rectangle(baseRect.X, baseRect.Y, baseRect.Width, baseRect.Height); var drawingRect = new Rectangle(baseRect.X, baseRect.Y, baseRect.Width, baseRect.Height);
@@ -184,16 +186,41 @@ namespace SpriteMapEditor
return drawingPoint; return drawingPoint;
} }
private void DrawOriginPoint(SpriteMapRegion sprite, Graphics graphics)
{
if (editingOrigin)
{
var spriteSheet = (Bitmap)spriteSheetViewer.Image;
var colorAtOrigin = spriteSheet.GetPixel((int)(sprite.Bounds.X + sprite.Origin.X),
(int)(sprite.Bounds.Y + sprite.Origin.Y));
var highContrastPointer = originPointer_black;
if (colorAtOrigin.GetBrightness() < 0.5f)
{
highContrastPointer = originPointer_white;
}
var drawPoint = GetOriginDrawingPoint(sprite);
drawPoint.X -= 5;
drawPoint.Y -= 5;
graphics.DrawImage(highContrastPointer, drawPoint);
}
}
private void UpdateHighlightMask() private void UpdateHighlightMask()
{ {
if (highlight) if (highlight)
{ {
InitializeMask(); InitializeMask();
for (int currentY = 0; currentY < currentSprite.Bounds.Height; currentY++) foreach (SpriteMapRegion currentSprite in selectedSprites)
{ {
for (int currentX = 0; currentX < currentSprite.Bounds.Width; currentX++) for (int currentY = 0; currentY < currentSprite.Bounds.Height; currentY++)
{ {
highlightMask.SetPixel(currentX + currentSprite.Bounds.X, currentY + currentSprite.Bounds.Y, Color.Transparent); for (int currentX = 0; currentX < currentSprite.Bounds.Width; currentX++)
{
highlightMask.SetPixel(currentX + currentSprite.Bounds.X, currentY + currentSprite.Bounds.Y, Color.Transparent);
}
} }
} }
} }
@@ -223,15 +250,8 @@ namespace SpriteMapEditor
private void DrawHighContrastOutline(Rectangle rect, Graphics graphics) private void DrawHighContrastOutline(Rectangle rect, Graphics graphics)
{ {
using (Pen blackPen = new Pen(Color.Black)) graphics.DrawRectangle(blackPen, rect);
{ graphics.DrawRectangle(whitePen, rect);
graphics.DrawRectangle(blackPen, rect);
}
using (Pen whitePen = new Pen(Color.White))
{
whitePen.DashPattern = new float[] { 4, 4 };
graphics.DrawRectangle(whitePen, rect);
}
} }
private void zoomInButton_Click(object sender, EventArgs e) private void zoomInButton_Click(object sender, EventArgs e)
@@ -260,7 +280,12 @@ namespace SpriteMapEditor
{ {
if (loadingSprite) if (loadingSprite)
return; return;
UpdateSpriteBounds(); foreach (SpriteMapRegion currentSprite in selectedSprites)
{
var newBounds = currentSprite.Bounds;
newBounds.X = (int)spriteXPosBox.Value;
currentSprite.Bounds = newBounds;
}
UpdateHighlightMask(); UpdateHighlightMask();
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
@@ -269,7 +294,12 @@ namespace SpriteMapEditor
{ {
if (loadingSprite) if (loadingSprite)
return; return;
UpdateSpriteBounds(); foreach (SpriteMapRegion currentSprite in selectedSprites)
{
var newBounds = currentSprite.Bounds;
newBounds.Y = (int)spriteYPosBox.Value;
currentSprite.Bounds = newBounds;
}
UpdateHighlightMask(); UpdateHighlightMask();
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
@@ -278,7 +308,12 @@ namespace SpriteMapEditor
{ {
if (loadingSprite) if (loadingSprite)
return; return;
UpdateSpriteBounds(); foreach (SpriteMapRegion currentSprite in selectedSprites)
{
var newBounds = currentSprite.Bounds;
newBounds.Width = (int)spriteWidthBox.Value;
currentSprite.Bounds = newBounds;
}
UpdateHighlightMask(); UpdateHighlightMask();
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
@@ -287,7 +322,12 @@ namespace SpriteMapEditor
{ {
if (loadingSprite) if (loadingSprite)
return; return;
UpdateSpriteBounds(); foreach (SpriteMapRegion currentSprite in selectedSprites)
{
var newBounds = currentSprite.Bounds;
newBounds.Height = (int)spriteHeightBox.Value;
currentSprite.Bounds = newBounds;
}
UpdateHighlightMask(); UpdateHighlightMask();
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
@@ -296,13 +336,13 @@ namespace SpriteMapEditor
{ {
if (loadingSprite) if (loadingSprite)
return; return;
currentSprite.Name = spriteNameBox.Text; selectedSprites[0].Name = spriteNameBox.Text;
sprites.ResetBindings(); sprites.ResetBindings();
} }
private void addSpriteButton_Click(object sender, EventArgs e) private void addSpriteButton_Click(object sender, EventArgs e)
{ {
sprites.Add(new SpriteMapRegion(currentSprite.Name, currentSprite.Bounds)); sprites.Add(new SpriteMapRegion(selectedSprites[0].Name, selectedSprites[0].Bounds));
} }
private void removeSpriteButton_Click(object sender, EventArgs e) private void removeSpriteButton_Click(object sender, EventArgs e)
@@ -315,13 +355,60 @@ namespace SpriteMapEditor
{ {
if (spriteList.SelectedIndex > -1 && spriteList.SelectedIndex < sprites.Count) if (spriteList.SelectedIndex > -1 && spriteList.SelectedIndex < sprites.Count)
{ {
//currentSprite = sprites[spriteList.SelectedIndex]; UpdateSelectedSpriteList();
LoadSpriteEditorValues(); LoadSpriteEditorValues();
UpdateHighlightMask(); UpdateHighlightMask();
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
} }
private void SingleSpriteFunctions_SetEnabled(bool status)
{
moveDownButton.Enabled = status;
moveUpButton.Enabled = status;
spriteNameLabel.Enabled = status;
spriteNameBox.Enabled = status;
removeSpriteButton.Enabled = status;
addSpriteButton.Enabled = status;
}
private void UpdateSelectedSpriteList()
{
selectedSprites.Clear();
foreach(int currentIndex in spriteList.SelectedIndices)
{
selectedSprites.Add(sprites[currentIndex]);
}
if (selectedSprites.Count > 1)
SingleSpriteFunctions_SetEnabled(false);
else
SingleSpriteFunctions_SetEnabled(true);
}
private Rectangle GetSelectedGroupRectangle()
{
Microsoft.Xna.Framework.Rectangle leftMost = selectedSprites[0].Bounds;
Microsoft.Xna.Framework.Rectangle topMost = selectedSprites[0].Bounds;
Microsoft.Xna.Framework.Rectangle rightMost = selectedSprites[0].Bounds;
Microsoft.Xna.Framework.Rectangle bottomMost = selectedSprites[0].Bounds;
foreach (SpriteMapRegion currentSprite in selectedSprites)
{
if (currentSprite.Bounds.X < leftMost.X)
leftMost = currentSprite.Bounds;
if (currentSprite.Bounds.Y < topMost.Y)
topMost = currentSprite.Bounds;
if (currentSprite.Bounds.X + currentSprite.Bounds.Width > rightMost.X + rightMost.Width)
rightMost = currentSprite.Bounds;
if (currentSprite.Bounds.Y + currentSprite.Bounds.Height > bottomMost.Y + bottomMost.Width)
bottomMost = currentSprite.Bounds;
}
return new Rectangle(leftMost.X, topMost.Y,
rightMost.X + rightMost.Width - leftMost.X,
bottomMost.Y + bottomMost.Height - topMost.Y);
}
private void saveMapAsToolStripMenuItem_Click(object sender, EventArgs e) private void saveMapAsToolStripMenuItem_Click(object sender, EventArgs e)
{ {
var exportDict = new Dictionary<string, SpriteMapRegion>(); var exportDict = new Dictionary<string, SpriteMapRegion>();
@@ -407,30 +494,49 @@ namespace SpriteMapEditor
Point mousePosition = new Point(e.X, e.Y); Point mousePosition = new Point(e.X, e.Y);
if (GetDrawingRect(currentSprite.Bounds).Contains(mousePosition)) bool hovering = false;
foreach (SpriteMapRegion currentSprite in selectedSprites)
{ {
Cursor = Cursors.SizeAll; if (GetDrawingRect(currentSprite.Bounds).Contains(mousePosition))
if (movingWithMouse)
{ {
newPosition = mousePosition; hovering = true;
newPosition.X /= zoomLevel; Cursor = Cursors.SizeAll;
newPosition.Y /= zoomLevel; if (movingWithMouse)
int differenceX = newPosition.X - oldPosition.X; {
int differenceY = newPosition.Y - oldPosition.Y; newPosition = mousePosition;
var newBounds = currentSprite.Bounds; newPosition.X /= zoomLevel;
newBounds.X += differenceX; newPosition.Y /= zoomLevel;
newBounds.Y += differenceY; int differenceX = newPosition.X - oldPosition.X;
int differenceY = newPosition.Y - oldPosition.Y;
newBounds = ClampRectangleToSheet(newBounds); var groupRect = GetSelectedGroupRectangle();
if (groupRect.X + differenceX < 0 ||
groupRect.X + groupRect.Width + differenceX > spriteSheetViewer.Image.Width)
differenceX = 0;
if (groupRect.Y + differenceY < 0 ||
groupRect.Y + groupRect.Height + differenceY > spriteSheetViewer.Image.Height)
differenceY = 0;
currentSprite.Bounds = newBounds; foreach (SpriteMapRegion spriteToMove in selectedSprites)
oldPosition = newPosition; {
UpdateHighlightMask(); var newBounds = spriteToMove.Bounds;
spriteSheetViewer.Refresh(); newBounds.X += differenceX;
LoadSpriteEditorValues(); newBounds.Y += differenceY;
newBounds = ClampRectangleToSheet(newBounds);
spriteToMove.Bounds = newBounds;
}
oldPosition = newPosition;
UpdateHighlightMask();
spriteSheetViewer.Refresh();
LoadSpriteEditorValues();
break;
}
} }
} }
else if(!hovering)
Cursor = Cursors.Default; Cursor = Cursors.Default;
} }
@@ -459,13 +565,16 @@ namespace SpriteMapEditor
Point mousePosition = new Point(e.X, e.Y); Point mousePosition = new Point(e.X, e.Y);
if (GetDrawingRect(currentSprite.Bounds).Contains(mousePosition)) foreach (SpriteMapRegion currentSprite in selectedSprites)
{ {
movingWithMouse = true; if (GetDrawingRect(currentSprite.Bounds).Contains(mousePosition))
newPosition = mousePosition; {
newPosition.X /= zoomLevel; movingWithMouse = true;
newPosition.Y /= zoomLevel; newPosition = mousePosition;
oldPosition = newPosition; newPosition.X /= zoomLevel;
newPosition.Y /= zoomLevel;
oldPosition = newPosition;
}
} }
} }
@@ -484,7 +593,12 @@ namespace SpriteMapEditor
{ {
if (loadingSprite) if (loadingSprite)
return; return;
UpdateSpriteOrigin(); foreach (SpriteMapRegion currentSprite in selectedSprites)
{
var newOrigin = currentSprite.Origin;
newOrigin.X = (int)originXPosBox.Value;
currentSprite.Origin = newOrigin;
}
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
@@ -492,7 +606,12 @@ namespace SpriteMapEditor
{ {
if (loadingSprite) if (loadingSprite)
return; return;
UpdateSpriteOrigin(); foreach (SpriteMapRegion currentSprite in selectedSprites)
{
var newOrigin = currentSprite.Origin;
newOrigin.Y = (int)originYPosBox.Value;
currentSprite.Origin = newOrigin;
}
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
@@ -501,7 +620,7 @@ namespace SpriteMapEditor
if(spriteList.SelectedIndex < sprites.Count - 1) if(spriteList.SelectedIndex < sprites.Count - 1)
{ {
var spriteBelow = sprites[spriteList.SelectedIndex + 1]; var spriteBelow = sprites[spriteList.SelectedIndex + 1];
sprites[spriteList.SelectedIndex + 1] = currentSprite; sprites[spriteList.SelectedIndex + 1] = selectedSprites[0];
sprites[spriteList.SelectedIndex] = spriteBelow; sprites[spriteList.SelectedIndex] = spriteBelow;
int newPosition = spriteList.SelectedIndex + 1; int newPosition = spriteList.SelectedIndex + 1;
spriteList.SelectedIndices.Clear(); spriteList.SelectedIndices.Clear();
@@ -514,7 +633,7 @@ namespace SpriteMapEditor
if(spriteList.SelectedIndex > 0) if(spriteList.SelectedIndex > 0)
{ {
var spriteAbove = sprites[spriteList.SelectedIndex - 1]; var spriteAbove = sprites[spriteList.SelectedIndex - 1];
sprites[spriteList.SelectedIndex - 1] = currentSprite; sprites[spriteList.SelectedIndex - 1] = selectedSprites[0];
sprites[spriteList.SelectedIndex] = spriteAbove; sprites[spriteList.SelectedIndex] = spriteAbove;
int newPosition = spriteList.SelectedIndex - 1; int newPosition = spriteList.SelectedIndex - 1;
spriteList.SelectedIndices.Clear(); spriteList.SelectedIndices.Clear();
@@ -553,5 +672,14 @@ namespace SpriteMapEditor
} }
spriteSheetViewer.Refresh(); spriteSheetViewer.Refresh();
} }
private void outlineTimer_Tick(object sender, EventArgs e)
{
if (whitePen.DashOffset < 7)
whitePen.DashOffset++;
else
whitePen.DashOffset = 0;
spriteSheetViewer.Refresh();
}
} }
} }
+3
View File
@@ -129,4 +129,7 @@
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>461, 17</value> <value>461, 17</value>
</metadata> </metadata>
<metadata name="outlineTimer.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>576, 17</value>
</metadata>
</root> </root>