diff --git a/SpriteMapEditor/Form1.Designer.cs b/SpriteMapEditor/Form1.Designer.cs index 5cea6bb..3bfb776 100644 --- a/SpriteMapEditor/Form1.Designer.cs +++ b/SpriteMapEditor/Form1.Designer.cs @@ -36,6 +36,7 @@ this.moveUpButton = new System.Windows.Forms.Button(); this.spritesLabel = new System.Windows.Forms.Label(); this.spritePanel = new System.Windows.Forms.Panel(); + this.editingOriginCheckBox = new System.Windows.Forms.CheckBox(); this.originYPosBox = new System.Windows.Forms.NumericUpDown(); this.originXPosBox = new System.Windows.Forms.NumericUpDown(); this.originYPosLabel = new System.Windows.Forms.Label(); @@ -54,8 +55,8 @@ this.loadSpriteSheetDialog = new System.Windows.Forms.OpenFileDialog(); this.loadMapDialog = new System.Windows.Forms.OpenFileDialog(); this.saveMapDialog = new System.Windows.Forms.SaveFileDialog(); - this.fillButton = new System.Windows.Forms.Button(); this.spriteViewerPanel = new System.Windows.Forms.Panel(); + this.spriteSheetViewer = new SpriteMapEditor.PictureBoxWithInterpolationMode(); this.zoomInButton = new System.Windows.Forms.Button(); this.zoomOutButton = new System.Windows.Forms.Button(); this.zoomLabel = new System.Windows.Forms.Label(); @@ -66,8 +67,7 @@ this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); this.saveSpriteMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveSpriteMapAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.editingOriginCheckBox = new System.Windows.Forms.CheckBox(); - this.spriteSheetViewer = new SpriteMapEditor.PictureBoxWithInterpolationMode(); + this.highlightCheckBox = new System.Windows.Forms.CheckBox(); this.spriteListPanel.SuspendLayout(); this.spritePanel.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.originYPosBox)).BeginInit(); @@ -77,8 +77,8 @@ ((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).BeginInit(); this.spriteViewerPanel.SuspendLayout(); - this.menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).BeginInit(); + this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // // spriteList @@ -87,6 +87,7 @@ this.spriteList.FormattingEnabled = true; this.spriteList.Location = new System.Drawing.Point(3, 32); this.spriteList.Name = "spriteList"; + this.spriteList.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; this.spriteList.Size = new System.Drawing.Size(183, 199); this.spriteList.TabIndex = 0; this.spriteList.SelectedValueChanged += new System.EventHandler(this.spriteList_SelectedValueChanged); @@ -182,6 +183,17 @@ this.spritePanel.Size = new System.Drawing.Size(190, 172); this.spritePanel.TabIndex = 9; // + // editingOriginCheckBox + // + this.editingOriginCheckBox.AutoSize = true; + this.editingOriginCheckBox.Location = new System.Drawing.Point(9, 108); + this.editingOriginCheckBox.Name = "editingOriginCheckBox"; + this.editingOriginCheckBox.Size = new System.Drawing.Size(107, 17); + this.editingOriginCheckBox.TabIndex = 23; + this.editingOriginCheckBox.Text = "Edit Origin Point?"; + this.editingOriginCheckBox.UseVisualStyleBackColor = true; + this.editingOriginCheckBox.CheckedChanged += new System.EventHandler(this.editingOriginCheckBox_CheckedChanged); + // // originYPosBox // this.originYPosBox.Enabled = false; @@ -191,6 +203,11 @@ 0, 0, 0}); + this.originYPosBox.Minimum = new decimal(new int[] { + 2147483647, + 0, + 0, + -2147483648}); this.originYPosBox.Name = "originYPosBox"; this.originYPosBox.Size = new System.Drawing.Size(45, 20); this.originYPosBox.TabIndex = 22; @@ -205,6 +222,11 @@ 0, 0, 0}); + this.originXPosBox.Minimum = new decimal(new int[] { + 2147483647, + 0, + 0, + -2147483648}); this.originXPosBox.Name = "originXPosBox"; this.originXPosBox.Size = new System.Drawing.Size(45, 20); this.originXPosBox.TabIndex = 21; @@ -361,16 +383,6 @@ this.saveMapDialog.DefaultExt = "smap"; this.saveMapDialog.Filter = "QUROGame SpriteMap|*.smap"; // - // fillButton - // - this.fillButton.Location = new System.Drawing.Point(461, 30); - this.fillButton.Name = "fillButton"; - this.fillButton.Size = new System.Drawing.Size(86, 23); - this.fillButton.TabIndex = 12; - this.fillButton.Text = "Highight"; - this.fillButton.UseVisualStyleBackColor = true; - this.fillButton.Click += new System.EventHandler(this.highlightButton_Click); - // // spriteViewerPanel // this.spriteViewerPanel.AutoScroll = true; @@ -383,6 +395,23 @@ this.spriteViewerPanel.TabIndex = 14; 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 // this.zoomInButton.Location = new System.Drawing.Point(659, 30); @@ -467,33 +496,18 @@ this.saveSpriteMapAsToolStripMenuItem.Text = "Save Sprite Map As..."; this.saveSpriteMapAsToolStripMenuItem.Click += new System.EventHandler(this.saveMapAsToolStripMenuItem_Click); // - // editingOriginCheckBox + // highlightCheckBox // - this.editingOriginCheckBox.AutoSize = true; - this.editingOriginCheckBox.Location = new System.Drawing.Point(9, 108); - this.editingOriginCheckBox.Name = "editingOriginCheckBox"; - this.editingOriginCheckBox.Size = new System.Drawing.Size(107, 17); - this.editingOriginCheckBox.TabIndex = 23; - this.editingOriginCheckBox.Text = "Edit Origin Point?"; - this.editingOriginCheckBox.UseVisualStyleBackColor = true; - this.editingOriginCheckBox.CheckedChanged += new System.EventHandler(this.editingOriginCheckBox_CheckedChanged); - // - // 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); + this.highlightCheckBox.AutoSize = true; + this.highlightCheckBox.Checked = true; + this.highlightCheckBox.CheckState = System.Windows.Forms.CheckState.Checked; + this.highlightCheckBox.Location = new System.Drawing.Point(446, 34); + this.highlightCheckBox.Name = "highlightCheckBox"; + this.highlightCheckBox.Size = new System.Drawing.Size(114, 17); + this.highlightCheckBox.TabIndex = 17; + this.highlightCheckBox.Text = "Highlight Selection"; + this.highlightCheckBox.UseVisualStyleBackColor = true; + this.highlightCheckBox.CheckedChanged += new System.EventHandler(this.highlightCheckBox_CheckedChanged); // // Form1 // @@ -501,11 +515,11 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.SystemColors.Control; this.ClientSize = new System.Drawing.Size(691, 465); + this.Controls.Add(this.highlightCheckBox); this.Controls.Add(this.zoomLabel); this.Controls.Add(this.zoomInButton); this.Controls.Add(this.spriteViewerPanel); this.Controls.Add(this.zoomOutButton); - this.Controls.Add(this.fillButton); this.Controls.Add(this.spritePanel); this.Controls.Add(this.spriteListPanel); this.Controls.Add(this.menuStrip1); @@ -522,9 +536,9 @@ ((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).EndInit(); this.spriteViewerPanel.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).EndInit(); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); - ((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); @@ -548,7 +562,6 @@ private System.Windows.Forms.OpenFileDialog loadSpriteSheetDialog; private System.Windows.Forms.OpenFileDialog loadMapDialog; private System.Windows.Forms.SaveFileDialog saveMapDialog; - private System.Windows.Forms.Button fillButton; private PictureBoxWithInterpolationMode spriteSheetViewer; private System.Windows.Forms.Panel spriteViewerPanel; private System.Windows.Forms.Button zoomInButton; @@ -572,6 +585,7 @@ private System.Windows.Forms.ToolStripMenuItem saveSpriteMapToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem saveSpriteMapAsToolStripMenuItem; private System.Windows.Forms.CheckBox editingOriginCheckBox; + private System.Windows.Forms.CheckBox highlightCheckBox; } } diff --git a/SpriteMapEditor/Form1.cs b/SpriteMapEditor/Form1.cs index 5edeadb..1108b99 100644 --- a/SpriteMapEditor/Form1.cs +++ b/SpriteMapEditor/Form1.cs @@ -22,7 +22,7 @@ namespace SpriteMapEditor private BindingList sprites; private bool highlight = false; - private SpriteMapRegion currentSprite; + private SpriteMapRegion currentSprite { get { return sprites[spriteList.SelectedIndices[0]]; } } private int zoomLevel = 3; private bool loadingSprite = false; @@ -71,8 +71,6 @@ namespace SpriteMapEditor sprites = new BindingList { new SpriteMapRegion() }; - currentSprite = sprites[0]; - spriteList.DataSource = sprites; spriteList.DisplayMember = "Name"; spriteList.ValueMember = "Bounds"; @@ -80,6 +78,8 @@ namespace SpriteMapEditor originPointer_black = Properties.Resources.originPointer_black; originPointer_white = Properties.Resources.originPointer_white; + highlight = highlightCheckBox.Checked; + LoadSpriteEditorValues(); } @@ -104,7 +104,7 @@ namespace SpriteMapEditor { //SurroundWithTranslucentRects(GetDrawingRect(currentSprite.Bounds, false), Color.Gray, e.Graphics); //e.Graphics.DrawImage(highlightMask.Bitmap, Point.Empty); - Rectangle highlightBounds = new Rectangle(0,0, spriteSheetViewer.Bounds.Width + 1, spriteSheetViewer.Bounds.Height + 1); + Rectangle highlightBounds = new Rectangle(0,0, highlightMask.Width * zoomLevel, highlightMask.Height * zoomLevel); e.Graphics.DrawImage(highlightMask.Bitmap, highlightBounds); } @@ -166,13 +166,8 @@ namespace SpriteMapEditor drawingRect.Width *= zoomLevel; drawingRect.Height *= zoomLevel; - if (outline) - { - drawingRect.X--; - drawingRect.Y--; - drawingRect.Width++; - drawingRect.Height++; - } + drawingRect.Width--; + drawingRect.Height--; return drawingRect; } @@ -208,12 +203,14 @@ namespace SpriteMapEditor { if (baseMask == null) { + Color maskColor = Color.FromArgb(128, 32, 32, 32); + highlightMask = new DirectBitmap(spriteSheetViewer.Image.Width, spriteSheetViewer.Image.Height); for (int currentY = 0; currentY < highlightMask.Height; currentY++) { for (int currentX = 0; currentX < highlightMask.Width; currentX++) { - highlightMask.SetPixel(currentX, currentY, Color.Gray); + highlightMask.SetPixel(currentX, currentY, maskColor); } } baseMask = new DirectBitmap(highlightMask); @@ -224,31 +221,6 @@ namespace SpriteMapEditor } } - private void SurroundWithTranslucentRects(Rectangle rect, Color color, Graphics graphics) - { - Rectangle topBorder = new Rectangle(0, 0, spriteSheetViewer.Width, rect.Y); - Rectangle leftBorder = new Rectangle(0, rect.Y, rect.X, rect.Height); - Rectangle rightBorder = new Rectangle(rect.X + rect.Width, rect.Y, spriteSheetViewer.Width - rect.X + rect.Width, rect.Height); - Rectangle bottomBorder = new Rectangle(0, rect.Y + rect.Height, spriteSheetViewer.Width, spriteSheetViewer.Height - rect.Y + rect.Height); - FillTranslucentRects(new Rectangle[] { topBorder, leftBorder, rightBorder, bottomBorder }, color, graphics); - } - - private void FillTranslucentRect(Rectangle rect, Color color, Graphics graphics) - { - using (Brush whiteBrush = new SolidBrush(Color.FromArgb(128, color))) - { - graphics.FillRectangle(whiteBrush, rect); - } - } - - private void FillTranslucentRects(Rectangle[] rects, Color color, Graphics graphics) - { - using (Brush whiteBrush = new SolidBrush(Color.FromArgb(128, color))) - { - graphics.FillRectangles(whiteBrush, rects); - } - } - private void DrawHighContrastOutline(Rectangle rect, Graphics graphics) { using (Pen blackPen = new Pen(Color.Black)) @@ -262,19 +234,6 @@ namespace SpriteMapEditor } } - private void highlightButton_Click(object sender, EventArgs e) - { - highlight = !highlight; - if (highlight) - { - fillButton.Text = "No Highlight"; - UpdateHighlightMask(); - } - else - fillButton.Text = "Highlight"; - spriteSheetViewer.Refresh(); - } - private void zoomInButton_Click(object sender, EventArgs e) { zoomLevel++; @@ -356,7 +315,7 @@ namespace SpriteMapEditor { if (spriteList.SelectedIndex > -1 && spriteList.SelectedIndex < sprites.Count) { - currentSprite = sprites[spriteList.SelectedIndex]; + //currentSprite = sprites[spriteList.SelectedIndex]; LoadSpriteEditorValues(); UpdateHighlightMask(); spriteSheetViewer.Refresh(); @@ -462,6 +421,8 @@ namespace SpriteMapEditor newBounds.X += differenceX; newBounds.Y += differenceY; + newBounds = ClampRectangleToSheet(newBounds); + currentSprite.Bounds = newBounds; oldPosition = newPosition; UpdateHighlightMask(); @@ -473,6 +434,24 @@ namespace SpriteMapEditor Cursor = Cursors.Default; } + private Microsoft.Xna.Framework.Rectangle ClampRectangleToSheet(Microsoft.Xna.Framework.Rectangle rect) + { + var clampedRect = rect; + + //clamp X value + if (clampedRect.X < 0) + clampedRect.X = 0; + else if (clampedRect.X + clampedRect.Width > spriteSheetViewer.Image.Width) + clampedRect.X = spriteSheetViewer.Image.Width - clampedRect.Width; + //clamp Y value + if (clampedRect.Y < 0) + clampedRect.Y = 0; + else if (clampedRect.Y + clampedRect.Height > spriteSheetViewer.Image.Height) + clampedRect.Y = spriteSheetViewer.Image.Height - clampedRect.Height; + + return clampedRect; + } + private void spriteSheetViewer_MouseDown(object sender, MouseEventArgs e) { if (spriteSheetViewer.Image == null) @@ -524,7 +503,9 @@ namespace SpriteMapEditor var spriteBelow = sprites[spriteList.SelectedIndex + 1]; sprites[spriteList.SelectedIndex + 1] = currentSprite; sprites[spriteList.SelectedIndex] = spriteBelow; - spriteList.SelectedIndex++; + int newPosition = spriteList.SelectedIndex + 1; + spriteList.SelectedIndices.Clear(); + spriteList.SelectedIndex = newPosition; } } @@ -535,7 +516,9 @@ namespace SpriteMapEditor var spriteAbove = sprites[spriteList.SelectedIndex - 1]; sprites[spriteList.SelectedIndex - 1] = currentSprite; sprites[spriteList.SelectedIndex] = spriteAbove; - spriteList.SelectedIndex--; + int newPosition = spriteList.SelectedIndex - 1; + spriteList.SelectedIndices.Clear(); + spriteList.SelectedIndex = newPosition; } } @@ -560,5 +543,15 @@ namespace SpriteMapEditor spriteViewerPanel.Refresh(); } + + private void highlightCheckBox_CheckedChanged(object sender, EventArgs e) + { + highlight = highlightCheckBox.Checked; + if (highlight) + { + UpdateHighlightMask(); + } + spriteSheetViewer.Refresh(); + } } }