Added Origin Editing and Bitmap mask-based highlighting to SpriteMapEditor

This commit is contained in:
quinnvoker
2018-11-28 20:47:14 -08:00
parent 297e19f2a7
commit 8edc345953
10 changed files with 409 additions and 178 deletions
+78
View File
@@ -0,0 +1,78 @@
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SpriteMapEditor
{
[Serializable]
public class DirectBitmap : IDisposable
{
public Bitmap Bitmap { get; private set; }
public Int32[] Bits { get; private set; }
public bool Disposed { get; private set; }
public int Height { get; private set; }
public int Width { get; private set; }
protected GCHandle BitsHandle { get; private set; }
public DirectBitmap(int width, int height)
{
Width = width;
Height = height;
Bits = new Int32[width * height];
BitsHandle = GCHandle.Alloc(Bits, GCHandleType.Pinned);
Bitmap = new Bitmap(width, height, width * 4, PixelFormat.Format32bppPArgb, BitsHandle.AddrOfPinnedObject());
}
public DirectBitmap(DirectBitmap original)
{
Width = original.Width;
Height = original.Height;
Bits = (int[])original.Bits.Clone();
BitsHandle = GCHandle.Alloc(Bits, GCHandleType.Pinned);
Bitmap = new Bitmap(Width, Height, Width * 4, PixelFormat.Format32bppPArgb, BitsHandle.AddrOfPinnedObject());
}
public void CopyBitmap(DirectBitmap source)
{
if(Width == source.Width && Height == source.Height)
{
Bits = (int[])source.Bits.Clone();
BitsHandle = GCHandle.Alloc(Bits, GCHandleType.Pinned);
Bitmap = new Bitmap(Width, Height, Width * 4, PixelFormat.Format32bppPArgb, BitsHandle.AddrOfPinnedObject());
}
}
public void SetPixel(int x, int y, Color colour)
{
int index = x + (y * Width);
int col = colour.ToArgb();
Bits[index] = col;
}
public Color GetPixel(int x, int y)
{
int index = x + (y * Width);
int col = Bits[index];
Color result = Color.FromArgb(col);
return result;
}
public void Dispose()
{
if (Disposed) return;
Disposed = true;
Bitmap.Dispose();
BitsHandle.Free();
}
}
}
+129 -94
View File
@@ -28,14 +28,9 @@
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.spriteList = new System.Windows.Forms.ListBox();
this.addSpriteButton = new System.Windows.Forms.Button();
this.removeSpriteButton = new System.Windows.Forms.Button();
this.loadSpriteSheetButton = new System.Windows.Forms.Button();
this.loadMapButton = new System.Windows.Forms.Button();
this.saveMapButton = new System.Windows.Forms.Button();
this.filePanel = new System.Windows.Forms.Panel();
this.spriteListPanel = new System.Windows.Forms.Panel();
this.moveDownButton = new System.Windows.Forms.Button();
this.moveUpButton = new System.Windows.Forms.Button();
@@ -61,11 +56,18 @@
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();
this.filePanel.SuspendLayout();
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.loadSpriteSheetToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.loadSpriteMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
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.spriteListPanel.SuspendLayout();
this.spritePanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.originYPosBox)).BeginInit();
@@ -75,6 +77,7 @@
((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.SuspendLayout();
//
@@ -108,46 +111,6 @@
this.removeSpriteButton.UseVisualStyleBackColor = true;
this.removeSpriteButton.Click += new System.EventHandler(this.removeSpriteButton_Click);
//
// loadSpriteSheetButton
//
this.loadSpriteSheetButton.Location = new System.Drawing.Point(3, 3);
this.loadSpriteSheetButton.Name = "loadSpriteSheetButton";
this.loadSpriteSheetButton.Size = new System.Drawing.Size(185, 23);
this.loadSpriteSheetButton.TabIndex = 4;
this.loadSpriteSheetButton.Text = "Load Sprite Sheet...";
this.loadSpriteSheetButton.UseVisualStyleBackColor = true;
this.loadSpriteSheetButton.Click += new System.EventHandler(this.loadSpriteSheetButton_Click);
//
// loadMapButton
//
this.loadMapButton.Location = new System.Drawing.Point(3, 32);
this.loadMapButton.Name = "loadMapButton";
this.loadMapButton.Size = new System.Drawing.Size(92, 23);
this.loadMapButton.TabIndex = 5;
this.loadMapButton.Text = "Load Map...";
this.loadMapButton.UseVisualStyleBackColor = true;
this.loadMapButton.Click += new System.EventHandler(this.loadMapButton_Click);
//
// saveMapButton
//
this.saveMapButton.Location = new System.Drawing.Point(96, 32);
this.saveMapButton.Name = "saveMapButton";
this.saveMapButton.Size = new System.Drawing.Size(92, 23);
this.saveMapButton.TabIndex = 6;
this.saveMapButton.Text = "Save Map As...";
this.saveMapButton.UseVisualStyleBackColor = true;
this.saveMapButton.Click += new System.EventHandler(this.saveMapButton_Click);
//
// filePanel
//
this.filePanel.Controls.Add(this.loadSpriteSheetButton);
this.filePanel.Controls.Add(this.saveMapButton);
this.filePanel.Controls.Add(this.loadMapButton);
this.filePanel.Location = new System.Drawing.Point(2, 2);
this.filePanel.Name = "filePanel";
this.filePanel.Size = new System.Drawing.Size(190, 62);
this.filePanel.TabIndex = 7;
//
// spriteListPanel
//
this.spriteListPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
@@ -160,9 +123,9 @@
this.spriteListPanel.Controls.Add(this.spriteList);
this.spriteListPanel.Controls.Add(this.addSpriteButton);
this.spriteListPanel.Controls.Add(this.removeSpriteButton);
this.spriteListPanel.Location = new System.Drawing.Point(2, 63);
this.spriteListPanel.Location = new System.Drawing.Point(2, 27);
this.spriteListPanel.Name = "spriteListPanel";
this.spriteListPanel.Size = new System.Drawing.Size(190, 254);
this.spriteListPanel.Size = new System.Drawing.Size(190, 258);
this.spriteListPanel.TabIndex = 8;
//
// moveDownButton
@@ -198,6 +161,7 @@
// spritePanel
//
this.spritePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.spritePanel.Controls.Add(this.editingOriginCheckBox);
this.spritePanel.Controls.Add(this.originYPosBox);
this.spritePanel.Controls.Add(this.originXPosBox);
this.spritePanel.Controls.Add(this.originYPosLabel);
@@ -213,15 +177,15 @@
this.spritePanel.Controls.Add(this.label2);
this.spritePanel.Controls.Add(this.spriteSettingsLabel);
this.spritePanel.Controls.Add(this.spriteNameBox);
this.spritePanel.Location = new System.Drawing.Point(2, 323);
this.spritePanel.Location = new System.Drawing.Point(2, 291);
this.spritePanel.Name = "spritePanel";
this.spritePanel.Size = new System.Drawing.Size(190, 140);
this.spritePanel.Size = new System.Drawing.Size(190, 172);
this.spritePanel.TabIndex = 9;
//
// originYPosBox
//
this.originYPosBox.Enabled = false;
this.originYPosBox.Location = new System.Drawing.Point(143, 108);
this.originYPosBox.Location = new System.Drawing.Point(143, 131);
this.originYPosBox.Maximum = new decimal(new int[] {
2147483647,
0,
@@ -235,7 +199,7 @@
// originXPosBox
//
this.originXPosBox.Enabled = false;
this.originXPosBox.Location = new System.Drawing.Point(51, 108);
this.originXPosBox.Location = new System.Drawing.Point(51, 131);
this.originXPosBox.Maximum = new decimal(new int[] {
2147483647,
0,
@@ -250,7 +214,7 @@
//
this.originYPosLabel.AutoSize = true;
this.originYPosLabel.Enabled = false;
this.originYPosLabel.Location = new System.Drawing.Point(98, 111);
this.originYPosLabel.Location = new System.Drawing.Point(98, 134);
this.originYPosLabel.Name = "originYPosLabel";
this.originYPosLabel.Size = new System.Drawing.Size(44, 13);
this.originYPosLabel.TabIndex = 20;
@@ -260,7 +224,7 @@
//
this.originXPosLabel.AutoSize = true;
this.originXPosLabel.Enabled = false;
this.originXPosLabel.Location = new System.Drawing.Point(6, 111);
this.originXPosLabel.Location = new System.Drawing.Point(6, 134);
this.originXPosLabel.Name = "originXPosLabel";
this.originXPosLabel.Size = new System.Drawing.Size(44, 13);
this.originXPosLabel.TabIndex = 19;
@@ -399,7 +363,7 @@
//
// fillButton
//
this.fillButton.Location = new System.Drawing.Point(454, 5);
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;
@@ -413,15 +377,110 @@
this.spriteViewerPanel.BackColor = System.Drawing.SystemColors.ControlDark;
this.spriteViewerPanel.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.spriteViewerPanel.Controls.Add(this.spriteSheetViewer);
this.spriteViewerPanel.Location = new System.Drawing.Point(199, 34);
this.spriteViewerPanel.Location = new System.Drawing.Point(198, 59);
this.spriteViewerPanel.Name = "spriteViewerPanel";
this.spriteViewerPanel.Size = new System.Drawing.Size(488, 429);
this.spriteViewerPanel.Size = new System.Drawing.Size(488, 404);
this.spriteViewerPanel.TabIndex = 14;
this.spriteViewerPanel.Scroll += new System.Windows.Forms.ScrollEventHandler(this.spriteViewerPanel_Scroll);
//
// zoomInButton
//
this.zoomInButton.Location = new System.Drawing.Point(659, 30);
this.zoomInButton.Name = "zoomInButton";
this.zoomInButton.Size = new System.Drawing.Size(27, 23);
this.zoomInButton.TabIndex = 5;
this.zoomInButton.Text = "+";
this.zoomInButton.UseVisualStyleBackColor = true;
this.zoomInButton.Click += new System.EventHandler(this.zoomInButton_Click);
//
// zoomOutButton
//
this.zoomOutButton.Location = new System.Drawing.Point(566, 30);
this.zoomOutButton.Name = "zoomOutButton";
this.zoomOutButton.Size = new System.Drawing.Size(28, 23);
this.zoomOutButton.TabIndex = 6;
this.zoomOutButton.Text = "-";
this.zoomOutButton.UseVisualStyleBackColor = true;
this.zoomOutButton.Click += new System.EventHandler(this.zoomOutButton_Click);
//
// zoomLabel
//
this.zoomLabel.AutoSize = true;
this.zoomLabel.Location = new System.Drawing.Point(600, 35);
this.zoomLabel.Name = "zoomLabel";
this.zoomLabel.Size = new System.Drawing.Size(53, 13);
this.zoomLabel.TabIndex = 15;
this.zoomLabel.Text = "Zoom: 3X";
//
// menuStrip1
//
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileToolStripMenuItem});
this.menuStrip1.Location = new System.Drawing.Point(0, 0);
this.menuStrip1.Name = "menuStrip1";
this.menuStrip1.Size = new System.Drawing.Size(691, 24);
this.menuStrip1.TabIndex = 16;
this.menuStrip1.Text = "menuStrip1";
//
// fileToolStripMenuItem
//
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.loadSpriteSheetToolStripMenuItem,
this.loadSpriteMapToolStripMenuItem,
this.toolStripMenuItem1,
this.saveSpriteMapToolStripMenuItem,
this.saveSpriteMapAsToolStripMenuItem});
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
this.fileToolStripMenuItem.Text = "File";
//
// loadSpriteSheetToolStripMenuItem
//
this.loadSpriteSheetToolStripMenuItem.Name = "loadSpriteSheetToolStripMenuItem";
this.loadSpriteSheetToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.loadSpriteSheetToolStripMenuItem.Text = "Load Sprite Sheet...";
this.loadSpriteSheetToolStripMenuItem.Click += new System.EventHandler(this.loadSpriteSheetToolStripMenuItem_Click);
//
// loadSpriteMapToolStripMenuItem
//
this.loadSpriteMapToolStripMenuItem.Name = "loadSpriteMapToolStripMenuItem";
this.loadSpriteMapToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.loadSpriteMapToolStripMenuItem.Text = "Load Sprite Map...";
this.loadSpriteMapToolStripMenuItem.Click += new System.EventHandler(this.loadMapToolStripMenuItem_Click);
//
// toolStripMenuItem1
//
this.toolStripMenuItem1.Name = "toolStripMenuItem1";
this.toolStripMenuItem1.Size = new System.Drawing.Size(180, 6);
//
// saveSpriteMapToolStripMenuItem
//
this.saveSpriteMapToolStripMenuItem.Name = "saveSpriteMapToolStripMenuItem";
this.saveSpriteMapToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.saveSpriteMapToolStripMenuItem.Text = "Save Sprite Map";
this.saveSpriteMapToolStripMenuItem.Click += new System.EventHandler(this.saveSpriteMapToolStripMenuItem_Click);
//
// saveSpriteMapAsToolStripMenuItem
//
this.saveSpriteMapAsToolStripMenuItem.Name = "saveSpriteMapAsToolStripMenuItem";
this.saveSpriteMapAsToolStripMenuItem.Size = new System.Drawing.Size(183, 22);
this.saveSpriteMapAsToolStripMenuItem.Text = "Save Sprite Map As...";
this.saveSpriteMapAsToolStripMenuItem.Click += new System.EventHandler(this.saveMapAsToolStripMenuItem_Click);
//
// 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);
//
// spriteSheetViewer
//
this.spriteSheetViewer.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("spriteSheetViewer.BackgroundImage")));
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);
@@ -436,35 +495,6 @@
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(652, 5);
this.zoomInButton.Name = "zoomInButton";
this.zoomInButton.Size = new System.Drawing.Size(27, 23);
this.zoomInButton.TabIndex = 5;
this.zoomInButton.Text = "+";
this.zoomInButton.UseVisualStyleBackColor = true;
this.zoomInButton.Click += new System.EventHandler(this.zoomInButton_Click);
//
// zoomOutButton
//
this.zoomOutButton.Location = new System.Drawing.Point(559, 5);
this.zoomOutButton.Name = "zoomOutButton";
this.zoomOutButton.Size = new System.Drawing.Size(28, 23);
this.zoomOutButton.TabIndex = 6;
this.zoomOutButton.Text = "-";
this.zoomOutButton.UseVisualStyleBackColor = true;
this.zoomOutButton.Click += new System.EventHandler(this.zoomOutButton_Click);
//
// zoomLabel
//
this.zoomLabel.AutoSize = true;
this.zoomLabel.Location = new System.Drawing.Point(593, 10);
this.zoomLabel.Name = "zoomLabel";
this.zoomLabel.Size = new System.Drawing.Size(53, 13);
this.zoomLabel.TabIndex = 15;
this.zoomLabel.Text = "Zoom: 3X";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@@ -478,10 +508,9 @@
this.Controls.Add(this.fillButton);
this.Controls.Add(this.spritePanel);
this.Controls.Add(this.spriteListPanel);
this.Controls.Add(this.filePanel);
this.Controls.Add(this.menuStrip1);
this.Name = "Form1";
this.Text = "QUROGames Sprite Map Editor";
this.filePanel.ResumeLayout(false);
this.spriteListPanel.ResumeLayout(false);
this.spriteListPanel.PerformLayout();
this.spritePanel.ResumeLayout(false);
@@ -493,6 +522,8 @@
((System.ComponentModel.ISupportInitialize)(this.spriteYPosBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.spriteXPosBox)).EndInit();
this.spriteViewerPanel.ResumeLayout(false);
this.menuStrip1.ResumeLayout(false);
this.menuStrip1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.spriteSheetViewer)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
@@ -504,10 +535,6 @@
private System.Windows.Forms.ListBox spriteList;
private System.Windows.Forms.Button addSpriteButton;
private System.Windows.Forms.Button removeSpriteButton;
private System.Windows.Forms.Button loadSpriteSheetButton;
private System.Windows.Forms.Button loadMapButton;
private System.Windows.Forms.Button saveMapButton;
private System.Windows.Forms.Panel filePanel;
private System.Windows.Forms.Panel spriteListPanel;
private System.Windows.Forms.Label spritesLabel;
private System.Windows.Forms.Panel spritePanel;
@@ -537,6 +564,14 @@
private System.Windows.Forms.Label originXPosLabel;
private System.Windows.Forms.Button moveDownButton;
private System.Windows.Forms.Button moveUpButton;
private System.Windows.Forms.MenuStrip menuStrip1;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem loadSpriteSheetToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem loadSpriteMapToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
private System.Windows.Forms.ToolStripMenuItem saveSpriteMapToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem saveSpriteMapAsToolStripMenuItem;
private System.Windows.Forms.CheckBox editingOriginCheckBox;
}
}
+162 -25
View File
@@ -27,7 +27,25 @@ namespace SpriteMapEditor
private bool loadingSprite = false;
private bool movingWithMouse = false;
private bool rearrangingSprites = false;
private bool editingOrigin = false;
const string TITLE = "QUROGames Sprite Map Editor";
private string currentSpriteMapFileLocation;
private string CurrentSpriteMapFileLocation
{
get { return currentSpriteMapFileLocation; }
set
{
currentSpriteMapFileLocation = value;
Text = TITLE + " - " + Path.GetFileName(currentSpriteMapFileLocation);
}
}
Image originPointer_black;
Image originPointer_white;
DirectBitmap baseMask;
DirectBitmap highlightMask;
private Point newPosition;
private Point oldPosition;
@@ -59,15 +77,20 @@ namespace SpriteMapEditor
spriteList.DisplayMember = "Name";
spriteList.ValueMember = "Bounds";
originPointer_black = Properties.Resources.originPointer_black;
originPointer_white = Properties.Resources.originPointer_white;
LoadSpriteEditorValues();
}
private void loadSpriteSheetButton_Click(object sender, EventArgs e)
private void loadSpriteSheetToolStripMenuItem_Click(object sender, EventArgs e)
{
if(loadSpriteSheetDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
spriteSheetViewer.Image = Image.FromFile(loadSpriteSheetDialog.FileName);
}
InitializeMask();
}
private void spriteSheetViewer_Paint(object sender, PaintEventArgs e)
@@ -78,18 +101,35 @@ namespace SpriteMapEditor
spriteSheetViewer.Height = spriteSheetViewer.Image.Height * zoomLevel;
if (highlight)
SurroundWithTranslucentRects(GetDrawingRect(currentSprite.Bounds, false), Color.Gray, e.Graphics);
DrawHighContrastOutline(GetDrawingRect(currentSprite.Bounds), e.Graphics);
/*
* Origin display code, uncomment when ready to implement
*
using (Brush magentaBrush = new SolidBrush(Color.Magenta))
{
e.Graphics.FillRectangle(magentaBrush, GetOriginDrawingRect(currentSprite));
//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);
e.Graphics.DrawImage(highlightMask.Bitmap, highlightBounds);
}
*/
}
DrawHighContrastOutline(GetDrawingRect(currentSprite.Bounds), e.Graphics);
//origin drawing code
if (editingOrigin)
{
var spriteSheet = (Bitmap)spriteSheetViewer.Image;
var colorAtOrigin = spriteSheet.GetPixel((int)(currentSprite.Bounds.X + currentSprite.Origin.X),
(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);
}
@@ -137,16 +177,51 @@ namespace SpriteMapEditor
return drawingRect;
}
private Rectangle GetOriginDrawingRect(SpriteMapRegion sprite)
private Point GetOriginDrawingPoint(SpriteMapRegion sprite)
{
var drawingRect = new Rectangle(sprite.Bounds.X, sprite.Bounds.Y, 2, 2);
drawingRect.X = drawingRect.X * zoomLevel - (zoomLevel - 1);
drawingRect.Y = drawingRect.Y * zoomLevel - (zoomLevel - 1);
drawingRect.X += drawingRectangleOffset;
drawingRect.Y += drawingRectangleOffset;
drawingRect.X += (int)sprite.Origin.X * zoomLevel;
drawingRect.Y += (int)sprite.Origin.Y * zoomLevel;
return drawingRect;
var drawingPoint = new Point(sprite.Bounds.X, sprite.Bounds.Y);
drawingPoint.X = drawingPoint.X * zoomLevel - (zoomLevel - 1);
drawingPoint.Y = drawingPoint.Y * zoomLevel - (zoomLevel - 1);
drawingPoint.X += drawingRectangleOffset;
drawingPoint.Y += drawingRectangleOffset;
drawingPoint.X += (int)sprite.Origin.X * zoomLevel;
drawingPoint.Y += (int)sprite.Origin.Y * zoomLevel;
return drawingPoint;
}
private void UpdateHighlightMask()
{
if (highlight)
{
InitializeMask();
for (int currentY = 0; currentY < currentSprite.Bounds.Height; currentY++)
{
for (int currentX = 0; currentX < currentSprite.Bounds.Width; currentX++)
{
highlightMask.SetPixel(currentX + currentSprite.Bounds.X, currentY + currentSprite.Bounds.Y, Color.Transparent);
}
}
}
}
private void InitializeMask()
{
if (baseMask == null)
{
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);
}
}
baseMask = new DirectBitmap(highlightMask);
}
else
{
highlightMask.CopyBitmap(baseMask);
}
}
private void SurroundWithTranslucentRects(Rectangle rect, Color color, Graphics graphics)
@@ -191,7 +266,10 @@ namespace SpriteMapEditor
{
highlight = !highlight;
if (highlight)
{
fillButton.Text = "No Highlight";
UpdateHighlightMask();
}
else
fillButton.Text = "Highlight";
spriteSheetViewer.Refresh();
@@ -224,6 +302,7 @@ namespace SpriteMapEditor
if (loadingSprite)
return;
UpdateSpriteBounds();
UpdateHighlightMask();
spriteSheetViewer.Refresh();
}
@@ -232,6 +311,7 @@ namespace SpriteMapEditor
if (loadingSprite)
return;
UpdateSpriteBounds();
UpdateHighlightMask();
spriteSheetViewer.Refresh();
}
@@ -240,6 +320,7 @@ namespace SpriteMapEditor
if (loadingSprite)
return;
UpdateSpriteBounds();
UpdateHighlightMask();
spriteSheetViewer.Refresh();
}
@@ -248,6 +329,7 @@ namespace SpriteMapEditor
if (loadingSprite)
return;
UpdateSpriteBounds();
UpdateHighlightMask();
spriteSheetViewer.Refresh();
}
@@ -276,11 +358,12 @@ namespace SpriteMapEditor
{
currentSprite = sprites[spriteList.SelectedIndex];
LoadSpriteEditorValues();
UpdateHighlightMask();
spriteSheetViewer.Refresh();
}
}
private void saveMapButton_Click(object sender, EventArgs e)
private void saveMapAsToolStripMenuItem_Click(object sender, EventArgs e)
{
var exportDict = new Dictionary<string, SpriteMapRegion>();
foreach (SpriteMapRegion sprite in sprites)
@@ -299,19 +382,51 @@ namespace SpriteMapEditor
if (saveMapDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
using (XmlWriter writer = XmlWriter.Create(saveMapDialog.FileName))
CurrentSpriteMapFileLocation = saveMapDialog.FileName;
using (XmlWriter writer = XmlWriter.Create(CurrentSpriteMapFileLocation))
{
IntermediateSerializer.Serialize(writer, exportDict, null);
}
}
saveSpriteMapToolStripMenuItem.Enabled = true;
}
private void saveSpriteMapToolStripMenuItem_Click(object sender, EventArgs e)
{
if (CurrentSpriteMapFileLocation != null)
{
var exportDict = new Dictionary<string, SpriteMapRegion>();
foreach (SpriteMapRegion sprite in sprites)
{
if (exportDict.ContainsKey(sprite.Name))
{
string errorMessage = "Duplicate names found! Please ensure all sprites have unique names.";
string caption = "Save Aborted";
MessageBoxButtons saveError = MessageBoxButtons.OK;
MessageBox.Show(errorMessage, caption, saveError);
return;
}
exportDict.Add(sprite.Name, sprite);
}
using (XmlWriter writer = XmlWriter.Create(CurrentSpriteMapFileLocation))
{
IntermediateSerializer.Serialize(writer, exportDict, null);
}
}
}
private void loadMapButton_Click(object sender, EventArgs e)
private void loadMapToolStripMenuItem_Click(object sender, EventArgs e)
{
if(loadMapDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
CurrentSpriteMapFileLocation = loadMapDialog.FileName;
Dictionary<string, SpriteMapRegion> loadedSpriteMap;
using (XmlReader xmlRead = XmlReader.Create(loadMapDialog.FileName))
using (XmlReader xmlRead = XmlReader.Create(CurrentSpriteMapFileLocation))
{
loadedSpriteMap = IntermediateSerializer.Deserialize<Dictionary<string, SpriteMapRegion>>(xmlRead, null);
}
@@ -343,13 +458,13 @@ namespace SpriteMapEditor
newPosition.Y /= zoomLevel;
int differenceX = newPosition.X - oldPosition.X;
int differenceY = newPosition.Y - oldPosition.Y;
Console.WriteLine(differenceX + ", " + differenceY);
var newBounds = currentSprite.Bounds;
newBounds.X += differenceX;
newBounds.Y += differenceY;
currentSprite.Bounds = newBounds;
oldPosition = newPosition;
UpdateHighlightMask();
spriteSheetViewer.Refresh();
LoadSpriteEditorValues();
}
@@ -423,5 +538,27 @@ namespace SpriteMapEditor
spriteList.SelectedIndex--;
}
}
private void editingOriginCheckBox_CheckedChanged(object sender, EventArgs e)
{
editingOrigin = editingOriginCheckBox.Checked;
if (editingOrigin)
{
originXPosLabel.Enabled = true;
originXPosBox.Enabled = true;
originYPosLabel.Enabled = true;
originYPosBox.Enabled = true;
}
else
{
originXPosLabel.Enabled = false;
originXPosBox.Enabled = false;
originYPosLabel.Enabled = false;
originYPosBox.Enabled = false;
}
spriteViewerPanel.Refresh();
}
}
}
+3 -52
View File
@@ -126,56 +126,7 @@
<metadata name="saveMapDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>325, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="spriteSheetViewer.BackgroundImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>461, 17</value>
</metadata>
</root>
+20
View File
@@ -60,6 +60,26 @@ namespace SpriteMapEditor.Properties {
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap originPointer_black {
get {
object obj = ResourceManager.GetObject("originPointer_black", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap originPointer_white {
get {
object obj = ResourceManager.GetObject("originPointer_white", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
+7 -1
View File
@@ -118,7 +118,13 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="originPointer_black" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\originPointer_black.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="originPointer_white" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\originPointer_white.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="transparentUI" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\transparentui.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
<value>..\Resources\transparentUI.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>
Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 B

+10 -6
View File
@@ -51,6 +51,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="DirectBitmap.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
@@ -88,17 +89,20 @@
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\transparentUI.png" />
</ItemGroup>
<ItemGroup>
<Content Include="transparentUI.png" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\QURO\QURO.csproj">
<Project>{4581e0c8-b14a-454d-9a7b-52d37535e7e9}</Project>
<Name>QURO</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Resources\originPointer_black.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\originPointer_white.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\transparentUI.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB