マウス・キーボード操作
マウスカーソルの位置を変更したいという場合はmouse命令を使用します。
「mouse x座標,y座標」という書式で変更できます。
ディスプレイの左上を基点(0,0)とした座標です。
「mouse -1」でマウスカーソルを一時的に非表示にすることができます。
「mouse 1」で再び表示します。
非表示に出来るのはHSPウィンドウ上での話だけであって
消えている間であってもHSPウィンドウ外に移動させると出現します。
ゲームを作成したい人はキャラクタを操作してみたいですよね?
getkey命令でマウス・キーボードを監視することができます。
書式はヘルプに「getkey 変数,キーコード」と載っています。
キーコードに監視したいキーのコード(ヘルプに載っています)を入れておきます。
監視するキーが押されるとp1の変数に1が入ります。
getkey k, 13 ; ENTERキーを監視
stop
しかし監視するのはスクリプトにgetkeyが書かれてあるところだけですので
サンプルの様に書いても、起動した瞬間しか監視してくれません。
いつ押されてもいいように監視し続けるにはループ処理内で使う必要があります。
repeat
getkey k, 13
if k = 1 : break
wait 1 ; ウエイトを必ず入れる
loop
end ; 省略しても終了する
getkey命令は監視し続けると押されている間ずっと変数に1が入ります。
ゲームで説明すると押し続けでキャラクタが動くのは問題ありませんが、
コマンドメニューを表示させるのに押され続けて何度も表示させるのはおかしいですね。
stick命令だと監視中に押され続けても一旦離すまで2回目とみなしません。
書式は「stick 変数,非トリガーキー,アクティブチェック」です。
変数には押されたキーのコードをすべて足した値が入ります。
getkey命令とは別のコードとなりますので混同しないように気をつけてください。
非トリガーキーはgetkey命令と同じ押しつづけると2回3回とカウントして変数にキーコードが足されます。
ただgetkey命令より監視できるキーが少ないのがstick命令の弱い所です。
このp2に押し続けてもカウントしたいキーコードをすべて足した値を入れます。
アクティブチェックは非アクティブ時に押されても、押されたとみなすか否かです。
省略時は0の非アクティブも押されたとみなしますが、1の時すべてのキーを無効とします。
repeat
stick key,6,1 ; 上(2)と右(4)キーは押し続けを有効とし非アクティブ時はすべて無効とする
if key & 2 : mes "上キーが押されました" ; 押されたキーコードに2は含まれるかどうか
if key & 4 : mes "右キーが押されました"
if key = 32 : mes "ENTERキーが押されました" ; =にすると他のキーが同時に押されると無視する
wait 1
loop
押されたかのチェックする時3,4行の&と5行の=では違いますね。
「&」は含まれるか否かです。変数が96(32と64の同時押し)だと&32,&64,&96のどれでも実行されます。
「=」は合計値が全く同じ時でなければ実行されません。
ループを使わずにマウスのキーいつでも(ウェイト時に)監視するにはonclick命令を使います。
書式は「onclick ラベル」と「onclick 割り込み停止or再開」です。
たとえstop命令で止っている時でも監視し、押された時に指定したラベルにジャンプします。
割り込みを停止するには「onclick 0」と、再開は1を指定します。
キーボードをいつでも監視するにはonkey命令を使います。
書式は「onkey ラベル」と「onkey 割り込み停止or再開」です。
onclick命令と同じく押された時に割り込み指定したラベルにジャンプします。
割り込み停止は「onkey 0」と、再開は1を指定します。
onclick,onkey命令共に指定ラベルジャンプ後は
システム変数iparamにどのキーが押されたのかコード(getkey命令と同じコード)が入ります。
onclick,onkey命令したついでですので割り込みジャンプ命令をひとつ紹介しましょう。
閉じるボタン等(endを除く)で実行を中断しようとした時の割り込みでonexit命令があります。
書式は「onexit ラベル」と「onexit 割り込み停止or再開」です。
onexit *exit
stop
*exit
dialog "本当に終了してよろしいですか?", 3
if stat = 6 : end ; 「はい」が押された
stop
この章を見てゲームが作りたくなった人向けにRPGのキャラクタ歩行サンプル(カニ歩き)を紹介。
20章で使用した画像を利用しています。
buffer 2
picload"char.bmp"
gsel 0
*main
stick key, 15, 1
if key = 1 : x-- : ashi++ : if x < 0 : x = 0
if key = 4 : x++ : ashi++ : if x > 61 : x = 61
if key = 2 : y-- : ashi++ : if y < 0 : y = 0
if key = 8 : y++ : ashi++ : if y > 45 : y = 45
redraw 0
boxf
if ashi \ 2 = 0 : pos x * 10, y * 10 : gcopy 2, , , 32, 32
if ashi \ 2 = 1 : pos x * 10, y * 10 : gcopy 2, 64, , 32, 32
redraw
wait 1
goto *main