こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

UWSC 画像認識で条件分岐

画像Aが出てくるまで待ち画面をクリック、その後、画像Bが出てくるまで待ち画面をクリック。
画像Aが現れなければ、画像Bが出てくるまで待ち、画像をクリックする。
という文を書きたいのですが、うまくいきません。

画像Aはランダムで現れます。画像Aが現れた場合、画面をクリックしない限り、画像Bは現れません。

以下の文では画像Aが現れない限りはうまく回るのですが、画像Aが現れるとそこで止まってしまいます。どこがまずいのでしょうか。
何分この手のものエクセルぐらいしか触ったことがなく困っています。よろしくお願いします。
//
if chkimg("A.bmp")=true then
btn(left,0,100,100,50)
else
repeat
sleep(0.2)
until chkimg("B.bmp")=true
btn(left,0,100,100,50)
endif
//

投稿日時 - 2014-10-27 13:42:49

QNo.8804684

困ってます

質問者が選んだベストアンサー

> 以下のように記述してみたんですが

完璧じゃないですか!画像Aがクリックしたい目標物だったら、確かにG_IMG_X,G_IMG_Yを使うのが一番確実な方法です。これだと、もし画像Aの表示される場所が変わっても影響を受けませんから。ただG_IMG_X,G_IMG_Yは画像の左上隅を指しているため、個人的には気味が悪いと感じるので(すごいギリギリの場所をクリックしているわけだから)、4くらい足しています。画像がクリック目標に対して余白を持っている場合は、足す数が4では足りない場合もあります。

ちなみにG_IMG_Xを変数にコピーせずに使うことも可能なので、それでやると大幅に短く書けます。

REPEAT
SLEEP(0.1)
IF chkimg("A.bmp") Then BTN(left,0,G_IMG_X,G_IMG_Y,50)
UNTIL chkimg("B.bmp")
BTN(left,0,100,100,50)

> 私が質問文であげていたのでは、画像Aをチェックする文に繰り返し処理がかかって
> いなかったのですね。それで止まっていたんだと思います。

VBAだけ見てきた人が知ってる世界とUWSCはかなり異質なものなので、迷って当然と思います。VBAはある意味普通のVBと同じくイベント駆動型の言語だから、クリックイベントなどの中に処理を書いておけば、いちいちループで繰り返し見張っている必要がないのに対し、UWSCにはイベントの概念がなく、クリックもキー入力もスクリプトに書いた場所でしか判定されない、よって繰り返しにしないと一回しか見てくれない。またVBAだとマクロの最終行に来ても次の操作が来るまで待機するだけだけど、UWSCではスクリプトが終了する等。

投稿日時 - 2014-10-30 16:16:04

お礼

たびたびありがとうございます。
同じようなものかと思っていたら、ふとしたとこでつまづいていました。
これからも少しずつ勉強していきます!

投稿日時 - 2014-10-30 17:53:58

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(4)

ANo.3

回答No.2です。

> 画像Aが現れず、画像Bが現れることもあるのですが…。

うぐっ、その条件を考慮してませんでした…てっきり画像Bに必ず先立って、画像Aが表示される前提でやっていました。

最初の相談にあったスクリプトでうまくいかない理由は釈然としませんが、恐らく画像をクリックした後にその画像が消えることを確認する処理を入れれば、うまくいくと思います。私も今androidタブレットなのでUWSCが使えない状況ですが、以下のスクリプトで多分いけるんじゃないかなと。ただし画像AとBの両方が同時に画面に出ている瞬間があるようだと、うまくいきません。

While True
If GetKeyState(VK_ESC) Then Break //Escキーを押したらループを抜ける

Ifb Chkimg("A.bmp") Then //A.bmpが現れたか?
Btn(Left,Click,100,100,50)

//A.bmpが消えるのを待つ
While ChkImg("A.bmp")
Sleep(0.1)
Wend

EndIf

Ifb Chkimg("B.bmp") Then //B.bmpが現れたか?
Btn(Left,Click,100,100,50)

//B.bmpが消えるのを待つ
While ChkImg("B.bmp")
Sleep(0.1)
Wend

EndIf

Sleep(0.1)

Wend

投稿日時 - 2014-10-28 21:46:20

お礼

たびたびありがとうございます。
提示してくださったスクリプトでいけました。
私が質問文であげていたのでは、画像Aをチェックする文に繰り返し処理がかかっていなかったのですね。それで止まっていたんだと思います。

いろいろ悩んでたんですが、繰り返し処理の際、条件を2つ入れ込めばよかったんですねぇ。

画像が消えることを確認する処理は入れなくても大丈夫みたいです。
また提示してくださったものを参考にして以下のように記述してみたんですが、こちらも同様にうまく走りました!

REPEAT
SLEEP(0.1)
IF chkimg("A.bmp",)
x=G_IMG_X
y=G_IMG_Y
BTN(left,0,x,y,50) 
ENDIF
UNTIL chkimg("B.bmp")
BTN(left,0,100,100,50)

投稿日時 - 2014-10-30 02:05:01

ANo.2

クリックする場所が同じで良ければ、もっと安直にできます。

bmps="A.bmp"
While True
If GetKeyState(VK_ESC) Then Break //Escキーを押したらループを抜ける
Sleep(0.2)
If Chkimg(bmps) Then Btn(Left,Click,100,100,50) Else Continue
If bmps="A.bmp" Then bmps="B.bmp" Else bmps="A.bmp"
Wend

一目瞭然ですが、変数bmpsに画像のファイル名を入れておいて、画像を見つけてクリックしたら、bmpsの中身をもう片方の画像のファイル名にすり替えてしまうというやり方です。もしB.bmpをクリックしたら処理を終わらせたい場合は、以下のようにしてください。

bbmps="A.bmp"
While True
If GetKeyState(VK_ESC) Then Break //Escキーを押したらループを抜ける
Sleep(0.2)
If Chkimg(bmps) Then Btn(Left,Click,100,100,50) Else Continue
If bmps="A.bmp" Then bmps="B.bmp" Else Break
Wend

一応どちらもEscキーを押すと終了しますが、この見方では反応が悪くて連打しないと効かないことがあるので注意。

投稿日時 - 2014-10-28 12:51:14

お礼

ありがとうございます。
If Chkimg(bmps) Then Btn(Left,Click,100,100,50) Else Continue

Continueって処理せずにループの先頭にもどるんですよね。
これだと、画像Aが現れない限り、ずっとループすることにはならないのでしょうか

画像Aが現れず、画像Bが現れることもあるのですが…。
今、UWMCを使うことができない環境で、適当なことを言っていたらすみません。

投稿日時 - 2014-10-28 16:16:45

ANo.1

どれが「待ち画面」のクリックなのか、「画像」のクリックなのか、分からないので何ともいえません。

> btn(left,0,100,100,50)
> btn(left,0,100,100,50)

同じ処理ですが、「待ち画面」も「画像」も同じ場所に表示されるとかなら、画像気にせずにひたすらクリックで良いのでは?


> 画像Aが現れるとそこで止まってしまいます。

止まったように見えるけど、同じ場所をクリックし続けてるのでは?


> どこがまずいのでしょうか。

コメント入れたり、Printで処理内容を表示させたりしては?と思います。

投稿日時 - 2014-10-28 08:48:57

お礼

ありがとうございます。
画像Aがでたときは、画像Aをクリック、画像Bが出たときは待ち画面をクリックです。
画像Aの座標が、100,100なので、このように書いておりました。
処理内容を表示、試して見ます。

投稿日時 - 2014-10-28 15:50:43

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-