satofumi のすべての投稿

タワーディフェンスゲームを作る(3)

今回は、RallyToFlag (移動先を示すフラッグ)に味方ユニットが移動するあたりを実装します。敵ユニットが移動するあたりは実装済みなので、そのあたりを参考にすればいいかなと思いながら実装開始です。

思ってたよりも修正点が多くて実装に時間がかかった。
「ああなってるコードをこう修正しよう」って具体的な実装が思い浮かばないときには、楽観的な見積もりになりがちだよなと思った。

ともあれ、とりあえず動作するようになった。

気づいた点

  • 目的地まで移動できないときの挙動がおかしい。(想定外)
  • 兵舎占拠の進捗が表示されない。(実装したはずなのに)
  • ゲームの途中で占拠した兵舎の目的地が (0, 0) になってる。

まぁ、このあたりは見直せば修正できると思うのでチケット管理システムに登録しておく。

次は、敵と味方が互いに攻撃するあたりを実装していきたい。

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 プロパティを利用して、「見てないね効果音」や「見たね効果音」を鳴らしてる。
定期的にポーリングしてるのが微妙によくないけど気にしないことにしたい。イベントトリガをがんがん使ったコードは私には読みにくいので。

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

いい感じです!

ボイスチェンジャー作成(2)

ボイスチェンジャーというか、誰かの声に似るようにするのを「統計的声質変換」と呼ぶらしい。このあたりについて調べてみる。

読んだブログ記事

  • http://kivantium.hateblo.jp/entry/2015/12/19/000631
  • http://sesenosannko.hatenablog.com/category/%E7%B5%B1%E8%A8%88%E7%9A%84%E5%A3%B0%E8%B3%AA%E5%A4%89%E6%8F%9B
  • http://r9y9.github.io/blog/2014/11/12/statistical-voice-conversion-code/
  • https://www.slideshare.net/NU_I_TODALAB/ss-76323512

ブログを読んだ感想としては「専門用語が多いですね」「思ってたよりも大変そうですね」「みなさん楽しそうですね」だったので、私もこれら記事にある内容をなぞっていこうと思います。まずはブログ中の専門用語がどういう意味なのかの概略がわかるように調べていこうと思います。

具体的な作業については次の記事でやっていく予定です。
とりあえず、適当でいいんで音を変質させたりしてみたいです。

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

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

タワーディフェンスゲームを作る(2)

今日は、クリックしたさきに移動先を示すフラッグを表示するあたりを実装します。
フラッグ自体は少し前に Cube, Sphere, Cylinder を駆使して作った。

で、建物を右クリックした後にフィールド上を左クリックすると、そこに移動先の旗が配置できるようになった。やったぜ!

次は、味方ユニットを移動目標に移動させるあたりを実装したい。
いい感じだ。

HotS のリプレイを可視化するツール(1)

Heroes of the Storm のリプレイファイルを可視化したいなと思っている。
X 軸に時間、Y 軸に各ヒーローのマップ上の Y 位置をプロットしたグラフを作ったらリプレイの雰囲気がわからないかな? と思ったので作って試してみる。

最終的には Web ページでグラフを表示できればいいと思うけど、まずは CSV ファイルにデータを出力して、それを外部ツールで表示して雰囲気を確認しようと思う。

Heroes of the Storm のリプレイファイルの解析には
https://github.com/Blizzard/heroprotocol
この heroprotocol という Blizzard 提供の Python ライブラリを利用します。

で、ヒーロー位置のマウスの位置とかから計算しないといけない、気がする。
よくわからない。次は、もう少しデータを読みこむあたりをやろうと思う。

ただ、MinionXP, CreepXP, StructureXP, HeroXP は定期的に出力されているので、これをグラフ化するのは簡単そうだ。

タワーディフェンスゲームを作る(1)

タワーディフェンスゲームを作っています。純粋なタワーディフェンスではなく、少し RTS 要素を加えたようなゲームにしたい。今は、自ユニットを操作するための入力処理まわりを作成中。

現在の進捗はこんな感じ。

操作まわりを作り直したら、ユニットの移動先を指定できるようになる。
そうすると、基本要素は実装できたことになる。がんばりたい。

 

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

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

ボイスチェンジャー作成(1)

VTuber をやってみようと思って既存のボイスチェンジャーを調べてみた。
そしたら自分でも作ってみたくなったので、作ってみる。

まずは、マイクの音を wav ファイルに出力するプログラムを作ろうと思う。
開発言語は .NET の C# で、マイクは手持ちの UAB-80 を使う。

NAudio を使うことにしたので nuget でインストールする。

NAudio のページに録音のサンプルがあったのでそれを元に Console アプリを作る。
https://github.com/naudio/NAudio/blob/master/Docs/RecordWavFileWinFormsWaveIn.md

で、こんなソースコードでマイクからの入力を wav ファイルとして録音できた。NAudio すごい便利。

    class Program
    {
        static void Main(string[] args)
        {
            var waveIn = new WaveInEvent();
            var writer = new WaveFileWriter("output.wav", waveIn.WaveFormat);

            waveIn.DataAvailable += (s, a) =>
            {
                writer.Write(a.Buffer, 0, a.BytesRecorded);
                if (writer.Position > waveIn.WaveFormat.AverageBytesPerSecond * 30)
                {
                    waveIn.StopRecording();
                }
            };

            waveIn.RecordingStopped += (s, a) =>
            {
                writer.Dispose();
                waveIn.Dispose();
            };

            Console.WriteLine("Start");
            waveIn.StartRecording();

            System.Threading.Thread.Sleep(5000);

            waveIn.StopRecording();
            Console.WriteLine("Stop");
        }
    }

次は、録音した Wave ファイルのデータを可視化して、他の人の声と比べてみようと思う。

マスコットアプリ文化祭 2017 への参加

気楽に参加できるのと自分への〆切になるので毎年 マスコットアプリ文化祭 に参加しています。 そして、毎年のことなのですが「何作ればいいんだよ」と思ったりします。 もっと自由な発想力がほしいです。

とりあえず、思ったことを書いていこうと思います。

マスコットアプリ文化祭

まず、これが今年のロゴです。

ロゴの後ろにキャラクターが描かれてますね、とても可愛らしくて私は好きです。
ただ、このキャラクター達はここだけの登場で、協賛キャラクターでも素材配布もないのが私を悩ませます。

「協賛キャラクターは後から増えるかもしれないし、人数も多いからオリジナルキャラクターを描きましょうよ」

っていう大人の会話があったんだろうか、などと思わされました。
そもそも「マスコットアプリ文化祭」というタイトルなのに、協賛マスコットでなくても参加可能だし、アプリでなくても作品応募可能なので、深く考えなくていいんだよー、と思うことにしました。


マスコットアプリ文化祭 Q&A ページより

で、各協賛サイトをめぐりながら思ったことを書くのは、また次の記事にします。