読者です 読者をやめる 読者になる 読者になる

developer_RYO’s blog

スマホアプリやPCゲーム、音楽やイラストを自由気ままに作っている人の技術ログです

C# Windowsで、簡易的なマップエディタもどき(笑)を作ってみました

f:id:developer_RYO:20160806005933g:plain

こんばんは。

こんな深夜ですが、業務上サーバー負荷監視をしており、時間がありましたので
マップエディタっぽい何かを作ろうとしました。
業務のほうで、「パズルゲームのマップエディタあったらいいなあ~」という声がございましたので
プログラムを組んでいる次第です。

C# マップエディタ 作り方」で検索しますと、いくつかヒットしました。
d.hatena.ne.jp
Bird-Soft Weblog: マップエディタ作成中


他にもいろいろありましたが、僕が思う「これだ!」という資料が見つかりませんでした。

今回はC#でマップエディタがパパッと作れるかどうかの検討も合わせて
まず簡易的なものを作ってみようと試みました。
ちなみに、C#で作る理由は、自分が今書ける言語の内一番簡単そうに作れそうだったからです。


検証&作ったのは、下記になります。

  1. 画像を簡単にグリッド表示みたいなものできるか?
  2. 画像クリック時に、クリックした箇所のグリッドに画像を入れられるか?
  3. 画像ダブルクリック時に、ダブルクリックした箇所の画像を消せるか?


1.画像をグリッド表示みたいなものできるか?
→できた。
csファイルで、フォーム起動時にPictureBoxを生成。
作ったPictureBoxはListに格納。
参考にしたのはこちらのページです。
コントロールの配列を作成する: .NET Tips: C#, VB.NET


2.画像クリック時に、クリックした箇所のグリッドに画像を入れられるか?
3.画像ダブルクリック時に、ダブルクリックした箇所の画像を消せるか?
→できた。
生成したPictureBoxに対して、クリック等したときのイベントハンドラを設定。
イベントハンドラ内で、
MessageBox.Show(((System.Windows.Forms.PictureBox) sender).Name);
みたいな書き方をすると、クリックしたPictureBox取得できる。


ソースは下記になります。(gif画像で動いているものに相当)
いまのところ、クリック時にPictureBox.BackColorをいじっていますので
こちらを画像格納する記述にすればOKなはず!

 public partial class Form1 : Form
    {
        private List<List<PictureBox>> PiecePictureBoxList;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            PiecePictureBoxList = new List<List<PictureBox>>();
            InitPieceGrid(8, 9);
        }

        /// <summary>
        /// ピースグリッドの範囲をクリックしたときの挙動
        /// ここにパズルのピース画像を入れる処理を入れる
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PiecePictureBox_Click(object sender, EventArgs e)
        {
            ((System.Windows.Forms.PictureBox)sender).BackColor = Color.Black;
        }

        /// <summary>
        /// ピースグリッドの範囲をダブルクリックしたときの挙動
        /// ここにパズルのピース画像を削除する処理を入れる
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PiecePictureBox_DoubleClick(object sender, EventArgs e)
        {
            ((System.Windows.Forms.PictureBox)sender).BackColor = Color.White;
        }


        /// <summary>
        /// ピース画像を格納するグリッドを作成します。
        /// きれいにできないかな。。。
        /// </summary>
        private void InitPieceGrid(int x,int y)
        {
            for(int i = 0; i < y; i++)
            {
                var PiecePictureBoxLow = new List<PictureBox>();
                for(int j = 0; j < x; j++)
                {
                    PiecePictureBoxLow.Add(new PictureBox());
                    PiecePictureBoxLow.LastOrDefault().Name = "PictureBox" + "X"+ j + "Y" + i;
                    PiecePictureBoxLow.LastOrDefault().Location = new Point(60 * (j + 1), 60 * (i + 1));
                    PiecePictureBoxLow.LastOrDefault().Size = new System.Drawing.Size(60, 60);
                    PiecePictureBoxLow.LastOrDefault().BorderStyle = BorderStyle.FixedSingle;
                    PiecePictureBoxLow.LastOrDefault().BackColor = Color.White;
                    this.Controls.Add(PiecePictureBoxLow.LastOrDefault());
                    PiecePictureBoxLow.LastOrDefault().Click += PiecePictureBox_Click;
                    PiecePictureBoxLow.LastOrDefault().DoubleClick += PiecePictureBox_DoubleClick;
                }
                PiecePictureBoxList.Add(PiecePictureBoxLow);
            }           
        }
    }


とりあえず、何とか作れそうです。
そして、LINQの勉強不足が露呈しました。。。(苦笑)