UWSC初心者用スレ
■ このスレッドは過去ログ倉庫に格納されています
UWSC初心者用スレです
わかってる人はこっち
自動化ツールUWSC使いよ集まれ21
http://egg.5ch.net/test/read.cgi/software/1533818531/
降臨される神々においては相手を人と思わず猿と思し召されるよう
何卒お願い申し上げます 質問です
(1)画像1を認識したらスタートして画像4をクリックするマクロA
(2)画像2を認識したらスタートして画像2をクリックするマクロB
(3)画像3を認識したらスタートする画像3をクリックするマクロC
(画像1〜3が同時に表示されることはなく、全てのマクロを常に起動しておきたい)
このようなプログラムを作成したいのですが、お知恵を貸してください
ttps://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11135040611
ここを参考に作成してみたのですが、(1)のマクロしか動作してくれません
https://i.imgur.com/0G5273Y.jpg >>56
IFBの括りが悪い
すべてが最初のIFBの中なのでその画像がある時以外は何も動かない たしかに1.bmpの1行とENDIFの1つを消したら2と3(4の画像が出たら4も)が動作しました
あとは添付の画像のように修正してみました
一見無事に動作しているのですがループが早すぎて気づいていないだけ…?
https://i.imgur.com/mnpJfXM.jpg CALLでの呼び出しについて教えてください
「マクロ1→マクロ2」の場合、マクロ2がループしていたらマクロ1に戻りませんよね?
いまはマクロ2の最後にマクロ1に戻るようにCALLを使用して、
「マクロ1→マクロ2→マクロ1」という処理にして動作させているのですが、
「マクロ1→マクロ2→マクロ1」の他に「マクロ3→マクロ2→マクロ3」や
「マクロ4→マクロ2→マクロ4」というように、呼び出し元に戻すにはどうすれば良いのでしょうか
それとも「マクロ1→マクロ2-1→マクロ1」、「マクロ3→マクロ2-3→マクロ3」のように別に作らないといけないのでしょうか >>59
>マクロ2の最後にマクロ1に戻るようにCALL
勝手に呼び出し元に戻るのでCALLはいらない
というかCALLは本来インポート/インクルードに近いもので関数のように再利用するものじゃない
処理をまとめて関数化するように、関数群をまとめたファイルをCALLすることで後は好きなように関数呼び出しが出来るようになる
その際関数化してない部分がcall時に実行されるから外部スクリプトの呼び出しのように使うことができるというだけ
a.uws
public INT_A
INT_A = 1
function A()
INT_A = INT_A + 1
fend
----
main.uws
call a.uws // <-a.uwsc全体が読み込まれINT_Aの宣言と初期化だけ行われ終了する(関数化部分は自動では実行されない)
A() // <-a.uws内の関数はmain.uws内で作ったのと同じようにいつでも使える
print(INT_A) // 同様にa.uws内のpublic変数は自由にアクセスできる(G_IMG_Xみたいに)
----
仮にA()の中でループ処理をしていて抜けたい場合は単にEXITで関数を終了すればいいだけのこと >>61
ありがとうございます
メインを作って各パターン毎にCALLで呼び出す…って形でしょうか
ゲームでマクロを勉強しているのですが、添付した画像のようなプログラムを作成してみました
宝箱の位置は固定ですがそれぞれクリックする場所が異なるため、このような記述にしてみました
問題なく動作はするのですが、
これだとひとつのuwsで行う処理が多すぎて実行されるのにタイムラグが発生してしまいます
何か良い改善策がありましたら教えてください
https://i.imgur.com/0G5273Y.jpg >>63
そじゃない、そういうことじゃねぇんだよ兄ちゃん・・・
UWSCの場合、CALLはメインスクリプトだかの先頭辺りに列挙しておく。
CALL 戦闘開始.uws // 関数「戦闘開始」を定義
CALL 戦闘終了.uws // 関数「戦闘終了」を定義
CALL 回復.uws // 関数「回復」を定義
:
という風にな。
CALLで参照するスクリプトは最低限、必要な変数や関数定義にとどめておく。
ちょうど他の言語で言うライブラリやモジュールの役割に当たる。
これでスクリプト全部がオンメモリにロードされる。
後は、メインスクリプトで定義した戦闘開始()、戦闘終了()、回復()を好きなように呼べ。
IFの中でCALLは使わない。
WHILE TRUE
IF CHKIMG(略
戦闘開始()
ENDIF
: CALLってそういう意味だったんですね…
今回の添付した画像のような感じであっていますか?
FUNCTIONはRESULTがどうたらこうたら出てきたのと>>61がまだ理解できなくて手こずってます
https://i.imgur.com/yikcDln.jpg まあ、要するにcallの位置にファイルの中身を丸ごとペーストするだけだからね
合っているかはまず期待通りに動いたのか、君にしかわからない
理解できないとか手こずってるとか言われても困る
こう書いたら何が起きた、期待通りにならない、こうしたいと具体的に書いてくれ
そして出来ればコードはコピペしてくれ、画像貼られても見にくいしこっちで動かせねーから
ついでに言えばいつか消えるので後から見る人の参考にならない
(差し支えない範囲である程度簡略化して実際に動くのが望ましい)
あと理解出来てないままいきなり組み込まない、問題が複雑化するよ
簡単なコードでfunctionの機能だけ、callの機能だけまずは確認しよう
その際、最初はchkimgみたいな特殊な動作する関数は使わない方がいい
(動かなくてこれ変ですかって書き込まれても画像や操作対象がないと再現できないから)
まあ、長々書いてしまったけどプログラム初心者なら躓くのは普通なので色々試してくれ 前回コードを記載して書き込みしたら、エラーが出て書き込めなかったので画像でアップしてました
zipにしてアップしてみました
ttps://17.gigafile.nu/1118-c64d3df20a4c37dbcd375a2808db916f7
実際>>63でも期待通りの動作はしており、CALLの指摘を受けて改めて>>65のように修正しても期待通りの動作はしています
個人的に現状で残る問題はメイン.uwsでループする箇所が多すぎて
>>65で言うと戦闘開始.bmpが表示されてるのに画像認識が遅れてしまうという点です
1つのuwsに全てを詰め込んでいたので遅れが出てしまうのかと思い
CALLを知ったのですが、結局これでも遅れることに変わりがなかったです
ただ>>61の記載されたように、戦闘開始.uwsの方に
FUNCTION 戦闘開始
目的の処理
FEND
として、メインを動かしたら「戦闘開始.uwsにRESULTが無い」とポップアップが出てきて動作がスタートしませんでした
そこで
PROCEDURE 戦闘開始
目的の処理
FEND
にしてみたら期待通りの動作はしているのですが、違いがわからずこれで問題ないのだろうか?ということでした つまり今の問題は
・スクリプトの動作が遅い(遅く感じる)
・functionとprocedureの違いが分からない
の二点ってことね
一つ目の問題はループ内でifを独立させているせいで、毎回頭から最後まで全てのif条件が働いている
つまり同時には一つしかヒットしないのに律儀に全部の画像を判定しようとして空振りしてので遅くなっている
対策は一つ目をifb、次以降をelseifにして最初のifbのブロック内に収める
そうするとn個目の処理した後、以後のifは飛ばす構造になる(そしてwhileでまた最初から判定)
##ifとifbの違いや動作を理解しよう##
応用としては頻出するものを最初に持ってきた方がトータルではやや早い
ただし結局はifbブロック内に大量にelseifでのchkimgがある時点で遅くなっていく
これはそもそもゲーム構造的に同時に判定すべきでないものを全て詰め込んでいるせい
簡単に言うとタイトル画面で戦闘開始の判定をしても意味がないしクエスト画面でタイトル画面のログインボタンの判定をしても意味がないよね
これも対策は出来るが長くなるのでヒントだけ
・まずはシーン(タイトル、クエストなど)を判定する為のメインループを作る
・各シーンごとの操作(画像認識)をまとめてループにする
ループ内というかifbブロック内になるべく空振りさせないように構造化させるのがポイント
これでも遅く感じる場合には、シーン内の画像認識をifbによる順次処理ではなく、スレッドによる並列処理にする必要がある
が、まあそれはまたやってみて遅いとか、スレッドやってみて詰まったら質問してくれ
次にfunctionとprocedureだけどこれは単に>>61では適当に構造のイメージで書いたのでresult書き忘れてるだけ
余計な混乱させてしまったなら悪いけど、正直に言えばそんなことで詰まるとは思いもしなかった…マニュアルとか見てる??
で、resultが何なのかはヘルプなりGoogle先生に聞いてもらうとして、多分懸念してる動作速度はどっちでも大差ない >>67
スクリプト見たんだけどCHKIMGとCHKIMGXが混在してるのはこの通りであってるの?
>>67の切り分けによると戦闘開始関数だけで時間が掛かってるってことだよね
どこで処理に時間が掛かってるかGETTIMEで計測したらどうか?
たぶんCHKIMGかCHKIMGXだとおもうんだけど
まずは戦闘開始.bmpが表示されたらPrintでなにか表示させるとかして
処理を小さく区切って満足行く結果が出たら次の処理につなげてという風に
問題を細かく見てったほうがいい
そこがクリアされてるなら
「戦闘開始.bmpが表示されてるのに画像認識が遅れてしまう」こんなことにはならない
まず戦闘開始だけを満足に動かすことを考えたほうがいい >>68
つい先日マクロについて知って、下記のHPを読みながら1つの問題が解決したら都度次へって感じでやってます
ttps://qiita.com/macro_no_deshi/items/dd3b3405123bad0cfe4a
まずゲーム内のどこでマクロに任せるべきなのかからスタートしてるのと、
プログラミングの知識がないので手探りになってしまっているのは申し訳ないです
>同時に判定すべきでないものを全て詰め込んでいるせい
ここは理解しているのですが、どこでどう判定させて区切るべきかわからずぐちゃぐちゃになってるのだと思います
・ダンジョン1で歩いて宝箱を回収していく
・ダンジョン1で歩き回れば敵と遭遇し戦闘が開始される
・戦闘が終わればリザルトがある
以上のようにダンジョン1で宝箱を探している間に敵は出てくるので戦闘開始と戦闘終了は必要なので、メイン.uwsの記述があのようになりました
(1)ダンジョン1を宝箱を回収しながら自動で踏破
(2)途中で敵に遭遇したら自動で戦闘開始、戦闘を終えたら(1)の続きに戻る
ちなみに最終的にはこのようにできれば良いなと思ってはいるんですが、まだまだ遠い未来です…
>>69
CHKIMGとCHKIMGXが混在しているのは、CHKIMGで認識できない画像だけをCHKIMGXで作成してます
ちなみにマクロは現状正しく動作しており、それぞれのマクロだけ動作させるなら開始も機敏です
説明が下手で申し訳ないのですが、>>68の言葉を借りるなら全てをセットにしたメイン.uwsの作り方が下手で、空振りが多いのだと思います どんな場合があってどの様な条件(画像、回数など)が必要なのか紙に描いて整理した方が良いですよ
uwscというより設計の問題です >>70
すまん、ダンジョン1.uws見てなかった
これはまずいわ、メイン.uwsで宝箱1〜6の画像検索してどれか見つかったら
宝箱()を呼び出してるけど、そこでまた宝箱1〜6の画像を全て検索してるじゃん
宝箱1を見つけたら宝箱1を開封する関数だけを呼び出さないと
あとメイン.uwsで戦闘開始と戦闘終了を画像検索してるけど
戦闘が始まってもないのに戦闘終了の画像を検索する必要ある?
言い方を変えると、戦闘終了してるかチェックするのは
戦闘開始を見つけてからでいいんじゃない?
その辺の動きももう一度整理したほうがよさそう >>70
まあとりあえず色んな人からアドバイス出たことだし、少し手を動かして頑張って
ちなみにやろうとしてるほぼ全自動でゲーム進めるってのは初学者にはかなり難しいテーマだよ、もはやゲーム設計するのと大差ないからね
コードだけ眺めてても解決しないので絵にしたりしないと無理じゃないかな >>73
>全自動でゲーム進めるってのは
>初学者にはかなり難しいテーマ
同意
単純なクリック連打じゃなくて
ゲームの内容を判断しながら分岐させるのは
ゲームのAIレベルだから難しい 今回も修正したuwsのファイルをアップしてみました
無事に動作はしていますが、変なところがあればご指摘いただければと思います
ttps://32.gigafile.nu/1027-bf28bd15518fed74ae750f229487ea8c8
悩み中.uwsというファイルがありますが、
同じ画像を認識したとしても処理は異なるようにするにはどうしたら良いのでしょうか
現在はSLEEPを使用して1回目の表示と2回目の表示の間隔を空けて強引に処理させてます
>>71
ある程度は整理できてるのですが、処理を開始するためにどこの画像を認識させようかの判断ができないんですよね
ダンジョンの背景とかだと使い回しで別のダンジョンと間違えられても困るし…
>>72
書き込んだあとちょうどその部分に変更を加えていました
おかげで処理は高速になったと思われます…(実感はある)
>>73
全自動というのは無理だと思っているので、移動以外は自動化できないかなって思ってます
一応今のところ8割はできてると思います >>75
>同じ画像〜
させたい処理が違うなら何かが違うんでしょとしか言えないが
画面の見た目類で判断しにくく、仮に交互に繰り返すならカウンタ/フラグ変数を持って切り替えるのはどうかな?
これに限らず全てchkimgで判断させるのは無理があるはず >>75
ボスの画像を認識した回数をカウントして処理を分ければいいんじゃない
で、パターンを戻したくなったらカウントをリセットすればいい
行動パターンがあまりにも多かったら大変だけど
ここからは今は重要なことじゃないし
処理が早くなるわけではないからわからなかったらスルーしてくれ
1つの行動を1つの関数にするのはいいんだけどファイルを分ける必要あるかな
例えばダンジョン1宝箱3とか他のダンジョンなりスクリプトで再利用する?
それぞれのファイルで毎回全く同じCALLや変数の初期化を
何度も書くのは無駄だし間違いの元になることもある
変数のスコープやProcedureやFunctionや値渡しについて知ればもっとよくなるとおもう 一部のbotが非常に高度なものであるのは間違いないけど。
ここの連中が作った全自動(笑)マクロなんてゴミがほとんどじゃないの。 とゴミが申しております
そういうのは本スレでやってね たかがUWSC作ったマクロしか組めない程度の人間のマクロ技術がゲーム制作やゲームAIと同じとはとても思えないわ。
まあ雑魚同士で自画自賛しあってればいいんじゃない。 といちいち初心者スレ監視してる雑魚が申しております
自称天才意識高い系プロは本スレで暴れててね 寂しがり屋さんなのかな?
本スレそれほど過疎ってるわけでもないのに
スレ分けてよかったかな今のところは ttps://17.gigafile.nu/1029-dbd9d6de3c7c9d32c382d1be973850e30
カウントについて調べていろいろやってみたのですが、
「ボス戦ターン1()」を繰り返したり、
「ボス戦ターン2()」まで行っても「ボス戦ターン1()」に戻ったりしてしまいます
カウントの処理について教えていただきたいです
それと、最後の部分にある「CALL」ですが
ttp://kobuji.me/tips/call/
ここを参考にしてみたのですが、このCALLの使い方はあっているのでしょうか?
(前回一番上に記載するやり方だと教えてもらいましたが…) >>85
カウント以前の問題が多すぎる
インデントを入れると自分がどれだけ変なコード組んでるかちょっと分かるかも? ■ このスレッドは過去ログ倉庫に格納されています