今回は、視線検出した結果に基づいてミニマップを見てないときに警告音を出力するあたりを実装します。
で、実装したメインのロジックはこのあたり。
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 プロパティを利用して、「見てないね効果音」や「見たね効果音」を鳴らしてる。
定期的にポーリングしてるのが微妙によくないけど気にしないことにしたい。イベントトリガをがんがん使ったコードは私には読みにくいので。
で、ここまででとりあえずゲームで使えるレベルのツールにはなったので利用していこうと思う。
次回は、ゲームのロード中か死んでないかを判断するための処理をスクリーンショットから取得するあたりのコードを作成していこうと思う。
いい感じです!