マウスとキーボード
今回は、マウスやキーボードを使った命令を紹介します。
まずは、キーボードに比べ覚えることが少ないマウス操作から。
mouse X座標, Y座標
X座標設定するマウスカーソルのX座標。−1を指定すると非表示。
Y座標設定するマウスカーソルのY座標。−1を指定すると非表示。
マウスカーソルの座標を指定パラメータの座標に移動させる命令です。
第1パラメータにX座標、第2にY座標を指定するわけですが、
座標はHSPウィンドウ上の座標ではなく、スクリーン(ディスプレイ)の左上を(0, 0)とした座標です。
パラメータを省略すると、省略したパラメータの座標は現在のままとなります。
つまり、現在(100, 50)だとして、「mouse -1, 150」とすると、座標は(100, 150)に変わります。
パラメータのどちらか1つ以上に-1を指定すると、マウスカーソルは非表示となります。
非表示中に-1以外(省略を含む)を指定すると、再び指定座標に表示するようになります。
尚、非表示にするといっても、HSPウィンドウ上だけ非表示になるというものです。
非表示にしている間でも、HSPウィンドウ外にマウスカーソルを移動させると表示されるのです。
それと、ディスプレイサイズより大きい値を指定しても、端に表示されるだけで指定座標には移動しません。
この特性を覚えておきましょう。
 1
 2
 3
 4
 5
 6
 7
	pos  50, 50 : input x, 50, 20, 4
	pos 105, 50 : input y, 50, 20, 4
	pos 160, 50 : button "変更する", *change
	stop

*change
	mouse x, y // 入力された座標に変える
一方的に座標を変更するのではなく、特定の座標領域になったときに状態を変更させるには、
現在のマウス座標を取得できれば解決します。
mouse命令と同じく、スクリーン座標で座標を取得するには、ginfo_mxマクロを参照することでX座標、
ginfo_myマクロを参照することでY座標を取得することが出来ます。
 1
 2
 3
 4
	repeat
		wait 5
		title "(" + ginfo_mx + ", " + ginfo_my + ")" // 現在座標をタイトルに表示する
	loop
HSPウィンドウ左上を(0, 0)とした座標は、システム変数mousexmouseyに代入されます。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
	// カーソル画像を用意
	buffer 1
	color : boxf : color 255
	line 12, 15, 0, 0
	line  0,  0, 0, 5
	line  0,  0, 5, 1
	// メインウィンドウを用意
	gsel 0
	hide = 100, 50, 400, 150 // 非表示エリア
	size = 16                // マウスカーソルのサイズ
	gmode 2                  // カーソル画像背景の黒色は透過する
	// メインループ
	repeat
		redraw 0
		color 255, 255, 255 : boxf hide.0 - size, hide.1 - size, hide.2 + size, hide.3 + size
		color 200, 200, 255 : boxf hide.0, hide.1, hide.2, hide.3
		if mousex >= hide.0 && mousex <= hide.2 && mousey >= hide.1 && mousey <= hide.3 {
			if flg = 0 : flg = 1 : mouse -1
			pos mousex, mousey : gcopy 1, 0, 0, size, size
		} else {
			if flg : flg = 0 : mouse
		}
		redraw
		wait 1
	loop
これでサンプルの様な、マウスカーソルをオリジナルの画像に変えたり、
簡易的ですが、特定のエリアには入られないようなプログラムを組むことが出来ますね。
尚、HSP3からは、マウスのホイールボタンもmousewにて取得できるようになりました。
上方向に回転させると120、下方向に回転させると−120、何もしなければ0が入ります。
これは参照前のウェイト中(の最後)にされたものが入るので、ウェイト中に1回転分だけ上下とした場合は、
±0で0が入る…ということではなく、最後にスクロールされた下方向の値である−120が入ります。
高速に回転させると、120の倍数、または−120の倍数が取得される様になっているので、

 1
 2
 3
 4
 5
 6
 7
 8
 9
	mes "マウスホイールの状況をタイトルバーにセットします"
	repeat
		w = abs(mousew / 120) // 一度取得したら値はクリアされるので変数に退避させる
		if w {
			if w = 1 : title "ホイールが普通に回転したようです"
			if w > 1 : title "ホイールが高速に回転したようです"
		}
		wait 1
	loop
getkey フラグ用変数, チェックキーコード
フラグ用変数チェックするキーコードが押されているか否かの結果フラグを代入する変数を指定する。
チェックキーコード押されているか否かをチェックするキーコード(下記参照)を指定する。
マウスの次はキーボード…と言いたいところですが、キーボード及びマウスのチェック用命令の紹介です。
HSP3現在では、mouse命令のようにキーを設定する命令は標準で用意されていません。
getkey命令は任意キーが押されたかどうかをチェックする命令で、
第2パラメータで指定するキーコード(後述)に対応したキーがgetkey命令通過(厳密にはウェイト?)時に
押されていれば、第1パラメータに指定した変数に1が入り、押されてなければ0となります。
下記は日本語キーボード(106)のキー配列と対応した第2パラメータに指定するコード一覧です。
EscF1F2F3F4
F5FF7F8
F9F10F11F12


27112113114115
116117118119
120121122123



1ぬ2ふ3あ4う5え6お7や8ゆ9よ0わ−ほ^へ¥−Back
Space
Print
Screen
Scroll
Lock
Pause
Break
Num
Lock

4950515253545556574818922222084414519144111106109
TabQたWてEいRすTかYんUなIにOらPせ@゛[゜EnterInsertHomePage
Up
98187698284898573798019221913453633103104105107
CapsLockAちSとDしFはGきHくJまKのりL;れ:け]むDeleteEndPage
Down
20658368707172747576187186221463534100101102
ShiftZちXさCそVひBこNみMも,ね.る/め\ろShiftEnter
1690886786667877188190191226163897989913
Ctrl左WindowsAlt無変換Space変換
Alt右Windowsプルダウン
メニュー
Ctrl
179118293228
1892931737403996110
マウスCtrl + Break
コード1423
NumUnLock(NumLock消灯)時であれば、テンキーの[0]キーは[Insert]キー、[1]キーは[Delete]キー、
[1]キーは[End]キー、[2]キーは[↓]キー、[3]キーは[PageDown]キー、[4]キーは[←]キー、
[6]キーは[→]キー、[7]キーは[Home]キー、[8]キーは[↑]キー、[9]キーは[PageUp]キーと一致。
理由は分かりませんが、ヘルプには上記コード群よりも載せられている情報が少ないようです。
これ以外でも、もしかしたらgetkey命令で取得できるキーがあるかもしれません。
 1
 2
 3
 4
 5
 6
 7
	mes "Enterが押されたら終了します"
	repeat
		getkey code, 13 // Enterをチェック
		if code : break
		wait 1
	loop
	end
getkey命令は、サンプルのようにループ中に配置することでチェックできます。
キーが押されたら、何かの処理を行う。
これについては問題ないでしょうが、押された時だけ何かを行う場合には少し工夫が必要になります。
何故なら、getkey命令だと、始めにキーが押されたのを確認した後、
ループで同じ場所に戻ってきた時に、まだ押されていれば同じ様に押した処理を実行するからです。
例えば、マウスのクリック数をカウントするゲームを考えてみましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
	mes "10秒間で何回クリックが出来るかな? (Escで終了)"
	wait 100
	repeat 2, 1
		mes 3 - cnt
		wait 100
	loop
	mes "Go !!!"
	// 簡易的に1000ms(10s)ウェイト
	repeat 1000
		getkey k, 1
		if k : count+
		getkey k, 27
		if k : break
		wait 1
	loop
	mes "そこまで !"
	wait 100
	mes "今回の記録は" + count + "回でした"
メインループ内のgetkey命令のみでクリックを感知したらカウント数を上げる仕組みにすると、
連打しなくても、押し続けているだけでカウントが増えていきます。
これじゃあ、クリック数を競うゲームとして成り立ちませんね。
押されているかを判定する時に、前回チェックしたときには押されていないという状況下でのみ
今回、新たにクリックされたとみなすことが出来ます。
判定できるキーに限りがありますが、押し続けを無視するキー判定命令も用意されています。
stick 変数, 押し続け許可, アクティブフラグ
変数押されたキーコードの合計値を代入する変数を指定する。
押し続け許可getkey命令同様の押し続けでも許可するキーコードの合計値を指定する。
アクティブフラグ押された時にウィンドウがアクティブの時だけ押下チェックをする。
第1パラメータにはgetkey命令同様に変数を指定しますが、
getkey命令とは異なり、押されたキーコードの合計値がセットされるようになっています。
キーコードはgetkey命令と同じコードではなく、下記の通りとなっています。

1[←]キー
2[↑]キー
4[→]キー
8[↓]キー
16スペースキー
32[Enter]キー
64[Ctrl]キー
128[Esc]キー
256マウス左ボタン
512マウス右ボタン
1024[Tab]キー
キーコードが1から2倍ずつ増えていっているのは、
複数押された時に、どのキーが押されたか分解できるようにするためです。
例えば、合計130が取得できたとするなら、それは「2」と「128」が押されたことを意味します。
原理を知らなかった人にとっては少し不思議に感じるかもしれませんが、
どの組み合わせでも特定キーが押されたか否かはチェックできます。
第2パラメータは、getkey命令の時のように押し続けていても、
今回押されたと判定するキーコードの合計値を指定します。
例えば、[↑]キーと[↓]キーは押され続けても感知するようにしたいけど、
[←]キーと[→]キーは押された時にだけチェックするようにしたいなら、「stick 変数, 10」とします。
全てのキーを押し続けてプログラム実行すると、
1回目は全てが初めてなので第1パラメータの変数に15(1+2+4+8)が入りますが、
2回目のチェックでは[←]キーと[→]キーは除外され10(2+8)となります。
尚、キーボードによっては、3つ以上の特定キー同時押しが出来ないもののもあります。
ですので、3つ以上の同時押しを必須とするプログラムの一般公開は注意が必要です。
第3パラメータを0にすると、HSPウィンドウが非アクティブの時に押されても検知しないようにします。
0以外(省略含む)を指定すると、非アクティブでも指定キーが押されると押されたことを検知します。
さて、第1パラメータの変数に合計値が入りますが、特定キーが押されたかの判断はどうするかというと、
if命令で、第1パラメータの変数とチェックするキー値、またはその合計値を「AND演算」するのです。
具体的には「if key & 768」とすれば、マウス左または右ボタンが押された時に処理します。
また、この場合はスペースキー(=16)や[Ctrl]キー(=64)等が押されていても、
マウス左・右ボタンのどちらかが押されてさえいれば処理します。
もし「if key = 768」とすると、マウス左・右ボタンが同時に押されている時のみ処理します。
さらに、マウス左・右ボタン以外が押されていては処理しないのです。
この違いを覚えておきましょう。
それでは最後に、マウスクリック回数を計測するプログラムのstick命令版を書いておきましょう。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
	mes "10秒間で何回クリックが出来るかな? (Escで終了)"
	wait 100
	repeat 2, 1
		mes 3 - cnt
		wait 100
	loop
	mes "Go !!!"
	// 簡易的に1000ms(10s)ウェイト
	repeat 1000
		stick k, 128, 1     // 押されたキーコード一覧をセットする
		if k & 256 : count+ // クリックされたらカウント
		if k & 128 : break  // Escがおされたら終了
		wait 1
	loop
	mes "そこまで !"
	wait 100
	mes "今回の記録は" + count + "回でした"