おっさんゲーマーどっとねっと

「黒い砂漠」をはじめ、PCゲームやゲーマー向けの情報をお届けするブログです。記事には商品やサービスのPRを含みます。

G13rで覚えるLUAスクリプト:第2回~マウスカーソル位置の取得と実装~

      2016/12/02

前回は「特定のキーを押すとマウスクリックをする」というスクリプトをご紹介しました。何となく読めるようになりましたでしょうか?

今回は、マウスクリックしたい位置を取得し、その位置をキーに設定してみましょう。

GetMousePosition関数

LogicoolのG-series LUA APIで使える関数に、GetMousePositionというものがあります。

これを使うことで、現在のマウスカーソル位置のX座標、Y座標を取得することが出来ます。使い方はこうです。

x, y = GetMousePosition()

プログラミングにおいて "=" は、「左辺に右辺の値を入れる」という意味になります。
まずこれで、変数(入れ物) xとyにそれぞれ、X座標、Y座標の数値情報が入ります。

しかしこれだけでは、入れ物に入っただけです。数値を表示して確認するギミックを作ってみましょう。

OutputLogMessage関数

OutputLogMessage関数を使うと、スクリプトエディタのウインドウ下部に、任意のメッセージを流すことが出来ます。
ボタンを押してきちんと反応しているかなどを確認する時に使いますよ!

x, y = GetMousePosition()
OutputLogMessage("%d, %d", x, y)

OutputLogMessage関数では、引数で表示したい文字をダブルクォート(")で括ります。
もしその中で数値(変数)などを表示させたい場合、%dと入力し、ダブルクォートで閉じ終わった後、カンマ区切りでその数値を入力します。
今回の場合、xとyに数値情報が入ります。2つの数値を扱うので、「"%d,%d"」と2度打っているのです。
そしてその後も「x,y」としています。
なお、G-series LUAのスクリプトエディタでは日本語が扱えないので注意。半角英数のみ対応です。

まだこれだけだとマウス位置を表示させるトリガーがありません。前回のスクリプトに追加して動かしてみましょう。

キーを押すとマウスカーソル位置を表示

function OnEvent(event, arg)
   if(event == "G_PRESSED") then
      if(GetMKeyState("lhc") == 1) then
         if(arg == 1) then
            MoveMouseTo(35312,39600)
            Sleep(100)
            PressMouseButton(1)
            Sleep(50)
            ReleaseMouseButton(1)
         end
         if(arg == 3) then
            x, y = GetMousePosition()
            OutputLogMessage("%d, %d\n", x, y)
         end
      end
   end
end

前回の、「M1でG1キーを押すと特定の位置をクリック」というスクリプトに、上記の位置表示を追加してみました。
11~14行目です。
arg == 3、つまりG3キーが押された場合、現在のマウス位置を取得し変数x、yに入れ、それをエディタの下部にログメッセージとして表示します。

マウス位置取得結果

マウスカーソル位置取得結果

こんな感じで出ます。マウスを動かしてG3を押すと数値が変わるはずです。

MoveMouseToに取得したカーソル位置をセットする

ここまで来たら話は簡単で、MoveMouseTo()の引数にGetMousePosition()で取得したを設定してやればOKです。

1.手打ちで入れる

もっともシンプルなのは、取得した値を手入力することです。

上記であれば、33058, 28729という値が取れたので、それをMoveMouseTo()に入れて、MoveMouseTo(33058, 28729)としてやればOK!

function OnEvent(event, arg)
   if(event == "G_PRESSED") then
      if(GetMKeyState("lhc") == 1) then
         if(arg == 1) then
            MoveMouseTo(33058,28729)
            Sleep(100)
            PressMouseButton(1)
            Sleep(50)
            ReleaseMouseButton(1)
         end
         if(arg == 3) then
            x, y = GetMousePosition()
            OutputLogMessage("%d, %d\n", x, y)
         end
      end
   end
end

2.自動的にセットされるようにする

例えば、押したいところがしょっちゅう変わるので再設定したい場合があるかもしれません。
そういった場合は変数を使って、G3を押したら自動的にそのカーソル位置を記憶させるようにしましょう。

mousePosX = 0
mousePosY = 0

function OnEvent(event, arg)
   if(event == "G_PRESSED") then
      if(GetMKeyState("lhc") == 1) then
         if(arg == 1) then
            MoveMouseTo(mousePosX,mousePosY)
            Sleep(100)
            PressMouseButton(1)
            Sleep(50)
            ReleaseMouseButton(1)
         end
         if(arg == 3) then
            mousePosX, mousePosY = GetMousePosition()
            OutputLogMessage("%d, %d\n", mousePosX, mousePosY)
         end
      end
   end
end

まず、1~2行目。function()~endの外に新しく変数を作ります。(定義という)
大体先頭に書いておくのがセオリーです。
mousePosXとmousePosYには初期値を適当に入れておきます。
ご存知のようにfunctionはボタンを押す度に走ります。
定義をfunctionの中に入れてしまうと毎回初期値にリセットされてしまうため、外に置いているのです。
G3キーを押したときの15行目。GetMousePosition()で取得したカーソル位置はmousePosXとmousePosYに入ります。
念のため、OutputLogMessageでもその値を表示します。
G1キーを押した時の8行目では、MoveMouseToにmousePosXとmousePosYの値を指定しています。

スクリプトエディタは保存した時点で有効に

スクリプトエディタで上記のコードをコピペしたりして書いたら、Ctrl+Sで保存をします。この時点ではじめてスクリプトが有効になります。

構文エラーについて

g13r_LUAのシンタックスエラー

プログラムした内容に誤りがある状態で保存をすると、このように赤いラインが引かれて「シンタックスエラー(構文エラー)」となり、実行できません。

例えば、カッコやダブルクォートを使ったら必ず閉じなければなりません。ifやfunctionには対応するendが必要です。
このサンプルプログラムでは半角スペースで段を作っていますが、全角スペースを使うとアウトです。
変数の名前を一文字でも間違えていたりしてもエラーになります。

赤いラインはそのエラーの発生元の近くを表しています。その行ではないこともありますので注意してください。
上記のエラーの原因は、その下の行に全角スペースが入っているためです。

どんなプログラムでも最初のうちは構文エラーに泣くと思います。
カッコの対応やend、ダブルクォート、イコールなどに特に注意して進めましょう。

まとめ:もっと改良は可能!

いかがでしたでしょうか。
このようにして、「if (arg == ...」を増やしていくことで
一瞬にしてあっちクリック、こっちクリック、ということが可能になります。
プログラムの中ではかなり手軽に試せるものですので、是非挑戦してみてくださいね(∩^ω^∩)

なお、この自動でマウス位置を割り当てる方法は実は未完成です。
それは「ソフトを再起動するとmousePosX、mousePosYが初期値に戻る」ためです。
起動ごとに毎回、マウス位置を設定しなければなりません。
ここについては例えば、mousePosX, mousePosY取得時に値を外部ファイルなどに保存し、プロファイルが読み込まれた時に初期値として反映、と言ったプログラム上の工夫が考えられます。
この点については気が向いたら書こうかなと思います。
(というかまだそこまでやってない (¦3[布団])

挑戦してみよう!

ここまでの知識を応用すると、以下のことも出来るかも!挑戦してみよう(∩^ω^∩)

  • 好みのGキーでクリックできるようにしてみよう
  • 複数のキーでそれぞれ任意の位置をクリックできるようにしてみよう
  • マウスカーソル位置取得をM3のG1キー、クリックをM1のG1キーという風に、Mキーの違いで機能を振り分けるようにしてみよう
  • 1回押すと16連打クリックするキーを作ってみよう
  • ドラッグ&ドロップさせてみよう

 


記事の内容は執筆、更新日時時点の情報であり、現在は異なっている場合があります。
記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

【今日のおすすめ】

エネチェンジで電気代を比較!激安電気会社が見つかる!

【auひかり】最大10Gbpsの超高速通信!最大126,000円還元キャンペーンキャッシュバックで初期工事費も実質無料!

ひきこもりニートでも稼いでゲームに課金出来る時代

 - パソコン・ガジェット , , ,