Archive Browser
Download Cyotek.ArcadeExplosionMaker.zip version 1.0.0.1, last updated 05/06/2012 (123.69 KB)
Download- md5: bd412009442f7923a555ba5b0f508fe0
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using Cyotek.Windows.Forms;
namespace Cyotek.ArcadeExplosionMaker.Client
{
// Cyotek Arcade Explosion Maker
// Copyright (c) 2012 Cyotek. All Rights Reserved.
// http://cyotek.com
// http://cyotek.com/blog/arcade-explosion-generator
// If you use this code or output in your applications, attribution or donations are welcome.
// Icon Credits:
// New.png, Open.png, Save.png, Copy.png - http://www.glyfz.com/
// Others - http://p.yusukekamiyamane.com/
// Application icon - http://www.doublejdesign.co.uk/products-page/icons/diagram/
public partial class MainForm : Form
{
#region Private Member Declarations
private int _currentFrame;
private readonly string _exportExtension = "png";
private string _exportFileName;
private readonly string _exportFilter = string.Format("Portable Network Graphic (*.{0})|*.{0}|Bitmap (*.{1})|*.{1}|Joint Photographic Expert Group (*.{2})|*.{2}|Graphics Interchange Format (*.{3})|*.{3}|All Files (*.*)|*.*", "png", "bmp", "jpg", "gif");
private string _fileName;
private ExplosionGenerator _generator;
private ExplosionParameters _parameters;
private readonly string _settingsExtension = "esf";
private readonly string _settingsFilter = string.Format("Setting Files (*.{0})|*.{0}|All Files (*.*)|*.*", "esf");
#endregion Private Member Declarations
#region Public Constructors
public MainForm()
{
InitializeComponent();
}
#endregion Public Constructors
#region Protected Overridden Methods
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
speedToolStripTrackBar.Value = animationTimer.Interval;
this.FileNew();
if (Environment.GetCommandLineArgs().Length > 1)
this.FileOpen(Environment.GetCommandLineArgs()[1]);
}
#endregion Protected Overridden Methods
#region Event Handlers
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
using (Form dialog = new SimpleAboutDialog())
dialog.ShowDialog(this);
}
private void actualSizeToolStripMenuItem_Click(object sender, EventArgs e)
{
animationImageBox.ActualSize();
spriteSheetImageBox.ActualSize();
}
private void animatedPreviewToolStripMenuItem_Click(object sender, EventArgs e)
{
animatedPreviewToolStripMenuItem.Checked = !animatedPreviewToolStripMenuItem.Checked;
animatedToolStripButton.Checked = animatedPreviewToolStripMenuItem.Checked;
animationTimer.Enabled = animatedPreviewToolStripMenuItem.Checked;
}
private void animationTimer_Tick(object sender, EventArgs e)
{
if (_generator.Frames != null)
{
_currentFrame++;
if (_currentFrame > _generator.Frames.Count - 1)
_currentFrame = 0;
this.UpdateFrame();
}
}
private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
Clipboard.Clear();
Clipboard.SetImage(_generator.SpriteSheet);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
private void exportImagesToolStripMenuItem_Click(object sender, EventArgs e)
{
string exportFileName;
using (SaveFileDialog dialog = new SaveFileDialog())
{
dialog.Title = "Export Sprites";
dialog.Filter = _exportFilter;
dialog.DefaultExt = _exportExtension;
dialog.FileName = _exportFileName;
dialog.OverwritePrompt = false;
if (dialog.ShowDialog(this) == DialogResult.OK)
exportFileName = dialog.FileName;
else
exportFileName = null;
}
if (!string.IsNullOrEmpty(exportFileName))
{
ImageFormat format;
string[] exportFileNames;
this.SetStatus("Exporting images...");
format = this.GetImageFormat(exportFileName);
exportFileNames = Enumerable.Range(1, _generator.Frames.Count).Select(i => Path.Combine(Path.GetDirectoryName(exportFileName), string.Concat(Path.GetFileNameWithoutExtension(exportFileName), "_", i, Path.GetExtension(exportFileName)))).ToArray();
if (!exportFileNames.Any(f => File.Exists(f)) || MessageBox.Show("One or more output files already exist. Are you sure you want to overwrite these files?", Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
try
{
for (int i = 0; i < _generator.Frames.Count; i++)
_generator.Frames[i].Save(exportFileNames[i], format);
MessageBox.Show(string.Format("{0} files successfully exported.", _generator.Frames.Count), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
finally
{
this.SetStatus(string.Empty);
}
}
}
}
private void exportSpriteSheetToolStripMenuItem_Click(object sender, EventArgs e)
{
string exportFileName;
using (FileDialog dialog = new SaveFileDialog())
{
dialog.Title = "Export Sprite Sheet";
dialog.Filter = _exportFilter;
dialog.DefaultExt = _exportExtension;
dialog.FileName = _exportFileName;
if (dialog.ShowDialog(this) == DialogResult.OK)
exportFileName = dialog.FileName;
else
exportFileName = null;
}
if (!string.IsNullOrEmpty(exportFileName))
{
ImageFormat format;
this.SetStatus("Exporting image...");
format = this.GetImageFormat(exportFileName);
try
{
_generator.SpriteSheet.Save(exportFileName, format);
_exportFileName = exportFileName;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
finally
{
this.SetStatus(string.Empty);
}
}
}
private void homePageToolStripMenuItem_Click(object sender, EventArgs e)
{
Process.Start("http://cyotek.com/blog/arcade-explosion-generator");
}
private void newToolStripMenuItem_Click(object sender, EventArgs e)
{
this.FileNew();
}
private void openFileLocationToolStripMenuItem_Click(object sender, EventArgs e)
{
string fileName;
fileName = _exportFileName ?? _fileName;
if (!string.IsNullOrEmpty(fileName))
{
try
{
Process.Start("explorer.exe", string.Format("/select,\"{0}\"", fileName));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
else
MessageBox.Show("Nothing has been saved.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
this.FileOpen(string.Empty);
}
private void regenerateToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Generate();
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
this.FileSave(string.Empty);
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
this.FileSave(_fileName);
}
private void seedToolStripStatusLabel_Click(object sender, EventArgs e)
{
if (_generator.Seed != _parameters.Seed && MessageBox.Show(string.Format("Set the project seed to {0}?", _generator.Seed), Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
_parameters.Seed = _generator.Seed;
propertyGrid.Refresh();
}
}
private void showFrameHighlightsToolStripMenuItem_Click(object sender, EventArgs e)
{
showFrameHighlightsToolStripMenuItem.Checked = !showFrameHighlightsToolStripMenuItem.Checked;
showFrameHighlightsToolStripButton.Checked = showFrameHighlightsToolStripMenuItem.Checked;
if (showFrameHighlightsToolStripMenuItem.Checked)
this.UpdateFrame();
else
spriteSheetImageBox.SelectNone();
}
private void sizeToFitToolStripMenuItem_CheckedChanged(object sender, EventArgs e)
{
animationImageBox.SizeToFit = sizeToFitToolStripMenuItem.Checked;
spriteSheetImageBox.SizeToFit = sizeToFitToolStripMenuItem.Checked;
}
private void sizeToFitToolStripMenuItem_Click(object sender, EventArgs e)
{
sizeToFitToolStripMenuItem.Checked = !sizeToFitToolStripMenuItem.Checked;
sizeToFitToolStripButton.Checked = sizeToFitToolStripMenuItem.Checked;
}
private void speedToolStripTrackBar_ValueChanged(object sender, EventArgs e)
{
animationTimer.Interval = speedToolStripTrackBar.Value;
}
private void spriteSheetImageBox_SizeToFitChanged(object sender, EventArgs e)
{
sizeToFitToolStripMenuItem.Checked = ((ImageBox)sender).SizeToFit;
sizeToFitToolStripButton.Checked = ((ImageBox)sender).SizeToFit;
}
#endregion Event Handlers
#region Private Methods
private void ApplySettings(ExplosionParameters parameters)
{
this.SetWindowTitle();
_parameters = parameters;
_parameters.PropertyChanged += this.ParametersPropertyChangedHandler;
_generator = new ExplosionGenerator() { Parameters = _parameters };
propertyGrid.SelectedObject = _parameters;
this.Generate();
}
private void FileNew()
{
_fileName = null;
_exportFileName = null;
this.ApplySettings(new ExplosionParameters());
}
private void FileOpen(string fileName)
{
// get a filename if one hasn't already been provided
if (string.IsNullOrEmpty(fileName))
{
using (FileDialog dialog = new OpenFileDialog())
{
dialog.Title = "Open Settings File";
dialog.Filter = _settingsFilter;
dialog.DefaultExt = _settingsExtension;
if (dialog.ShowDialog(this) == DialogResult.OK)
fileName = dialog.FileName;
}
}
if (!string.IsNullOrEmpty(fileName))
{
// open the file
this.SetStatus("Loading settings file...");
try
{
XmlDocument document;
ExplosionParameters parameters;
document = new XmlDocument();
document.Load(fileName);
parameters = new ExplosionParameters();
((IXmlPersistence)parameters).Read(fileName, document.DocumentElement);
_fileName = fileName;
_exportFileName = null;
this.ApplySettings(parameters);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
finally
{
this.SetStatus(string.Empty);
}
}
}
private void FileSave(string fileName)
{
// get a filename if one hasn't already been provided
if (string.IsNullOrEmpty(fileName))
{
using (FileDialog dialog = new SaveFileDialog())
{
dialog.Title = "Save Settings File As";
dialog.Filter = _settingsFilter;
dialog.DefaultExt = _settingsExtension;
if (dialog.ShowDialog(this) == DialogResult.OK)
fileName = dialog.FileName;
}
}
if (!string.IsNullOrEmpty(fileName))
{
// save the file
this.SetStatus("Saving settings file...");
try
{
XmlWriterSettings settings;
string workFile;
settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Indent = true;
workFile = Path.GetTempFileName();
using (XmlWriter writer = XmlWriter.Create(workFile, settings))
((IXmlPersistence)_parameters).Write(workFile, writer);
File.Copy(workFile, fileName, true);
File.Delete(workFile);
_fileName = fileName;
this.SetWindowTitle();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
finally
{
this.SetStatus(string.Empty);
}
}
}
private void Generate()
{
this.SetStatus("Generating sprites...");
animationImageBox.Image = null;
spriteSheetImageBox.Image = null;
animationTimer.Stop();
_generator.Generate();
_currentFrame = 0;
this.UpdateFrame();
if (animatedPreviewToolStripMenuItem.Checked)
animationTimer.Start();
spriteSheetImageBox.Image = _generator.SpriteSheet;
seedToolStripStatusLabel.Text = string.Format("Seed: {0}", _generator.Seed);
this.SetStatus(string.Empty);
}
private ImageFormat GetImageFormat(string exportFileName)
{
ImageFormat format;
switch (Path.GetExtension(exportFileName).ToLower())
{
case ".jpg":
format = ImageFormat.Jpeg;
break;
case ".bmp":
format = ImageFormat.Bmp;
break;
case ".gif":
format = ImageFormat.Gif;
break;
default:
format = ImageFormat.Png;
break;
}
return format;
}
private void ParametersPropertyChangedHandler(object sender, PropertyChangedEventArgs e)
{
this.Generate();
switch (e.PropertyName)
{
case "BackColor":
if (_parameters.BackColor.A == 255)
animationImageBox.BackColor = _parameters.BackColor;
else
animationImageBox.BackColor = Color.White;
animationImageBox.GridDisplayMode = _parameters.BackColor.A != 255 ? ImageBoxGridDisplayMode.Client : ImageBoxGridDisplayMode.None;
break;
}
}
private void SetStatus(string message)
{
this.UseWaitCursor = !string.IsNullOrEmpty(message);
statusToolStripStatusLabel.Text = message;
Application.DoEvents(); // I thought having to use this was gone with VB6
}
private void SetWindowTitle()
{
this.Text = string.Format("{0} - {1}", string.IsNullOrEmpty(_fileName) ? "Untitled" : Path.GetFileName(_fileName), Application.ProductName);
}
private void UpdateFrame()
{
animationImageBox.Image = _generator.Frames[_currentFrame];
if (showFrameHighlightsToolStripMenuItem.Checked)
{
int r;
int c;
r = _currentFrame / _generator.SpriteSheetLayoutSize.Width;
c = _currentFrame - (r * _generator.SpriteSheetLayoutSize.Width);
spriteSheetImageBox.SelectionRegion = new Rectangle(new Point(c * _parameters.FrameSize.Width, r * _parameters.FrameSize.Height), _parameters.FrameSize);
}
}
#endregion Private Methods
}
}
Donate
This software may be used free of charge, but as with all free software there are costs involved to develop and maintain.
If this site or its services have saved you time, please consider a donation to help with running costs and timely updates.
Donate