G13rで覚えるLUAスクリプト:第1回~読んでみる~
2016/12/02
LogicoolのG13rで特に使えるのが自分でプログラムする「スクリプト」機能です。しかし、「プログラミングなんてわからない!」という人も少なくないはず。サンプルを使いながら解説したいと思います。
Contents
G13rの「スクリプト」とは?
G13rでは、LUAというプログラミング言語を用いて、様々なことができます。
ゲームでは主に、「マウスの操作」を自動的にさせることが出来ます。
実際のプログラムを見ながら仕組みを学んでみましょう。
スクリプトエディタの起動方法
Logicoolゲームソフトウェアを立ち上げ、①の「Gキーのカスタマイズ」画面を開きます。スクリプトを利用したいプロファイル(②)を右クリックするとサブメニューが出てきます。その中に③スクリプトがあります。
このようなウインドウが表示されればOK!
このウインドウにプログラムを書いてスクリプトを保存すると、そのプロファイルでスクリプトが働くようになります。
スクリプトの構造を理解する
プログラムはたくさんの機能が前もって用意されていて、その機能に情報を渡すことで実行されます。
上記のようなカッコがついた形の機能を「関数」と呼びます。カッコの中の関数に渡す情報を「引数」と呼びます。
KansuuNoNamae("引数")
このような関数と引数が今後たくさん出てきます。
関数が出てきたら「その前に書いてある名前の機能に対して、カッコの中の情報を渡してるんだな」と思ってくださいね。
画面上の特定の位置をクリックするスクリプト
以下は、G13rの「M1」がアクティブで「G1」を押した時に、画面の特定の位置をクリックするスクリプトです。第1回はこれが読めるようになることが目標です。
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
end
end
end
それぞれの行を日本語にしてみると、以下のようになります。比較してわかる範囲で理解してみてください。
機能 OnEvent(出来事, 引数)
もし(出来事が"Gキーを押す")だったら以下の処理
もし(アクティブなMキー("G13の")が1)だったら以下の処理
もし(引数が1)だったら以下の処理
マウスをここに移動(横軸:35312,縦軸:39600)
お休み(100ミリ秒)
マウスボタンを押す(1つめのボタン)
おやすみ(50ミリ秒)
マウスボタンを離す(1つめのボタン)
ここまで
ここまで
ここまで
ここまで
1行目:機能の宣言
1行目から見ていきましょう。
function OnEvent(event, arg)
よく見てください。ここで早速先述した関数が出てきますね。
関数の先頭に function とついているものは、その関数の「呼ばれる側」、関数そのものについて書くよ、という宣言です。
「この関数の名前はOnEventで、この機能にはeventとargという情報を渡すことが出来ますよ」という風に読みます。渡したい情報が複数の時はカンマで間を区切ります。
また、最後にendのみの行をつけて「この関数についてはここまで」と括るのもお約束です。1行目のfunctionのendは13行目のendです。
なので、実際には2行目から12行目までが、関数「OnEvent」が呼ばれた時に動くプログラムの中身です。
関数「OnEvent」はG13rのキーを押したりすると毎回呼ばれます。そして、2行目以降のプログラムを実行します。
なので、2行目からやりたいことを書いていきます。
2行目:イベント(出来事)の判定
if(event == "G_PRESSED") then
2行目は「Gキーいずれかを押したら」という条件判定を書いています。
判定を入れないとどのキーを押してもクリックしちゃいますからね。
if() thenは「もし(ここに書いた条件式が正)ならば」という関数で、判定の基本になります。
何か判別させたい時はif() thenを使います。
カッコの中を見ていきましょう。eventに入ってくる情報はG13(というかロジのGシリーズ)のLUAの場合決まっています。
今回はevent == "G_PRESSED" としています。判定の時にはイコールを2つ続けて書きます。
参考:G-seriesLUAのeventとarg
Event | arg | 説明 |
"PROFILE_ACTIVATED" | None | プロファイルがアクティブになった。これは一番最初に起きるイベント。 |
"PROFILE_DEACTIVATED" | None | プロファイルがアクティブではなくなった。これは最後に起きるイベント。 |
"G_PRESSED" | G1なら1、 G18なら18 n = Gn |
Gキーが押された。argにはそのGキーの番号が入ってくる |
"G_RELEASED" | 1=G1 18=G18 n = Gn |
押されていたGキーが離された。argは同上。 |
"M_PRESSED" | 1=M1 2=M2 3=M3 |
Mキーが押された。argにはそのMキーの番号が入ってくる。 |
"M_RELEASED" | 1=M1 | 押されたMキーが離された。argは同上。 |
この情報はスクリプトエディタのヘルプ、「スクリプトAPI」から見ることが出来ますよ!(英語です)
3行目:マクロキー(Mキー)の判定
if(GetMKeyState("lhc") == 1) then
3行目は「マクロボタンが1だったら(つまりM1が選ばれているか)」という判定です。
GetMKeyState()はGシリーズのLUAに標準で入っている関数で、この関数に調べたいデバイスの情報を送ると、そのデバイスのMキーのどれがアクティブなのかを1~3の数値で教えてくれます。
"lhc"はLeft handed controllersのことで、G13rを指しています。G13rについてが知りたいので、"lhc"を指定しています。
そして、ここがプログラムの面白いところなのですがGetMKeyState("1hc")は数値を教えてくれるので、この関数自体が数値として判定できます。
なので、「もし(GetMKeyState("lhc") が 1)ならば」というif文が書けるのです。
4行目:どのGキーが押されたかの判定
if(arg == 1) then
引数(arg)は先述したように「出来事(event)の付属の情報」です。
2行目でeventに「Gキーが押された」という情報が入っています。その付属情報である引数(arg)には「どの番号なのか」が入ることになっていますよね。
出来事(event):Gキーが押された、引数(arg):1番 みたいな関係です。
つまり、2行目で「Gキーが押されたら」、4行目で「その番号が1なら」という判定をしています。
5行目:マウスを指定位置に移動
5行目からは多少わかりやすいでしょうか。
MoveMouseTo(35312,39600)
マウスを所定の位置に動かします。
この時カッコにX軸(横)、Y軸(縦)の数値を入れて渡します。
(そのため、画面上の押したい位置をXとYの数値に変換しなければなりません。この方法の紹介は次回あたりにします。)
Sleep(100)
Sleep()はカッコの中のミリ秒だけ処理をそこで止めておきます。
つまり、カーソルを移してからすぐにクリックしないで、ちょっとだけ間を置いています。
これは例えば、カーソルを動かしてすぐにクリック命令を送ると、プログラムが反応しないことがあるためです。
7行目~9行目:左クリック&リリース
PressMouseButton(1)
PressMouseButtonはカッコの中の番号のマウスボタンをクリックします。移動してありますからその位置でクリックするだけです。
マウスの1番ボタンは左クリックです。2番は中(ホイールボタン)、3は右クリックです。
Sleep(50)
そしてクリックもちょっとの間だけ保持します。
ReleaseMouseButton(1)
ReleaseMouseButtonはPressMouseButtonの逆ですね。
最後に、マウスのクリックを離して終了、というわけです。
###10~13行目は「入れ子」の跡
end
end
end
end
最後のendの階段。これはfunctionとifの入れ子の後始末です。
functionもifも、そこからendまでの間に書いてあるプログラムを処理します。
なので、最小単位は
function OnEvent(event, arg)
end
です。
判定も何もなしに特定の場所をクリックするだけなら
function OnEvent(event, arg)
MoveMouseTo(35312,39600)
Sleep(100)
PressMouseButton(1)
Sleep(50)
ReleaseMouseButton(1)
end
こうなります。これでは何かすると毎回クリックしちゃうので
function OnEvent(event, arg)
if(event == "G_PRESSED") then
MoveMouseTo(35312,39600)
Sleep(100)
PressMouseButton(1)
Sleep(50)
ReleaseMouseButton(1)
end
end
Gキーが押されてー、という判定を入れ
function OnEvent(event, arg)
if(event == "G_PRESSED") then
if(arg == 1) then
MoveMouseTo(35312,39600)
Sleep(100)
PressMouseButton(1)
Sleep(50)
ReleaseMouseButton(1)
end
end
end
Gキーの番号が1の時でー
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
end
end
end
M1の時だけ動かしたいからM1の時!
というように書いていきます。この入れ子がわかりやすくなるように、functionとそのend、ifとそのendの縦軸を合わせるように書くのがしきたりです。
まとめ:読めれば書ける
いかがでしたでしょうか。プログラム初心者の方はこれでもかなり大変な勉強量になると思います。
しかし、今回の内容が理解できれば、もう書けたも同然です!
次回はこのプログラムにちょっと付け足して、好みの場所をクリックできるようにしましょう。
記事の内容は執筆、更新日時時点の情報であり、現在は異なっている場合があります。 記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。
【今日のおすすめ】
【auひかり】最大10Gbpsの超高速通信!最大126,000円還元キャンペーンキャッシュバックで初期工事費も実質無料!