|
私が最初にPalmを手にした頃は、アクションゲームなどありませんでしたので、そういう使い方に慣れていないようです。 最近は、Zap!に代表されるような、Palmをゲーム○ーイに変えてしまうようなアクション系のゲームを見かけるようになりました。とはいえ、PDAなんだから、そんなにキーを酷使せんでも・・・と思っているのは、私だけでしょうか? さてさて、そのようなゲームをする時は、いちいちタップなどしているわけにはいきませんね。そう、下に並んだボタンを使うわけです。 Palmのデザインを見ると、中央の十字キーの左右に1つずつボタンがあり、右利きでも左利きでもゲームできるようにしました、ってデザインのように見えて仕方ないのですが、そのような激しいゲーム用途でなくてもボタンを使いたいことはあるでしょう。 今回は、NS Basicからでもボタンを使う方法についてお話したいと思います。 押されたボタンの情報を得るには、GetEventType()が、NsbKeyOrButton、というイベントであったときに、GetKey、という関数を使えばいいですね。 例えば、
Dim Ky as String
If GetEventType()=NsbKeyOrButton then
Ky=GetKey()
If ky=&h5 then
MsgBox "メニューを押したね"
End if
End if
このGetKeyで得られるキーコードは、マニュアルには、Upボタン(11)、Downボタン(12)と、ソフトメニューキー(5)の3つが書かれていますが、その他のキーについてはあまり記述がありません。実際のキーコードは、このようになっています。
(実際は、NS Basicに添付のサンプルプログラム SpecEvt を見てください。使い方も良くわかります。) 通常、1〜4のボタンを押したときは、すぐに、登録してあるアプリが起動しますね。これはPalmのウリの1つですが、NS Basicでプログラムを組んだときも同様に動作してしまいます。 たとえば、先ほどのサンプルを、ボタン4(一番右)に割り当ててみると、タイミングとしては、MsgBoxで、メッセージを表示した後に、登録アプリ(デフォルトだとメモ帳)が起動してしまいます。
Dim Ky as String
If GetEventType()=NsbKeyOrButton then
Ky=GetKey()
If ky=&h4 then
MsgBox "メニューを押したね"
End if
End if
登録アプリが起動するタイミングとしては、そのイベント、例えばがFormのEvent、が終了したときに発生するようです。 これを防止するのが、 SetEventHandled というコマンドです。 マニュアルには、 Palm OSデバイスのオペレーティング・システムに特別なイベントを無視するようにさせます。このコマンドは特別なイベントのコードを持つサブルーチン内で発せられるべきです。 とあります。要するに、オペレーティング・システムに特別なイベント、というのはボタンを押したときに登録アプリを起動するイベント等のことを表すようです。 先ほどの、サンプルで、MsgBoxの行の後にでも、 SetEventHandled を1つ入れておくだけで、ボタン4を押したときのアプリは起動しなくなります。 この方法を使うと、ボタンをプログラム中で使えるようになりますので、チョットした操作をするときに使うことができるでしょう。 しかし、注意する点がいくつかあります。 まず、無視される特別なイベントですが、これは、登録アプリの起動の他、そのキーに割り当てられたイベント全てが無視される点です。つまり、アプリケーションキー(6)や、電源ボタン(14)が使えなくなる危険性があるということです。 例えば、4つのボタンに処理を割り当てる目的で、次のようなプログラムを FormのEventに置くとします。
Dim Ky as String
If GetEventType()=NsbKeyOrButton then
Ky=GetKey()
Select Case Ky
Case &h1
'処理1
Case &h2
'処理2
Case &h3
'処理3
Case &h4
'処理4
End Select
SetEventHandled
End if
この場合、ボタン1〜4に対応して処理1〜4が実行されますが、キーを押したイベント内でSetEventHandledがありますので、全ての特殊イベントが無効となります。こうなったら、リセットするしかありません。このように複数のボタンを処理したいときは、Stopコマンドを使うと便利です。
Case &h6
STOP
これで、アプリケーションキーは有効に働くようになります。 ちょっと余談になりますが、NS Basicの Select 〜 Case は、 Case 1,2 というような複数の条件を記述できませんので、けっこう面倒ですね。次のバージョンでは何とかして欲しいものです。 もう1つの注意点は、無視されるイベントが、そのイベントプロシージャ内だけ、ということです。 当たり前のようですが、Formなど複数のイベントを持ったものでは、例えば、Afterイベント内に SetEventHandledを記述しても、Eventイベント内では無効になります。 これらのことに注意しながらプログラムすることで、NS Basicからでも、ボタンを使ったアプリケーションの開発ができるようになります。 これで、ゲームなどを作りやすくなりますね。 とはいえ、やはりPDAなんだから、そんなにキーを酷使せんでも・・・と思うのは私だけでしょうか? |