自分だけのクイズを作成しよう - Quipha
スポンサーリンク

【#5】C#でゲームを作ろう【敵クラスの作成1】

C#

当サイトではアフィリエイト広告を利用しています。

スポンサーリンク

敵クラスについて

それでは敵クラスを作成します。

仕様
  • インスタンスを生成するとランダムな場所に出現する。
  • 出現場所はあるコンポーネントの上のみ(今回はF_MainのパネルP_Enemyの上)
  • 出現する敵は三種類あり、どれかランダムに一つ選ばれる。
  • 敵は画像で表示されそれぞれ違う。
  • それぞれやっつけた(クリックされた)際に、得点が得られる。
  • 敵は倒されたらまた違う敵になって出現する。
  • それぞれの敵の動きは種類によって違う。

クラス作成

メニューの「プロジェクト」→「クラスの追加」をクリックします。

ファイル名は任意で結構ですが、「Class1.cs」のまま追加ボタンを押します。

初期では以下のようになっております。

namespace ClickBuster_cs
{
    class Class1
    {
    }
}

Class1の部分がクラス名となっておりますので、敵クラス(CEnemy)に名前を変更します。

namespace ClickBuster_cs
{
    class CEnemy
    {
    }
}

コンストラクタを定義

コンストラクタを定義します。
敵クラスが生成されたときに呼び出されますので、初期化を行います。

コンストラクタとは、クラスのインスタンス生成時に実行されるメソッドです。

以降、以下のように、クラスの中に定義していきます。

    class CEnemy
    {

        public CEnemy()
        {

        }
    }

まずはこのクラスで使用する変数を定義します。

        // 敵の画像
        private PictureBox _pbImgEnemy;
        // 敵が出現するオーナー
        private Control _enemyOwner;
        // ランダム変数
        private Random _rnd;
        // 敵を倒した時の得点
        private int _intTokuten;
        // 敵が動く際の幅
        private int _intMvwd;
        // 上下左右に動く
        private int _intMvud;
        // 敵のパターン
        private int _intMovePattern;

コンストラクタに引数を二つ追加し、以下のようにコーディングします。
引数は、敵が移動できるコンポーネント(パネル)と、ランダム変数です。

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="owner">敵が出現するオーナー</param>
        /// <param name="rand"></param>
        public CEnemy(Control owner, Random rand)
        {
            // 敵の画像を表示する変数を初期化
            _pbImgEnemy = new PictureBox();
            // オーナーの取得
            _enemyOwner = owner;
            // ランダム変数
            _rnd = rand;
            // 敵が動く際の幅の初期化
            _intMvwd = 10;
            // 上下左右に動く
            _intMvud = 0;

            // 敵画像がクリックされたイベント
            _pbImgEnemy.Click += new EventHandler(DoClick);
            // ランダムな場所に出現
            _RandPlace();
            // オーナーに画像を貼り付け
            _enemyOwner.Controls.Add(_pbImgEnemy);
        }

先頭に以下を宣言しておきましょう。

using System.Drawing;
using System.Windows.Forms;

DoClickと_RandPlaceメソッドの実装

まずクリックイベントを実装します。
敵画像をクリックされた際に処理するためです。
変数宣言の下あたりにクリックイベントを宣言します。

        // クリックイベント
        public event EventHandler OnClick;

次にクリックイベントの実装です。

        /// <summary>
        /// 画像クリックイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DoClick(object sender, EventArgs e)
        {
            OnClick(this, e);
        }

上記を実装することで、敵画像(_pbImgEnemy)のクリックイベントがこのクラスのクリックイベントになります。

次に敵をランダムな場所に出現するメソッド「_RandPlace」を追加します。

敵自体もランダムに選択されます。ここでは三種類の敵にします。
他のクラスから呼ばれる必要がないのでPrivateにしておきます。

        /// <summary>
        /// 敵画像をランダムな場所に作成
        /// </summary>
        private void _RandPlace()
        {

            // 出現場所はオーナーの範囲内にする
            // 高さ
            var intTop = _rnd.Next(_enemyOwner.Size.Height - _pbImgEnemy.Size.Height);
            _pbImgEnemy.Top = intTop;
            // 横
            var intLeft = _rnd.Next(_enemyOwner.Size.Width - _pbImgEnemy.Size.Width);
            _pbImgEnemy.Left = intLeft;

            // 敵のパターン(画像と得点)をランダムに指定する
            _intMovePattern = _rnd.Next(1, 4);
            _pbImgEnemy.SizeMode = PictureBoxSizeMode.AutoSize;

            switch (_intMovePattern)
            {
                case 1:
                    // 画像読み込み
                    _pbImgEnemy.Image = Image.FromFile("enemy1.gif");
                    // 得点
                    _intTokuten = 500;
                    break;
                case 2:
                    // 画像読み込み
                    _pbImgEnemy.Image = Image.FromFile("enemy2.gif");
                    // 得点
                    _intTokuten = 1000;
                    break;
                case 3:
                    // 画像読み込み
                    _pbImgEnemy.Image = Image.FromFile("enemy3.gif");
                    // 得点
                    _intTokuten = 3000;
                    break;
            }

        }

_intMovePatternが1の場合、画像は「enemy1.gif」が選択され、倒した際の得点は500点になります。

ひとまず敵クラスの初期化の実装はここまでです。
少しコーディングしてきましたが、一行ずつ解読してみてください。

\オススメ/

コメント

  1. ひらひら より:

    サイト公開ありがとうございます。勉強になります。C#でゲームを作ろうを一通り作成して全体を見直ししたり追っかけたりしています。

    1つ疑問に思う事があり教えて頂けますでしょうか。

    C#でゲームを作ろう【#5】にて敵クラスの作成でCEnemyクラスを作成していますが、この中の変数は_アンダーバーで始まっています。メイン画面にも変数はいくつかありますがこちらは普通の命名のように感じます。

    _アンダーバーで始まる事になにか意味(特別な意味とかコーディング規約があるとか)があるのでしょうか?

    お時間がありましたらよろしくお願いします。

    • 千草 より:

      アンダーバーについては、クラス内のprivateなフィールドに対して、名前の先頭に付けていました。

      このソース自体、何年も前に作成したものですが、当時携わっていたプロジェクトのルールだったような気がします。
      「C# 変数名 アンダーバー private」でググってみると、マイクロソフトのコーディング規約にあったという記事もあるようです。

      現在も主流かどうかは分かりませんが、参考までとさせていただきます。

      • ひらひら より:

        回答ありがとうございます。
        意味があるのですね。検索もさせて頂き、参考にさせて頂きます。
        ありがとうございました。

タイトルとURLをコピーしました