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

【#8】C#でゲームを作ろう【敵を倒す処理実装】

C#

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

スポンサーリンク

敵を倒す処理実装

もうラストです。敵をクリックしたら得点を加算する処理を実装します。
以下のメソッドをメイン画面(F_Main)に追加します。

        /// <summary>
        /// 敵クリックイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void EnmOnClick(object sender, EventArgs e)
        {
            // 得点の加算(それぞれの敵の得点を取得する。)
            L_Sum.Text = (Int32.Parse(L_Sum.Text) + ((CEnemy)sender).GetTokuten()).ToString();
            // 敵を倒したイベント(再度敵を出現させる)
            ((CEnemy)sender).EnemyDown();
        }

このクリック処理をすでに実装したスタートボタンのクリックイベント(B_Start_Click)に実装します。

        /// <summary>
        /// スタートボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void B_Start_Click(object sender, EventArgs e)
        {
            // スタートボタンを使えなくする
            B_Start.Enabled = false;

            // 敵を生成します
            for (int i = 0; i <= 9; i++)
            {
                // 配列に敵クラスを生成します。その際にオーナーのパネルとランダム変数を渡します。
                _enemies.Add(new CEnemy(P_Enemy, _rnd));
                // 敵のクリックイベント(倒すイベント)
                ((CEnemy)_enemies[i]).OnClick += new EventHandler(EnmOnClick);
                // ループの中でDoEventsを呼んでおく
                Application.DoEvents();
            }

            // タイマーのスタート
            T_Enemy.Enabled = true;
            T_Jikan.Enabled = true;
        }

これでほぼ完成です。
最後に初級・中級・上級の処理を書きましょう。

ちなみに以下の処理の役割をまとめましょう。

敵の数スタートボタンクリック時のループの回数。
敵の動くスピードタイマー(T_Enemy)のインターバル。
敵の動く範囲パネル(P_Enemy)の大きさ。
残り時間プログレスバー(PG_Jikan)の値。

この値を設定することで難易度を変更します。
メイン画面(F_Main)の先頭に以下のプロパティを追加します。

        // 敵の数
        public int Enms;
        // 敵の動くスピード(秒数)
        public int EnmTim;
        // 残り時間(秒数)
        public int GmTim;

さらに初期化するメソッドを追加します。
メイン画面(F_Main)の先頭に以下のメソッドを追加します。

        /// <summary>
        /// 難易度初期化
        /// </summary>
        public void FrmIni()
        {
            // フォームのサイズでコントロールを配置する
            P_Enemy.Height = Height - P_Enemy.Top - 45;
            P_Enemy.Width = Width - 40;

            // 合計得点
            L_Sum.Text = "0";
            // 敵の動くスピード
            T_Enemy.Interval = EnmTim;
            // 残り時間の初期化
            PG_Jikan.Maximum = GmTim / 1000;
            PG_Jikan.Value = PG_Jikan.Maximum;
        }

P_Enemy.TopとP_Enemy.Leftはフォームとパネル次第ですので調整してください。
次にスタートボタンクリックイベントのループの回数を変更します。

        /// <summary>
        /// スタートボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void B_Start_Click(object sender, EventArgs e)
        {
            // スタートボタンを使えなくする
            B_Start.Enabled = false;

            // 敵を生成します
            for (int i = 0; i <= Enms - 1; i++)
            {
                // 配列に敵クラスを生成します。その際にオーナーのパネルとランダム変数を渡します。
                _enemies.Add(new CEnemy(P_Enemy, _rnd));
                // 敵のクリックイベント(倒すイベント)
                ((CEnemy)_enemies[i]).OnClick += new EventHandler(EnmOnClick);
                // ループの中でDoEventsを呼んでおく
                Application.DoEvents();
            }

            // タイマーのスタート
            T_Enemy.Enabled = true;
            T_Jikan.Enabled = true;
        }

最後にメニュー画面(F_Menu)に戻って初級・中級・上級ボタンのクリックイベントに難易度を設定します。
とりあえず以下のように難易度を設定してみました。

        /// <summary>
        /// 初級ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void B_Syokyu_Click(object sender, EventArgs e)
        {
            F_Main fMain = new F_Main
            {
                Height = 400,    // フォームの高さ
                Width = 400,     // フォームの幅
                EnmTim = 1000,   // 敵の動く速度
                Enms = 20,       // 敵の数
                GmTim = 10000    // 制限時間
            };

            // 難易度初期化
            fMain.FrmIni();

            fMain.Show(this);
            Hide();
        }

        /// <summary>
        /// 中級ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void B_Chukyu_Click(object sender, EventArgs e)
        {
            F_Main fMain = new F_Main
            {
                Height = 500,    // フォームの高さ
                Width = 700,     // フォームの幅
                EnmTim = 800,    // 敵の動く速度
                Enms = 30,       // 敵の数
                GmTim = 15000    // 制限時間
            };

            // 難易度初期化
            fMain.FrmIni();

            // thisを指定することにより、子フォームに親フォームを設定
            fMain.Show(this);
            Hide();
        }

        /// <summary>
        /// 上級ボタンクリック
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void B_Jyokyu_Click(object sender, EventArgs e)
        {
            F_Main fMain = new F_Main
            {
                Height = 600,    // フォームの高さ
                Width = 800,     // フォームの幅
                EnmTim = 300,    // 敵の動く速度
                Enms = 40,       // 敵の数
                GmTim = 20000    // 制限時間
            };

            // 難易度初期化
            fMain.FrmIni();

            // thisを指定することにより、子フォームに親フォームを設定
            fMain.Show(this);
            Hide();
        }

以上で、全て完成です。実行して正しく動くかどうか確認しましょう。
お疲れ様でした。

あまりにも敵の数が多すぎて、動く速度が早い場合など
正常に動かなくなりますので、適正な難易度を設定してください。

\オススメ/

コメント

  1. ひらひら より:

    こんばんわ。先日は回答ありがとうございました。
    別の質問が出てきましたので教えて頂けるとありがたいです。

    メニュー画面で初級、中級、上級のボタンクリック時に
    F_Main fMain = new F_Main { ・・・ }とインスタンス生成をしていますが、この時{}(波カッコ)の中でフォームの高さと幅、変数3つに値セットをしているようにみえてて実際フォームのサイズが変わり変数にも値が入っていると思っています。

    ただ、この{}(波カッコ)の使い方?文法?というのが色々調べたのですがどうも出てきません。
    インスタンス生成の時に{}を使っているところを見た事がなく、どのように調べれば使い方を説明した情報にたどりつけるか分からない状態です。
    変数もセットしているのでformを継承しているときの特別な使い方ではないと思いますが、クラスの{}の一種にも見えるしメソッドの{}にも見えるしという感じです。
    どのように調べればよいかアドバイスを頂けるとありがたいです。

    よろしくお願いいたします。

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