アプリビレッジ

おすすめのゲーム・スマホアプリの情報やストーリーなどの濃い話(ネタバレ含む)、面白い口コミまでもひっそりと公開中!

【UWSC】マクロで同じコードが続く場合の省略方法【FUNCTION(PROCEDURE)】

公開:2022年02月08日(最終更新:2022年02月18日)

マクロが同じコードばかりが続いて、見づらいし、修正もしづらいわ。同じ処理をまとめる方法はないかしら?

今回は「同じコードを一つにまとめる」という問題を解決します。

例えば、今まで紹介してきた方法でUWSCの画像認識のマクロを作ると――

IFB CHKIMG("画像ファイル")
SLEEP(0.01)
BTN(LEFT, CLICK, G_IMG_X+10, G_IMG_Y+10)
ENDIF

がたくさんになってしまいます。

画像で認識する場所が出る度に、上記のコードが追加されるので当然です。とはいえ、別に動作にも問題はありませんし、少ないコードなら気にもなりません。

でも、認識するのが10や20と増えていくと、だんだんと見づらくなっていきます。

もしも、『画像ファイル』の部分だけが違うなら、一つにまとめられないかと思うなら、今回の記事が役に立つはずです。

CHKIMG("画像ファイル") or CHKIMG("画像ファイル2") or CHKIMG("画像ファイル")

IFBの部分をまとめてしまいたくなりますが、画像が見つからないと座標が消えてしまうため、最後の数字しか残りません。UWSCの画像認識では個別に条件式(IFB)を作っていく必要があります。

というわけで、今回はたった一行だけで、同じ動作を繰り返すことができる「FUNCTION(PROCEDURE)~FEND」を紹介します。

FUNCTION(PROCEDURE)とは?

FUNCTION(PROCEDURE)は関数を自作できるという便利なプログラムです。

わかりやすく言うと、さきほどの「IFB CHKIMG("画像ファイル")~ENDIF」の中身を、自分で作った「img_click()」などの関数を使って一文でまとめられます。ソースコードも短縮化でき、見やすくなり、メチャクチャ便利ですよね。

FUNCTION~FENDとPROCEDURE~FENDは基本的に同じもので、戻り値を扱える分だけ、「FUNCTION~FEND」が優秀だと覚えてください。

戻り値を別の場所で使うような高度なコード(ギャグではありません)を必要とする場合には、「FUNCTION~FEND」を使いましょう。

「FUNCTION~FEND」の間に「Result = 戻り値を指定」をするだけです。ゲームマクロの省略にしか使わないのであれば、「PROCEDURE~FEND」だけで問題ありません。

FUNCTION(PROCEDURE)を使う前に

FUNCTION(PROCEDURE)を使う際に、もっとも気をつけて欲しいのは別ファイルに記入すると言うことです。

今まで作ったマクロファイルにFUNCTION(PROCEDURE)を追加しても、処理がおかしくなるだけで使えません。必ず別ファイルを作ってから「call ファイル名」で呼び出します。※ファイル名は任意でOK。拡張子のUWSまで入力するのを忘れずに!

「任意のファイル名.UWS」を作ったら、その中にFUNCTION(PROCEDURE)を記載していきます。

「任意のファイル名.UWS」を読み込むのはどこでも構いませんが、読み込む前に関数を使用するとエラーになりますので、なるべく早く読み込んで下さい。最初のACWのあとにでも「call 任意のファイル名.UWS」と、入れておきましょう。

つまり、今回はFUNCTION(PROCEDURE)を記載する「任意のファイル名.UWS」と、実際にマクロを組んでいる「マクロファイル.UWS」の二つに手を加えて変更していきます。

FUNCTION(PROCEDURE)の使い方

「任意のファイル名.UWS」を作り、マクロファイルで呼び出すことができたら、あとはFUNCTION(PROCEDURE)を「任意のファイル名.UWS」の中に書き込むだけです。基本となる形は以下の通り。

Function img_click() //ファンクション名
定型処理するコード
Result = 戻り値を指定
Fend

Procedure img_click() //プロシージャー名
定型処理するコード
Fend

FunctionがResultを必要とする分だけ、長くなっています。ファンクション名とプロシージャー名は自分がわかりやすい任意の名前で構いません。

Functionを呼び出す場合には、Resultで戻り値を設定した上で、「a=img_click()」などと変数で呼び出さなければならないので面倒です。

Procedureならマクロファイル側に「img_click()」と書くだけで動かせます。画像認識の簡略化だけなら、簡単に使えるProcedureで問題ありません。

FUNCTIONとPROCEDUREでどちらを使えばいいか分からないときは、処理したプログラムをもう1度、マクロ側で処理が必要かどうかで考えるとわかりやすいですよ。

そのまま表示するだけならPROCEDURE。値を取り出して、別の動作に使いたいならFUNCTIONになります

今回は画像クリックの簡略化ですので、PROCEDUREの名前を「img_click()」にしました。名前をつける際に気をつけて欲しいのは、同じ名前を使わないことです。

上記例では見やすいように「img_click()」と2つとも同じ名前にしていますが、同じ名前があると「多重定義」でエラーになるので、被らないように気をつけてくださいね。

FUNCTION(PROCEDURE)の応用

FUNCTION(PROCEDURE)の使い方がわかったところで、画像認識の同じコードを書き換えていきましょう。ここで一つ問題が出てきます。上記の「img_click()」だけだと画像認識した座標(変数)をFUNCTION(PROCEDURE)側が受け取ってくれません。

FUNCTION(PROCEDURE)で扱うためには、もう一手間必要になります。そこで出てくるのがファンクション名やプロシージャー名の後ろにある「()」カッコの部分です。

このカッコの中に変数を指定すれば、別ファイルでもその値を使用できるようになります。UWSCの画像認識には、G_IMG_X(画像の横座標)とG_IMG_Y(画像の縦座標)が使われていますので、「img_click(G_IMG_X,G_IMG_Y)」とすれば送信はOKです。

あとは受け取る側であるFUNCTION(PROCEDURE)の方も変更を加えます。

「call 任意のファイル名.UWS」の「img_click()」を「img_click(G_IMG_X,G_IMG_Y)」に変更してください。

Procedure img_click(G_IMG_X,G_IMG_Y)
BTN(LEFT, CLICK, G_IMG_X+10, G_IMG_Y+10)
Fend

これでマクロファイルから得た座標情報をFUNCTION(PROCEDURE)で処理できるようになります。

FUNCTION(PROCEDURE)を理解したら実際にマクロを書き換えよう

本サイトで紹介しているゲーム自動化の画像認識を使われている方のマクロファイルは、以下のようになっていると思います。

IFB CHKIMG("画像ファイル名")
BTN(LEFT, CLICK, G_IMG_X+10, G_IMG_Y+10)
ENDIF

これの「BTN(LEFT, CLICK, G_IMG_X+10, G_IMG_Y+10)」を「img_click(G_IMG_X,G_IMG_Y)」に変更しましょう。

IFB CHKIMG("画像ファイル名")
img_click(G_IMG_X,G_IMG_Y)
ENDIF

これで「任意のファイル名.UWS」の中にある、img_click(G_IMG_X,G_IMG_Y)の中身が実行するようになります。

G_IMG_XやG_IMG_Yの座標指定が+10以外になっている部分は、適宜、img_click2などの新しい名前を作って追加していきましょう。「任意のファイル名.UWS」をいじるだけで、すべての画像認識を変更できるのは素晴らしいですよね。

保守や管理がめっちゃ楽になりますので、ぜひ使ってみてくださいね!

FUNCTION(PROCEDURE)の便利な使い方

FUNCTION(PROCEDURE)を使えば、便利になることは他にもあります。

例えば、今回作った「任意のファイル名.UWS」を別のゲームのマクロで呼び出せば、手軽に画像認識の簡略化ができます。さらにマクロを作る上で毎回入力しているものを入れておけば、「任意のファイル名.UWS」を呼び出すだけで、設定完了です。色々なものを簡略化できますよね。

ウィンドウの設定など、変数を利用する場合にはPROCEDUREではなく、FUNCTIONを使用することになります。

例として、モンストの『手軽に運極を量産できるマルチ周回の自動化マクロ!』で紹介したウィンドウ枠の座標指定で説明しますね。

id = GETID(GET_ACTIVE_WIN)
x1 = STATUS(id, ST_X) //始点X座標を返す
y1 = STATUS(id, ST_Y) //始点Y座標を返す
x2 = x1 + STATUS(id, ST_CLWIDTH) //終点X座標を返す
y2 = y1 + STATUS(id, ST_CLHEIGHT)//終点Y座標を返す

こちらをFUNCTION化すると、以下のようになります。

Function begin
id = GETID(GET_ACTIVE_WIN)
x1 = STATUS(id, ST_X)
y1 = STATUS(id, ST_Y)
x2 = x1 + STATUS(id, ST_CLWIDTH)
y2 = y1 + STATUS(id, ST_CLHEIGHT)
dim box[] = x1, y1, x2, y2
RESULT = Slice(box,0,Length(box)-1)
Fend

ちょっと長いので、ビビってしまいそうですが、見るべき点は「dim box[]」以降の2行だけですね。

まず「dim」は配列を作る際に必要になります。今回はマクロファイルに持ち越したい変数が「x1, y1, x2, y2」の4つあるため、「dim」と入力しなければなりません。まあ、2つ以上の変数を使う場合には、必須だと覚えておきましょう。

「box[]」は配列の名前です。なんでも構いませんので、自分が覚えやすいものにしてください。

「RESULT」は先ほども言いましたが、「Function」を使う上で避けて通れません。ここに入れたものをマクロファイルで呼び出せます。逆に言えば、Functionでどれだけ長いプログラムを書いても「RESULT」に運んでもらわないと使えないと言うことですね。

Slice関数がどんな動きをしているのかというと――

第一引数(box)に指定した配列変数の
第二引数(0)に指定した場所(添え字で指定)から
第三引数(Length(box)-1)で指定した場所(添え字で指定)までを配列として返す

つまり、配列の最初(0)から配列の最後(length関数を使って求める)までをRESULTにいれることで、戻り値が配列になるというわけです。

まあ、わかったようなわからないようなそんな感じだと思いますので、このまま覚えておけば問題ありません。「Slice(box,0,Length(box)-1)」のboxとなっているところを、自分がつけた配列名に変更するだけです。

ここまでできたら、あとはマクロファイルで呼び出しましょう。

dim a = begin()

dimは配列前のお約束で、aという変数に「begin()」の配列を入れます。これでaという変数には「x1, y1, x2, y2」の値が順番に入った配列となっています。値を呼び出すには、[]を使いますが、注意して欲しいのは、0からカウントするということです。

つまり、「a[0]」がx1、「a[1]」がy1、「a[2]」がx2、「a[3]」がy2となります。実際に使用する場合には、画像認識のところで、以下のように使います。

IFB CHKIMG("画像ファイル名",0,a[0], a[1], a[2], a[3])

なんだか説明が長くなってしまいましたが、これを入れておけば、パソコンのモニター領域がめっちゃ広くても、ゲームウインドウだけを検索可能です。認識にかかる時間を大幅に短縮できる場合もありますので、検索に時間がかかる場合には、ぜひ試してみてくださいね。

FUNCTION(PROCEDURE)をCLASSでより便利にしよう

FUNCTION(PROCEDURE)は便利ですが、プログラムが大きくなっていくと、今度はFUNCTION(PROCEDURE)が至る所に使われて、どれがどれなのかわからなくなってしまいます。「imgclick()」などの安易な名前だと、クリックするパターンが複数ある場合には意味不明ですよね。

このような状況を防ぐために、関数の枠に名前をつけることができます。それが「Class~EndClass」です。

Class class_name
PROCEDURE img_click()
//プログラムの内容
FEND
EndClass

「class_name」はわかりやすい任意の名前でOKです。初期設定で使うものやクリックで使うものなど、自分であとで見てわかる名前にしてください。

呼び出し方も簡単で、上記の例で言うと「class_name.img_click()」になります。classの中にはいくらでもFUNCTION(PROCEDURE)を追加可能です。

ClassはFUNCTION(PROCEDURE)がどんな動きをするかでまとめていくと、後日保守がやりやすくなりますよ。

FUNCTION(PROCEDURE)で省略まとめ

FUNCTION(PROCEDURE)を使った省略化はいかがだったでしょうか?

ゲーム自動化をする上でもっと大事なのは、作った後の保守になります。スマホアプリは毎週のようにアップデートされ、その度に画像が変わったり、UIが変更になったりと、せっかく作ったマクロが動かなくなることは日常茶飯事です。

数日周期で変わるなら、面倒と言うだけで修正作業に支障はあまりありません。でも、何ヶ月も前に作ったものを修正するとなると、大体、どれがなんなのプログラムだったのかわからなくなっています。

3日見ないコードは他人のコード」と言うことです。

ある程度マクロを組めるようになったら、将来の保守も考えておきましょう。

今回紹介したFUNCTION(PROCEDURE)を使えば、画像を入れ替えるだけですので、保守の手間はかなり省けるようになるはずです。ぜひ、この機会にFUNCTION(PROCEDURE)を使った省略化を覚えてくださいね。

FUNCTION(PROCEDURE)を覚えれば覚えるほど、UWSCがもっと便利になっていきますよ!

前の記事

次の記事

あなたにおすすめ

よく読まれている記事

同時に読まれている記事

書き込みはこちらから