第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「5.ボタンを使う その2」

6−5 ボタンを使う その2

さてさて、難しい話が終ったところで、実際にサンプルを作ってみましょう。
こんな●をボタン類を使って動かすものです。

    

●の画像は、全体が20x20ピクセルで、上下左右に1ピクセルずつ余白のある画像を用意します。この方法は、モノを移動させるときに便利でしたね。

さて、まずは●の座標を入れる変数を用意します。
これは、プログラム中で共通ですので、Global変数として定義しますが、ま、これはお馴染みですね。
あと、初期値を入れておきましょう。
    [Startup]
        Global X as Integer
        Global Y as Integer
        X=70
        Y=70
FormのAfterの部分に、ボールを表示するルーチンを入れておきましょう。
    [After]
        DrawBitmap 1005,X,Y
次に、イベントを処理します。ボタン類の上下左右はそれぞれ、&HB,&HC,&H2,&H3ですので、次のようで良いでしょう。
    [events]
        Dim strX as string

        If GetEventType()=NsbKeyorButton Then
            strX=GetKey()
            Select Case strX
                Case &HB
                    Y=Y-1
                    If Y<0 Then
                        Y=0
                    End If
                Case &HC
                    Y=Y+1
                    If Y>140 Then
                        Y=140
                    End If
                Case &H2
                    X=X-1
                    If X<0 Then
                        X=0
                    End If
                Case &H3
                    X=X+1
                    If X>140 Then
                        X=140
                    End If
            End Select
            Redraw
        End If
再描画には、Redrawコマンドを使って、意図的にAfterイベントが発生するようにしました。

これを実行すると、どうなるでしょうか?
上下には移動するけれど、左右に移動しようとすると、ボタンに割り当てられたアプリが起動してしまいますね。

    

基本的にPalmデバイスは、ハードキーを押すと、登録されているアプリがサクッと起動するのが「売り」ですが、こう言う場合は困ってしまいます。
NS Basicで作ったアプリの中でもこれは同じで、ハードキーを押すと、OSレベルのイベントが発生し、割り当てたれたアプリが起動します。
そこで、SetEventHandledコマンドを使用してOSレベルのイベントを無視させるなければなりません。
ただし、OSレベルのイベントには、ハードキーによる登録アプリの起動だけでなく、電源のオン・オフ、「ホーム」のソフトキー、また、オートパワーオフやHotSyncボタンも含まれますので、SetEventHandledコマンドの使い方を誤ると、リセットしなければならないアプリになってしまいます。十分注意しましょう。

さて、今回のサンプルでは、左右のハードキーの処理を無効にしたいので、
        Case &H2
           SetEventHandled 
           X=X-1
            If X<0 Then
                X=0
            End If
        Case &H3
             SetEventHandled
             X=X+1
             If X>140 Then
                X=140
             End If
とすれば良いでしょう。
これで、上下左右に●が動き、また、その他のキーは有効になるはずです。
また、もし、特殊なアプリを使っていて、上下キーを押してもアプリが起動する場合は、そこの対策もしておく必要があります。

一方、ハードボタンを全部使いたいような場合、いちいちSetEventHandledを入れておくのも無駄な気がします。
そう言う場合はプログラムを強制的に終了させる「Stop」コマンドを使います。
通常、プログラムを終わらせるのはソフトキーの「ホーム」をタップして、ランチャ画面に戻りますね。したがって、
        If theKey=&h11 Then
            Stop
        End if
とすれば、イベントルーチン全体にSetEventHandledが有効になっていても、プログラムを終了させることができます。
ちなみに「ホーム」の文字コードは、NS Basicのバージョン、1.09以前は「&H6」だったのですが、それ以降は「&H11」になっています。
もし、古いランタイムを使っていそうな場合は、両対応にしておくと良いですね。


前へ     目次へ     次へ

第6回 Palmに動作を伝えよう 〜 イベントのお話 〜「5.ボタンを使う その2」