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

Donate