2015年7月24日金曜日

ゲームの自動操作装置(12):キー入力ウェイトの実装

連続するキー入力のタイミング調整などにスリープ(ウェイト)処理が必要になる
以下はそれの簡単な実装について

Thread.Sleep()を使うのが一番簡単なのだが、スレッド自体が止まるのでUIも固まってしまう
(逆にこれを許容するならばThread.Sleep()でよい)
UIとキー入力部分を別スレッドにすればよいのだがこれもなかなか面倒くさい

以下のコードはThread.Sleep()の代わりに用いるスリープ用処理の抜粋
Timerクラスを用いて指定された時間だけ待つ
この間Application.DoEvents()メソッドを呼び続けることでUIが固まることを防ぐ

スリープの精度はイマイチだと思うが今回の用途には問題ないものとした

        static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
        static bool timerEndFlag = false;

        //フォームのロード時にイベントハンドラを仕込んでおく
        private void FormLoad(object sender, EventArgs e)
        {
            //…
            myTimer.Tick += new EventHandler(TimerEventProcessor);
            //…
        }
        private static void TimerEventProcessor(Object myObject,
                                                EventArgs myEventArgs)
        {
            myTimer.Stop();
            timerEndFlag = true;
        }

        //Thread.Sleep()の代わりに使用
        private void sleep(int msec)
        {
            if (msec <= 0)
                msec = 1;
            myTimer.Interval = msec;
            timerEndFlag = false;
            myTimer.Start();

            // Runs the timer, and raises the event.
            while (timerEndFlag == false)
            {
                Application.DoEvents();
            }
        }

0 件のコメント:

コメントを投稿