自分だけのクイズ作成 - 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();
        }

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

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

コメント

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