マウスとキーボード
今回は、マウスやキーボードを使った命令を紹介します。
まずは、キーボードに比べ覚えることが少ないマウス操作から。
| 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ウィンドウ外にマウスカーソルを移動させると表示されるのです。
それと、ディスプレイサイズより大きい値を指定しても、端に表示されるだけで指定座標には移動しません。
この特性を覚えておきましょう。
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座標を取得することが出来ます。
HSPウィンドウ左上を(0, 0)とした座標は、システム変数mousexとmouseyに代入されます。
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の倍数が取得される様になっているので、
| getkey フラグ用変数, チェックキーコード |
| | | |
| フラグ用変数 | チェックするキーコードが押されているか否かの結果フラグを代入する変数を指定する。 |
| チェックキーコード | 押されているか否かをチェックするキーコード(下記参照)を指定する。 |
マウスの次はキーボード…と言いたいところですが、キーボード及びマウスのチェック用命令の紹介です。
HSP3現在では、mouse命令のようにキーを設定する命令は標準で用意されていません。
getkey命令は任意キーが押されたかどうかをチェックする命令で、
第2パラメータで指定するキーコード(後述)に対応したキーがgetkey命令通過(厳密にはウェイト?)時に
押されていれば、第1パラメータに指定した変数に1が入り、押されてなければ0となります。
下記は日本語キーボード(106)のキー配列と対応した第2パラメータに指定するコード一覧です。
| Esc | F1 | F2 | F3 | F4 |
| F5 | F | F7 | F8 |
| F9 | F10 | F11 | F12 | |
|
|
| |
| 27 | 112 | 113 | 114 | 115 |
| 116 | 117 | 118 | 119 |
| 120 | 121 | 122 | 123 |
|
|
|
|
| 1ぬ | 2ふ | 3あ | 4う | 5え | 6お | 7や | 8ゆ | 9よ | 0わ | −ほ | ^へ | ¥− | Back Space | Print Screen | Scroll Lock | Pause Break | Num Lock | / | * | − |
| 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 48 | 189 | 222 | 220 | 8 | 44 | 145 | 19 | 144 | 111 | 106 | 109 |
|
| Tab | Qた | Wて | Eい | Rす | Tか | Yん | Uな | Iに | Oら | Pせ | @゛ | [゜ | Enter | Insert | Home | Page Up | 7 | 8 | 9 | + |
| 9 | 81 | 87 | 69 | 82 | 84 | 89 | 85 | 73 | 79 | 80 | 192 | 219 | 13 | 45 | 36 | 33 | 103 | 104 | 105 | 107 |
|
| CapsLock | Aち | Sと | Dし | Fは | Gき | Hく | Jま | Kの | りL | ;れ | :け | ]む | Delete | End | Page Down | 4 | 5 | 6 |
| 20 | 65 | 83 | 68 | 70 | 71 | 72 | 74 | 75 | 76 | 187 | 186 | 221 | 46 | 35 | 34 | 100 | 101 | 102 |
|
| Shift | Zち | Xさ | Cそ | Vひ | Bこ | Nみ | Mも | ,ね | .る | /め | \ろ | Shift | | ↑ | | 1 | 2 | 3 | Enter |
| 16 | 90 | 88 | 67 | 86 | 66 | 78 | 77 | 188 | 190 | 191 | 226 | 16 | | 38 | | 97 | 98 | 99 | 13 |
|
| Ctrl | 左Windows | Alt | 無変換 | Space | 変換 |
| Alt | 右Windows | プルダウン メニュー | Ctrl | ← | ↓ | → | 0 | . |
| 17 | 91 | 18 | 29 | 32 | 28 |
| 18 | 92 | 93 | 17 | 37 | 40 | 39 | 96 | 110 |
|
| マウス | 左 | 中 | 右 | | Ctrl + Break |
| コード | 1 | 4 | 2 | | 3 |
NumUnLock(NumLock消灯)時であれば、テンキーの[0]キーは[Insert]キー、[1]キーは[Delete]キー、
[1]キーは[End]キー、[2]キーは[↓]キー、[3]キーは[PageDown]キー、[4]キーは[←]キー、
[6]キーは[→]キー、[7]キーは[Home]キー、[8]キーは[↑]キー、[9]キーは[PageUp]キーと一致。
理由は分かりませんが、ヘルプには上記コード群よりも載せられている情報が少ないようです。
これ以外でも、もしかしたらgetkey命令で取得できるキーがあるかもしれません。
getkey命令は、サンプルのようにループ中に配置することでチェックできます。
キーが押されたら、何かの処理を行う。
これについては問題ないでしょうが、押された時だけ何かを行う場合には少し工夫が必要になります。
何故なら、getkey命令だと、始めにキーが押されたのを確認した後、
ループで同じ場所に戻ってきた時に、まだ押されていれば同じ様に押した処理を実行するからです。
例えば、マウスのクリック数をカウントするゲームを考えてみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
メインループ内のgetkey命令のみでクリックを感知したらカウント数を上げる仕組みにすると、
連打しなくても、押し続けているだけでカウントが増えていきます。
これじゃあ、クリック数を競うゲームとして成り立ちませんね。
押されているかを判定する時に、前回チェックしたときには押されていないという状況下でのみ
今回、新たにクリックされたとみなすことが出来ます。
判定できるキーに限りがありますが、押し続けを無視するキー判定命令も用意されています。
| stick 変数, 押し続け許可, アクティブフラグ |
| | | |
| 変数 | 押されたキーコードの合計値を代入する変数を指定する。 |
| 押し続け許可 | getkey命令同様の押し続けでも許可するキーコードの合計値を指定する。 |
| アクティブフラグ | 押された時にウィンドウがアクティブの時だけ押下チェックをする。 |
第1パラメータにはgetkey命令同様に変数を指定しますが、
getkey命令とは異なり、押されたキーコードの合計値がセットされるようになっています。
キーコードはgetkey命令と同じコードではなく、下記の通りとなっています。