- 締切済み
UWSCで、スクリプトの実行時間を一定にするには
ブラウザゲームで戦闘時にコマンドを入力するスクリプトを作ったのですが、 動かすと実行時間にばらつきがあり、1ターンの入力制限時間内に全員分のコマンド入力を終えられないことがあります。 作ったスクリプトをコピーしておきます。 (戦闘開始処理/省略) MMV(787,178,10) sleep(0.25) MMV(691,209,10) sleep(0.25) MMV(599,212,10) sleep(0.25) BTN(LEFT,CLICK,599,212,10) MMV(784,247,10) sleep(0.25) MMV(692,271,10) sleep(0.25) MMV(590,272,10) sleep(0.25) BTN(LEFT,CLICK,590,272,10) MMV(786,321,10) sleep(0.25) MMV(658,344,10) sleep(0.25) MMV(589,350,10) sleep(0.25) BTN(LEFT,CLICK,589,350,10) このスクリプトは 1:コマンドにマウスカーソルを合わせる 2:使用したいスキルにマウスカーソルを合わせる 3:スキルを使用する対象をクリック という手順を3キャラクター分行っていて、ラグなどに対応するためこれを5セット繰り返すようにしています。 sleepが実時間を基準に待機する関数だと聞いて使ってみたのですが、 制限時間である10秒以内に1セット完了できないことがあります。 どうすればスクリプトの実行時間を一定にできるのでしょうか?
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- neKo_deux
- ベストアンサー率44% (5541/12319)
> と動作の間隔を極端に短くしてもゲームが反応すること、 取りあえず、動作するならOKってしちゃっても良いかも。 Windows標準のメニューだと、マウス移動だけではすぐにポップアップしませんから、そのゲーム独自のメニューなのでしょう。 素早く操作しても確実にポップアップする作りなのか?とか、見極める必要はあると思います。 また、ゲームのシステムが不明瞭ですが、時間を決めずに逐次捜査結果を確認する方法だと、 ・入力が間に合わないとデメリットがある ・間に合わない場合はキャンセルの操作なんかすればそのデメリットは避けられる とかなら、入力状況と経過時間を見てキャンセルするとかって判断が可能です。 > マウス移動でスキルリストなどがポップアップする仕様ですが、 > リストが半透明で背景も場所によって変化するので、画像認識による処理は難しいです。 UWSCのChkImg関数は透過色も使えますし、そのスキルリストに枠なんか付いてるなら枠の色は背景に関係なく前景に表示される場合が多いし、他にも、 スキルリストの表示予定位置の画像を保存 マウスを移動 繰り返し 保存している画像とリスト表示予定位置の画像を比較 変化していればリストが表示されたと判断 とかって手もあります。(背景がアニメーションしていなければ…。)
- mindatg
- ベストアンサー率48% (110/227)
ゲーム名分かればテストできるんですが、とりあえず MMV(787,178,1000) MMV(691,209,250) MMV(599,212,250) BTN(LEFT,DOWN,,,100) BTN(LEFT,UP,,,100) MMV(784,247,1000) MMV(692,271,250) MMV(590,272,250) BTN(LEFT,DOWN,,,100) BTN(LEFT,UP,,,100) MMV(786,321,1000) MMV(658,344,250) MMV(589,350,250) BTN(LEFT,DOWN,,,100) BTN(LEFT,UP,,,100) MMV間のスリープは不要です。MMVの実行待ちで時間調整してください また、CLICKを確実にボタンを押し下げ押し上げするようDOWN-UPに変更しています。経験上CLICKでは反応しきれない場合が多々あります。 クリック後、ブラウザ側(ゲーム側)が超反応で次の応答待ちになることは多分無いです なので、クリックした後に次のマウス動作まで1秒の実行待ちとしています。 これで1周5秒(5100ms)になります。 これとは別に うまくポップアウトが表示されない場合は、マウスの動きをトレースし、中間地点を挟むといいかもしれません (例)座標100,100→300,200 を 座標100,100→200,100→300,100→300,200
- neKo_deux
- ベストアンサー率44% (5541/12319)
> 3秒で実行する処理のはずなのに4~5秒掛かっているのは気になりますが、 処理自体にかかる時間と、 | BTN(LEFT,CLICK,599,212,10) | MMV(784,247,10) の末尾のパラメータで指定している「10」は実行までの待ち時間(ミリ秒)なので、全体で0.1秒ちょいにはかかる事になっています。 MMVを10回繰り返す、Printで時刻表示ってのを繰り返し実行させると、自分の環境では1秒間に250回実行されたので、MMV10回すると1/250秒程度はかかる計算ですし。 -- > しかしそれでも全滅していたので、マウスの動きにゲームが反応しなかった場合がありそうです。 > これを防ぐにはどうすればいいのでしょうか。 一般的には、決まった時間待つって事はせずに、操作に対する応答をチェックして逐次実行します。 ゲーム内容が不明瞭なのでスクリプトから想像できる動作ですが、 1) 最初のマウス移動の操作で、メニューがポップアップするなどの応答がある。 2) メニューがポップアップしているのを確認してから、次のマウス移動を行なう。 って事を繰り返せば、決まった時間待つって事をせずに済みます。 上の例でのメニューが表示されたかどうかの確認だと、ChkImg関数で画像を確認とか、PeekColor関数で色を確認とかって事を行ないます。 他の手としては、キーボードで操作すると、Window標準のメニューなんかはスムーズに操作出来る場合があります。 -- > 0.4秒にしたところ、今度は10秒以内に1セット分の入力が間に合わないようになってしまいました。 ブラゲーなんかで入力時間が10秒しかないってのは結構厳しい気がしますが、手で操作した場合には、操作ミスがない限り確実に間に合うような操作なんでしょうか? 最速で手入力しても間に合わないような状況だと、ツール使っても厳しいと思います。
- neKo_deux
- ベストアンサー率44% (5541/12319)
> と分までしか出力されていませんでした。 > 秒まで出力するにはどこをいじればいいですか? デフォルトだとそうでした。 スクリプトの先頭に、 OPTION LOGFILE=3 を書いといてください。 他の方法だと、 Print GetTime() + " 1セット目入力完了" とかってすると、2000/01/01からの経過秒が一緒に表示されます。 時刻に直すのはもう一手間いりますが、秒の経過を確認するだけならこんなので十分かも。
補足
sleepの時間を0.3秒にして、ログに記録してみました。 13/10/15 11:22:18 1セット目入力開始 13/10/15 11:22:22 1セット目入力完了 13/10/15 11:22:27 2セット目入力完了 13/10/15 11:22:32 3セット目入力完了 13/10/15 11:22:35 4セット目入力完了 という感じで、3秒で実行する処理のはずなのに4~5秒掛かっているのは気になりますが、 極端に動作が遅くなることはありませんでした。 しかしそれでも全滅していたので、マウスの動きにゲームが反応しなかった場合がありそうです。 これを防ぐにはどうすればいいのでしょうか。 sleepの時間を増やせば確実に入力できるのかもしれませんが、 0.4秒にしたところ、今度は10秒以内に1セット分の入力が間に合わないようになってしまいました。 (そもそも、ゲーム側での制限時間が毎回きっちり10秒というわけではないかもしれません)
- neKo_deux
- ベストアンサー率44% (5541/12319)
> カーソル移動から次のカーソル移動まで明らかに1秒以上かかっていました。 であれば、ログにも時刻が記録されるので、 13/10/14 12:43:16 1セット目入力完了 13/10/14 12:43:19 2セット目入力完了 13/10/14 12:43:22 3セット目入力完了 13/10/14 12:43:40 4セット目入力完了 ←ここで時間かかってる 13/10/14 12:43:44 5セット目入力完了 とかって風に、確認できるはずです。 UWSCの処理が遅延してるって確認出来るなら、その原因に対する対策を実施とか。 ・余計なプログラムは停止。 ・タスクマネージャでUWSCの優先度を変更。 ・無料版で出来たかわかりませんが、Exeを作成。 ・スクリプトでかかった時間を確認して、処理を変更なり処理中断なり。
補足
PRINT文で表示させた後ログを確認してみましたが、 13/10/14 14:15 1セット目入力完了 と分までしか出力されていませんでした。 秒まで出力するにはどこをいじればいいですか?
- neKo_deux
- ベストアンサー率44% (5541/12319)
> 1セット約3秒、5セット約15秒で完了するように組んだはずなのですが、 > 観察してみると1セットの実行に10秒以上かかってしまうケースがあるのです。 ゲームの動作 1セット目の入力受付 | |UWSCの動作 |1セット目の入力開始 || ||3秒 || || |入力が速すぎて、全部の入力が受け付けられずに終了 | |10秒経過 | |2セット目の入力開始 || 1セット目の入力受付終了 【UWSCは2セット目の入力してるが、1セット目の入力が完了していないように見える。】 2セット目の入力受付 || || … とかって状況では? -- 1セット分の入力をどうやって確認しました?ゲーム画面? 1セット分の入力ごとに、 Print "1セット目入力完了" なんかのログを表示して、ログで確認しては?フルスクリーンのゲームだとログウィンドウ見れませんが。
補足
このスクリプトは何度も実行していて、 9割程度は計算通り正確に実行してくれるのですが、 稀に実行が極端に遅くなることがあるのです。 (入力失敗=全滅なので入力失敗があると確実にわかる) 普段はタイマーで定期的に動かしているので実際に確認したのはまだ1回だけですが、 カーソル移動から次のカーソル移動まで明らかに1秒以上かかっていました。
- neKo_deux
- ベストアンサー率44% (5541/12319)
> 制限時間である10秒以内に1セット完了できないことがあります。 > どうすればスクリプトの実行時間を一定にできるのでしょうか? 質問文のスクリプトは、一定の実行時間で実行されるようになっています。 ラグがあるのに一定時間で実行してるからダメなのでは? 例えば、 ・メニューが表示される前にその下のサブメニューにカーソル合わせたり。 ・画面が切り替わる前にクリックしたり。 ・メニュー項目が表示される前に背景をクリックしたり。
補足
戦闘開始時にラグが最大3秒程度発生するのを考慮して、3キャラ分の行動入力を5回繰り返すようにしています。 1セット約3秒、5セット約15秒で完了するように組んだはずなのですが、 観察してみると1セットの実行に10秒以上かかってしまうケースがあるのです。
補足
さらに色々ためしたところ、スクリプトを MMV(787,178,0) sleep(0.01) MMV(691,209,0) sleep(0.01) MMV(599,212,0) sleep(0.01) BTN(LEFT,CLICK,599,212,0) と動作の間隔を極端に短くしてもゲームが反応すること、 13/10/16 05:15:28 1セット目入力開始 13/10/16 05:15:32 1セット目入力完了 13/10/16 05:15:34 2セット目入力完了 13/10/16 05:15:35 3セット目入力完了 13/10/16 05:15:36 4セット目入力完了 のようにゲームで入力処理が行われる1セット目の実行時間が他より長くなることを確認しました。 1ターン目の入力時間が7秒程度しかない場合もありますが、手作業なら2,3秒余ります。 マウス移動でスキルリストなどがポップアップする仕様ですが、 リストが半透明で背景も場所によって変化するので、画像認識による処理は難しいです。