「Tobii Eye Tracking」カテゴリーアーカイブ

HotS のミニマップみようツールの作成(5)

今回は、ゲーム中のカウントのコロンを検出して「コロンが表示されてないときはゲーム中とみなさない」という処理を実装した。

具体的には、コロン位置の画面をキャプチャして、コロンの2つの点のピクセル色が白っぽいかどうかで判別するようにした。

この実装で、ロード中とゲーム開始までの “-00:20” とかもゲーム中でないとみなせるようになって大変よかった。(ゲーム中は “00:23” とかになるので、ゲーム開始前とゲーム中とではコロン位置が異なる)

次は、ミニマップを見てないときに警告を出すまでの時間を調整できるあたりを実装しようと思う。

いい感じです。

HotS のミニマップみようツールの作成(4)

作成を再開しました。久しぶりに動作させてみたら割といろいろ動かなかったので、とりあえず動くようにしました。

https://bitbucket.org/satofumi/hots_tools/src/default/hots_minimap_instructor/

今後の予定としては

  • ゲーム画面の時間表示のコロンの有無でゲーム中かを判別する。
  • 警告音までの時間を設定できるようにする。
  • ミニマップの領域を指定できるようにする。

とかですね。
シンプルなツールなので、総チケット数は多くないです。

HotS のミニマップみようツールの作成(5)

前回インストーラを作ってみて「今の実装だとインストーラで作った実行ファイルは起動できない」という現実を知ってしまったので、今回はとりあえずアプリが落ちないように調整します。
私は知っている、こういう自分の知ってる知識で作れる機能は集中して数日のうちに実装を終えてしまった方がいいことを…

まぁ、そんな数日集中できるほど元気はないので、少しずつやりましょう。集中すると疲れるし。

今回やろうと思っていることは

  • 効果音があるパスなどを格納する設定ファイルを作って Document に配置されるようにする。
  • 効果音がなくてもアプリが起動するようにする。
  • 視線検出デバイスが動作してなくてもアプリが起動するようにする。

です。
そして、今回変更したコミットはこれです。

https://bitbucket.org/satofumi/hots_tools/commits/b7c44a5412623a506adbcd65c0be3f139fdce322

オチとしては、アプリが起動しなかった理由は Tobii の tobii_stream_engine.dll がインストーラに含まれてなかったせい、でした。もっと早く気づきたかった。

ともあれ、アプリとしては適切に動作しませんが、インストールしたアプリが落ちないようにはなりました。

いい感じです。

HotS のミニマップみようツールの作成(4)

ぶっちゃけ、とりあえず最低限の動作をするようになってから進捗がないのもよくないなと思ったので、今回はインストーラを作ります。とはいえ、Visual Studio Installer のプロジェクトを作るだけです。ライセンスとかのファイルも次回以降に配置しようと思います。

https://bitbucket.org/satofumi/hots_tools/src/d237a3e83f476ff09e505db6b03ccbdda98f0840/hots_minimap_instructor/?at=default

そして、インストーラを作ってインストールできるのが確認できたところまでが、これです。インストールしたアプリを実行してみて気づいたことは

  • 見てね効果音、見たね効果音を指定がないとアプリが落ちる。
  • Tobii アイトラッキングのデバイスが起動してないとアプリが落ちる。

うん。
使ってみると実装がまだ全然終わってないことを実感できて良いですね。
次回はこのインストールしたアプリが落ちなくなる調整をしようと思います。

進捗があるの、大事。
いい感じだと思います。

HotS のミニマップみようツールの作成(3)

今回は、視線検出した結果に基づいてミニマップを見てないときに警告音を出力するあたりを実装します。

で、実装したメインのロジックはこのあたり。

        private void UpdateWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            int nextAudioPlayMsec = NoCheckMsec;
            var noCheckElapsed = new System.Diagnostics.Stopwatch();
            noCheckElapsed.Start();

            var previousGameState = state;
            while (!updateWorker.CancellationPending)
            {
                System.Threading.Thread.Sleep(20);
                
                if (IsLookingMinimap)
                {
                    if (nextAudioPlayMsec != NoCheckMsec)
                    {
                        okSound.Play();
                    }

                    noCheckElapsed.Restart();
                    nextAudioPlayMsec = NoCheckMsec;
                }
                else if (noCheckElapsed.ElapsedMilliseconds > nextAudioPlayMsec)
                {
                    warningSound.Play();
                    nextAudioPlayMsec += 2000;
                }
                ...
             }
        }

抜粋でないソースコードはこちら。 https://bitbucket.org/satofumi/hots_tools/src/cf889c6dc2389ea045709e29c03e4e7bf9093a75/hots_minimap_instructor/hots_minimap_instructor/MainWindow.xaml.cs?at=default&fileviewer=file-view-default

このコードでは、定期的に視線がミニマップの中にあるかをチェックした結果の IsLookingMinimap プロパティを利用して、「見てないね効果音」や「見たね効果音」を鳴らしてる。
定期的にポーリングしてるのが微妙によくないけど気にしないことにしたい。イベントトリガをがんがん使ったコードは私には読みにくいので。

で、ここまででとりあえずゲームで使えるレベルのツールにはなったので利用していこうと思う。
次回は、ゲームのロード中か死んでないかを判断するための処理をスクリーンショットから取得するあたりのコードを作成していこうと思う。

いい感じです!

HotS のミニマップみようツールの作成(2)

今回は Tobii Eye Tracking 4C から視線位置を取得するあたりを実装します。
で、作ったのがこれです。作ってみるとわかる。私は C# の勉強が不足している。 理解が Thread までで止まってて少し恥ずかしい。
https://bitbucket.org/satofumi/hots_tools/src/8548dbecc7af809faf053d7d173b2d73ce3afecf/hots_minimap_instructor/hots_minimap_instructor/EyeTracking.cs?at=default&fileviewer=file-view-default

まぁ、とりあえずこれで動くので良いことにする。気になったらまた修正すればいい。
次回は、この得られた視線情報を用いてミニマップの領域を見ているかどうかで警告音を鳴らすあたりを実装します。

HotS のミニマップみようツールの作成(1)

Heroes of the Storm というゲームが好きだ。好きだけど上手くない。
なので、上手くなるためのツールを作ろうと思う。
ゲーム画面のミニマップを見るのが重要だけど見てないことが多いので、ミニマップを5秒ほど見なかったら音を出して警告するツールを作る。

使うのは視線検出デバイスの Tobii Eye Tracking 4C で、.NET で C# なアプリケーシンを実装する。

仕様としては

  • ゲーム中にミニマップを5秒見ないことを検出したら警告音を数秒おきに鳴らす。
  • ミニマップを見ない状態からミニマップを見たら、いいね音を鳴らす。
  • ゲーム中とはゲームが開始して死んでない状態とする。

くらい。

まずは簡単なあたり、ゲームが始まったかどうかを検出するあたりから実装する。

最初の実装内容は

  • HotS のゲームが開始しているかを Path.Combine(Path.GetTempPath(), “Heroes of the Storm\\TempWriteReplayP1”) フォルダの有無で監視する。
  • ゲームが開始したら Tobii Eye Tracking 4C からの視線位置の取得を開始する。

を実装する。

で、とりあえずフォルダがあるかどうかを検出して状態遷移をし始めるあたりまで実装した。

https://bitbucket.org/satofumi/hots_tools/src/2a980fbeb6d7bec4c1ce739d84d4591b23390ec9/HotsMinimapInstructor/HotsMinimapInstructor/MainWindow.xaml.cs?at=default&fileviewer=file-view-default

いい感じだ。
次は、視線位置に基づいて音を再生するあたりを実装したい。