HSP3 プログラミングの基礎V
前へ 目次へ 次へ 

(3) 入力

 数値や文字列を入力するには、配置オブジェクトの入力ボックス(input命令)を使う。これ以外の入力命令として、キーボードやマウスの状態を入力する命令を学習する。

◎ キー入力チェック

getkey 変数, キーコード
 指定したキーコードのキーが押されているかどうかを判定し、結果は変数に格納される。
 指定したキーが押されていれば1、押されていなければ0が変数に格納される。
 キーコードは次の通りである。
1 マウスの左ボタン 18 [ALT] 37 カーソルキー[←]
2 マウスの右ボタン 20 [CAPSLOCK] 38 カーソルキー[↑]
3 キャンセル([CTRL]+[BREAK]) 27 [ESC] 39 カーソルキー[→]
4 3ボタンマウスのまん中のボタン 32 スペースキー 40 カーソルキー[↓]
8 [BACKSPACE] 33 [PAGEUP] 48〜57 [0]〜[9](メインキーボード)
9 [TAB] 34 [PAGEDOWN] 65〜90 [A]〜[Z]
13 [ENTER] 35 [END] 96〜105 [0]〜[9](テンキー)
16 [SHIFT] 36 [HOME] 112〜121 [F1]〜[F10]
17 [CTRL]        


サンプル[Esc]キーが押されたらプログラムを終了する。

    mes "[Esc]キーを押すと終了します。"
    repeat
        getkey flag, 27     ;キー入力チェック
        if flag = 1 : end
        wait 10
    loop
    stop

実行[Esc]キーを押すとプログラムが終了する(ウィンドウが閉じる)。

 特定のキーのON/OFFを判定することができる(特定のキーしか判定できない)。
 wait命令はrepeat〜loop命令で永久ループとなっているので入れている。

 


キー入力情報取得

stick 変数, 非トリガータイプキー指定, ウィンドウアクティブチェック
 押されているキーに対応した値が変数に格納される。例えば、[CTRL]を押しながら[ENTER]を押すと変数には96(=64+32)が格納される。
 非トリガータイプキー指定を設定するとキーリピートに対応できる。例えば、4つのカーソルキーを押したままでも情報が取得できるようにするには、15(=1+2+4+8)を設定する。
 キーの値(2進数の各ビットに対応している。)
1 カーソルキー[←] 16 スペースキー 256 マウスの左ボタン
2 カーソルキー[↑] 32 [ENTER] 512 マウスの右ボタン
4 カーソルキー[→] 64 [CTRL] 1024 [TAB]
8 カーソルキー[↓] 128 [ESC]    

サンプル押したカーソルキーに対応したメッセージを表示する。[Esc]キーが押されたらプログラムを終了する。

    mes "[Esc]キーを押すと終了します。"
    repeat
        stick kk            ;キー入力情報
        if kk = 128 : end       ;[Esc]
        if kk = 1 : mes "左"    ;[←]
        if kk = 2 : mes "上"    ;[↑]
        if kk = 4 : mes "右"    ;[→]
        if kk = 8 : mes "下"    ;[↓]
        wait 10
    loop
    stop

実行押したカーソルキーに対応したメッセージが表示される。押し続けても表示されるメッセージは1回だけである。

試してみようキーを押している間、メッセージが表示されるようにする。(キーリピート)

    mes "[Esc]キーを押すと終了します。"
    repeat
        stick kk, 15      ;キー入力情報
        if kk = 128 : end       ;[Esc]
        if kk = 1 : mes "左"    ;[←]
        if kk = 2 : mes "上"    ;[↑]
        if kk = 4 : mes "右"    ;[→]
        if kk = 8 : mes "下"    ;[↓]
        wait 10
    loop
    stop

実行キーを押している間、メッセージが表示される。

 2つ以上のキーを同時に押すとメッセージが表示されなくなる。これは、2つ以上のキーを同時に押すと、キーの値の加算値が変数に格納されるためである。例えば、左と下を同時に押すと変数には9(=1+8)が格納されて、どのif文も真にならない。

 

サンプル2つ以上のキーを同時に押してもメッセージが表示されるようにする。

    mes "[Esc]キーを押すと終了します。"
    repeat
        stick kk            ;キー入力情報
        if kk & 128 : end       ;[Esc]
        if kk & 1 : mes "左"    ;[←]
        if kk & 2 : mes "上"    ;[↑]
        if kk & 4 : mes "右"    ;[→]
        if kk & 8 : mes "下"    ;[↓]
        wait 10
    loop
    stop

実行2つ以上のキーを同時に押してもメッセージが表示される。

 条件式の等号(=)を論理積(and)の演算子(&)に変更した。
 例えば、左と下を同時に押すと変数には9が格納されるが、「9 & 1」、「9 & 8」どちらも真と判定される。

 変数kk=9のとき、kkは2進数で表すと1001となる。
  kk & 1 kk & 2 kk & 4 kk & 8
kk=9 kk=9=1001 kk=9=1001 kk=9=1001 kk=9=1001
キー値   1=0001   2=0010   4=0100   8=1000
論理積   1=0001   0=0000   0=0000   8=1000
真偽

 

サンプルカーソルキーで画像を動かす。

    buffer 1
    picload "gazou1.bmp"
    screen 0, 640, 480
    x = 100         ;X座標
    y = 100         ;Y座標
    d = 10          ;移動量

    repeat
        redraw 0
        color 255, 255, 255
        boxf
        pos x, y
        gcopy 1, 0, 0, 32, 32
        redraw 1

        stick kk, 15        ;キー入力情報
        if kk & 128 : end       ;[Esc]
        if kk & 1 : x = x - d   ;左
        if kk & 2 : y = y - d   ;上
        if kk & 4 : x = x + d   ;右
        if kk & 8 : y = y + d   ;下
        wait 10
    loop
    stop

実行カーソルキーに対応して、画像が移動する。上下の1つと左右の1つを同時に押すと斜めに移動する。
  (参考 : 画像の移動

 


マウスの入力

 キー入力命令でマウスボタンを判定することができる。ここでは、マウスカーソル(マウスポインタ)の座標について学習する。

mousex  mousey 
 マウスポインタの座標が格納されているシステム変数である。

 

サンプルマウスの現在の座標を表示する。

    repeat
        color 255, 255, 255
        boxf
        color 0, 0, 0
        pos 100, 100
        mes "("+mousex+","+mousey+")"
        wait 50
    loop
    stop

実行HSPのウィンドウ内のマウスの現在座標が表示される。

 wait 50としているので、0.5秒(500ミリ秒)ごとの座標が表示される。HSPのウィンドウ外にマウスポインタがあるときは座標は変化しない。

 

サンプルクリックしたポイントを中心に円を描画する。半径は乱数で決定する。

    randomize
    repeat
        stick kk
        if kk = 256 {
            r = rnd(100)
            x1 = mousex + r
            y1 = mousey + r
            x2 = mousex - r
            y2 = mousey - r
            circle x1, y1, x2, y2, 0
        }
        wait 50
    loop
    stop

実行クリックすると円が描画される。

 0.5秒のウエイト(wait 50)が入っているので、反応が少し遅い。

試してみよう「wait 50」を「await 50」に変更する。

実行クリックすると すぐに 円が描画される。

 

前へ 目次へ 次へ 
2006  © Hiroshi Masuda 

 

 

inserted by FC2 system