画面遷移のコントロール
なんか使うつもりはないけど拾い損なってる人形はムキになってしまいますよね、泣きながらピノキオ回っていたらA-91お迎え出来たのであとは熊だけ集めます、EX?何それ美味しいの?
その場しのぎでコードを書き連ねたせいで関数化する時期を逸した案件がずっと気になっていたので今回の手直しでやっつけてしまいます
ありがちな操作手順として
- ボタンをクリック
- 画面(状況)状況遷移待ち
- 遷移結果確認
みたいな操作がそこかしこに出てくる訳ですが、これを素直にクリック、時間待ち、画像探索、みたいな3行コードで実装すると長時間動作させていく過程で何かおかしくなってしまうのは自動運転あるあるかと思います
時間待ちに関しては十分に長い時間を設定すれば動作の確実性は増しますがクリックするたびに1分とか待つのかと言われると正直ちょっと勘弁いただきたいですし、そもそもクリックコマンドがうまく通らないことも稀に良くある話です
無駄な時間待ちは避けつつ、相手の応答があまりに遅ければコマンドを再送する一連の処理はこれまでに説明したかと思います(うろ覚え)が頻出処理なのでやっぱ関数化しないといけないなぁと・・・
procedure P_wait_image(Tgt_X, Tol_X, Tgt_Y, Tol_Y, Act_Msg, img_name, Pos_X, Pos_Y, Range_W, Range_H)
// Tgt_X, Tol_X クリックX座標、最大誤差
// Tgt_Y, Tol_Y クリックY座標、最大誤差
// Act_Msg クリック確認メッセージ
// img_name 探索画像パス
// Pos_X, Range_W 探索領域開始X座標、探索幅
// Pos_Y, Range_H 探索領域開始Y座標、探索高さ
// Pos_X, Range_W 探索領域開始X座標、探索幅
// ひとまずリトライ間隔10秒
tim = gettime() //タイマー初期化
repeat
ifb tim <= gettime() then //初回は問答無用でこっち
P_adb_BTN(Tgt_X + randomx(Tol_X), Tgt_Y + randomx(Tol_Y), randomx(100), Act_Msg)
tim = gettime() + 10 //タイマー再初期化
endif
sleep(1)
until chkimgx(img_name, NOXid, Pos_X, Pos_Y, Pos_X + Range_W, Pos_Y + Range_H, 1, 15, -1) //対象画面待ち
print img_name + " detected"
fend
初回コマンド送信とリトライ処理をループ内に1回表記したかったのでちょっと変則的になりましたが多分動くんじゃないでしょうか
これでちっとはすっきりするかしら
若干補足すると関数としての戻り値はありませんがループ終端のchkimgx成立で抜けてきますのでG_IMGX_X,Yは探索画像のHIT座標になります、なので次の手順呼び出しのTgt_X,Yにはこの探索結果に操作座標への補正(既出)を食わせて突っ込む記述を想定してます
誤差値(Tol_X,Y)はTPOで変わるかと思いましたので都度与えることにしました、面倒なら固定値にして引数から外してもいいでしょう