2021-01-24

SikuliXの勉強 FFRK ラビリンスダンジョン自動化実験

SikuliXの勉強のため、FFRK(FINAL FANTASY Record Keeper)のラビリンスダンジョンの操作を自動化してみました。いろいろ課題はありますが、以前投稿した汎用スクリプトで自動操作できました。

スクリプト

スクリプトは以前の汎用スクリプトそのまま。

Settings.MinSimilarity = 0.80
Settings.MoveMouseDelay = 0
Settings.ClickDelay = 0.4

IMGS = [
]

reg = Region(App.focusedWindow())
reg.highlight(1,"green")

while True:
	ms = reg.findAnyList(IMGS) 
	for m in ms:
		m.click()
		break
	sleep(0.5)


動作

使い方はIMGSに操作対象の画像を登録していくのみ。

同じ画面に複数の検索対象がある場合は、画像の並びを調整することで対応できました。

実際の流れは以下の動作を参照。



課題

現状のスクリプトでは1場面1クリックを想定しており、クリックすると場面が変わりクリックした画像がなくなる事を期待しています。なくならず残り続けるシーンだと永遠にその画像をクリックし続ける動きになります。

このため、1つの場面でクリック対象を順番に切り替えるような場面はやり方を考えなければなりません。

今回のFFRKの場合は、出撃するパーティを選択するシーンになります。一番消耗していないパーティを選択した後、Goボタンをクリックする処理になります。

クリックした画像の情報を残す(フラグを立てる)など実装すると実現可能ですが、コードが複雑化しそうです。

より簡単かつすっきりする方法を検討したいと思います。


2021-01-05

SikuliXでクリック間隔を調整する

SikuliXで操作するアプリケーションの中には、デフォルトのクリック速度(マウスダウンからアップまでの時間)だとクリックを認識できない場合があります。また、スマートフォンを操作する場合、タップやロングタップをしたいケースもあります。

これらの実現方法についてまとめます。


システム変数「Settings.ClickDelay」

クリック速度の微調整だけであれば、システム変数「Settings.ClickDelay」で調整できます。

# マウスダウンからアップするときの遅延時間 0.0 ~ 1.0(秒)
Settings.ClickDelay = 0.1

0~1秒の範囲で調整可能。1秒以上のクリックは次のmouseDown、mouseUpを使用したクリック処理を使うことで対応可能です。

タップ・ロングタップ処理

クリックを自由に調整したい場合、mouseDown、mouseUpを使用してクリック処理を実装することで実現可能。

# タップ処理 m:Match or Region オブジェクト sec:マウスダウン時間(秒)
def tap(m, sec):
	mouseMove(m)
	mouseDown(Button.LEFT)
	sleep(sec)
	mouseUp(Button.LEFT)

# タップ
def tap_s(m):
	tap(m, 0.05)

# ロングタップ
def tap_l(m):
	tap(m, 1.0)


# 使用例
m = find("1609741390982.png")
tap_l(m)
tap_s(m)

リモートでスマホ操作した時に作成した処理です。クリックメソッドを使わず、マウス移動、マウスダウン、アップを実装してタップとロングタップを実現しています。

2021-01-04

SikuliX 任意の場所をクリックする方法

 SikuliXで検索結果ではなく、任意の場所をクリックする必要があり、調べたのでメモを残します。

クリック機能などはRegionクラスのメソッドになります。なので、クリック対象の座標を指定したRegionのオブジェクトを作成することで任意の場所をクリックできます。

findなどで検索した結果は、Matchクラスのオブジェクトで返ってきますが、このMatchクラスはRegionクラスの派生のようです。


任意の場所をクリックする方法

Regionのオブジェクトを作成して任意の場所(50,50)の位置をクリックするコードは以下。

	
# Region(x座標,y座標,幅,高さ)
r = Region(50,50,1,1)
r.click()

クリック位置は矩形の中心になる模様。幅と高さ大きくするとその分ずれるのでピンポイント座標を指定する場合は、幅と高さを1に設定したほうがよさそう。