「ゲーム」カテゴリーアーカイブ

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

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

いい感じです!

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

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

Heroes of the Storm での Rank Match (2017-09-21)

Infernal Shrines で Azmodan 使って勝った。 火球が敵の Nazeebo や Kaelthas に命中すると逃げていくのが楽しい。
ただ、終盤は最初の Talent に Sieging Wrath を選んだせいで Azmodan の攻撃力がバーストせずに存在意義が減っていくのが体感できた。短い時間で終わるゲームだと Azmodan が大活躍しそうなのはわかった。

ゲーム終了時に「あなたのヒーローダメージは同じようなプレイヤーに比べて、このくらい多かった」って表示されるのが地味に嬉しい。

そう、勝って当たり前じゃないんだ。勝ったら楽しい気分になろう。

瀕死になっても逃げなかったり、どこまでも追撃するヒーローが多い今のランク帯では、Azmodan みたいに距離関係なく中ダメージを与えられるのは特に有効なのかもしれないと思った。

Heroes of the Storm やってます

のんびり Rank 戦をやってます。(今のランクは Silver 1)  ぶっちゃけていうと私は下手ですが、上手になるように思ったことを書き出していこうと思います。

まず、私のいる Silver 1 のランク帯は、なんだかんだ言ってみんな下手です。 もちろん私も下手です。(えっへん!)

検討内容

マップ: Tomb of the Spider Queen, Rank 戦 (solo)
味方: Murky, Kel’Thuzad, Stitches, Malfurion, Raynor(私)
相手: Malthael, Sonya, Brightwing, Abathur, Johanna
結果: Victory

ゲームの流れ

・ほぼ同じくらいか、少しレベル負けした状態でゲームが進んだ。
・中盤は相手 Malthael と Sonya が無双して集団戦で少し負け気味だった。
・後半は、味方が5人いるのに相手が個別に特攻してきたのを狩れたのと、レベル 20 になった Kel’Thuzad と Raynor で押し切って集団戦で全勝した。

リプレイを見ながら思ったこと

・Raynor(私)は、Malthael の E スキル(Death Shroud)を横に避けてかわそう。
・Mid のレーンで 3 vs 2 なのは別にいいけど、Bot の Murky が Help Ping 出したら誰か寄ってあげた方が良かった。(Top は Raynor)

反省点

・序盤、味方 Murky の Help Ping には、自分が行けないなら “some one go bot, plz” くらいは言うべきだった。
・このマップはオブジェクト参加の強制力が弱いので、相手が Abathur でレーン戦で1人数が多い有利を活かしつつ、Abathur の Locust Strain を優先的に倒しさえすれば EXP 負けせずに有利になるはず、と思ったんだけど、そう思い通りにはいかなかった。
・中盤、殺しにきた相手の Sonya, Malthael に、タイマンでの殴り合いで Raynor が勝てたりはしない。逃げよう

 

箱庭ゲームを作りたい

ユニットが仕事するのを眺めるのがメインのミニスケープゲームを作りたい。
で、いざどうゲームを作ればいいのか考えたときに、思った以上にゲームの作り方がわかってないのに気づかされた。 ゲーム作るの、むつかしいね。

少しずつでいいから実装していこうと思う。 作り方がわからない機能は、わかる方法で実装しようと思う。