LIST
イベントは 3 文字とブランクで表されます。
1st: "d" ならディレクトリであることを意味します。
2nd: "X" 初期化, "O" オープン, "C" クローズ, "M" 移動, "D" 削除 3rd: "r" 読み込み, "w" 書き出し, "a" アトリビュートの変更
(X11-BASIC)
Watch "/home/holy/testx.bas"
Do
a$ = Fileevent$
If Len(a$) Print a$
Endif Loop End
(Result)
holy@mint ~ $ xbasic testx.bas
Watch descriptor for /home/holy/testx.bas is: 1.
--- -O-
--r -c-
-O- --r -c- -O-
--r -c-
-O- --r -c- -O- --r -c- ---
-O-
--r -c- -O- --r -c- -O- -O-
--r -c- --r
-c-
-O- --r
-c-ファイル関係の補足
Windows 版の X11-BASIC ではうまくいかない件があります。
現象は、ファイルを先頭から末尾まで一行ずつ読むはずが、
途中で読み終えてしまうという症状です。
テキストファイルを一行ずつ読む流れは、ファイル
Open、LineInput をループさせて Eof()でファイルの末行を 検出して、最後に Close というのが一種のテンプレートで す。公式マニュアルでも、下のリストのように「While Not Eof(#)」のサンプルが提示されています。
しかしこれが Windows で実行するとうまくいかないよう
です。実行したのは文字コードを SHIFT-JIS にして DOS プ
ロンプトで英文テキストを読ませようとした場合です。こ
れが文字コードを UTF-8 にして Cygwin で実行したらうまく
いってたかは不明。
これは、For〜Next でループさせて、途中に Exit If (Eof(#) =0)を入れて途中でループを抜けるようにしたらう まくいきました。
(X11-BASIC) ' eofilex.bas
' ファイルの行数を数えるそれぞれの方法 sFile$ = "input.dat"
Print "<< ex.1 >>"
iCount = 0
Open "i", #1, sFile$
While Not Eof(#1)
LineInput #1, sLine$
Print iCount, sLine$, Eof(#1) iCount = iCount + 1
Wend Close #1
Print "<< ex.2 >>"
Open "i", #2, sFile$
For k = 0 To 1000
Exit If (Eof(#2) < 0) Lineinput #2, sLine$
Print k, sLine$, Eof(#2) Next k
Close #2 Quit End
イベント処理
X11-BASIC におけるイベント関係コマンドです。とりあえ ず、公式マニュアルを検索して見つけた範囲で列挙します。
いろいろ取り揃えられております。
<string-result> = Inkey$ : 押されたキーの ASCIIキャラクタ文字を返しま す
Event : KeyEvent や MouseEvent や MotionEvent が起こるまで待機します a = EVENT?(mask%) : 待機中のイベントと mask値のタイプが一致するのなら 真を返します
MouseEvent x,[y, k, xroot, yroot, s] : マウスボタンを押すまで待機し ます
MotionEvent x, y, xroot, yroot, s : マウスが動くまで待機します
<int-result:x> = MouseX : マウス座標x
<int-result:y> = MouseY : マウス座標y
<int-result:k> = MouseK : マウスボタンの状態(k)
<int-result:s> = Mouse : Shiftキーや Controlキーの状態(s)
KeyEvent kc, ks[, t$, k, x, y, xroot, yroot] : キーを押すまで待機し ます
これらの代表的なものを実例を交えて説明していきます。
テキストスクリーンでのキーイベント
旧制 BASIC を好んで使う人たちに、Inkey 命令に相当する コマンドある/なしで、その BASIC の評価がかなり変わる と思います。テキストキャラクタを使った、いわゆるアク
ション系「ピコピコゲーム」を作るのに便利だからです。X11-BASIC はもともと ATARI GFA-BASIC の互換を目指して始
まったそうで、そのへんをさすがに分かってますね。この 命令と Locate 文を使えばテキストだけでいろいろとゲーム を作れます。
さて、X11-BASIC
公式マニュアルによると、変数:Inkey$
書式:<string-result> = Inkey$
説明:キーボードで押されたキーの ASCII
キャラクタを文 字列として返します。(例)
Repeat ! Wait until a
Until Len(Inkey$) ! Key was pressed
ということです。
Inkey$のキーイベントを使ったサンプルプログラムを次 に示します。テキスト表示のシンプルなゲーム「ぴこげー スカッシュ 」です。
(X11-BASIC) ' scashx.bas
' 河西朝雄、QuickBASIC初級プログラミング入門(下)、H2.05.30、技術評論 社
' p.30
Cls
' 壁作成
FOR k = 1 TO 58 Print "O";
Next k Print
For k = 1 To 17
Print "O"; Space$(56); "O"
Next k
For k = 1 To 58 Print "O";
Next k Print
Score = 0 ! 得点
y1 = 7 ! ラケットの初期位置 dx = 1 ! 反射因子
dy = 1
Locate 0, 10
Print "SCORE="; Score Locate y1, 53
Print "["
For n = 5 To 1 Step -1 Locate 0, 40
Print "BALL="; n x = 15
y = INT(2 + 10 * RND(1)) ! ボールの初期位置 While (x < 53)
Locate y, x Print "o"
' キー入力
K$ = INKEY$
If K$ = "z" Then @Up()
Else If K$ = "x" Then @Down()
Endif
' ラケットとのあたり判定
If x = 52 And (y1 - 3) < y And y < (y1 + 3) Then @Hit()
Endif
' 縦壁での反射
If x = 1 Then dx = -dx Endif
' 横壁での反射
If y = 2 or y = 18 Then dy = -dy
Endif
' 前のボールを消す
Delay 0.2 Locate y, x Print " "
' ボールを進める
x = x + dx y = y + dy Wend
Next n End
' ラケットを上に
Procedure Up() Locate y1, 53 Print " "
If y1 > 2 Then y1 = y1 - 1 Endif
Locate y1, 53 Print "["
Return
' ラケットを下に Procedure Down() Locate y1, 53
Print " "
If y1 < 18 Then y1 = y1 + 1 Endif
Locate y1, 53 Print "["
Return
' ラケットに当たった時
Procedure Hit() dx = -dx
Score = Score + 1 Locate 0, 10
Print "SCORE="; Score Return
グラフィクス画面でのイベント
ここからのイベント処理は、グラフィクス画面にフォー カスがあるときのイベントになります。つまり Openw 命令 なんかを使ってグラフィクスウィンドウを開く必要があり ます。Linux 版ではグラフィック命令を使えば勝手に開くよ うですし、Android でも勝手に切り替わるようです。
イベント処理に関係ありそうな項目を、とりあえず全部
まとめてみましたという命令がこちらです。
命令:Event
書式:Event typ,[x, y, xroot, yroot, s, k, ks, t$]
説明:KeyEvent や MouseEvent や MotionEvent が起こるまで
待機します。次のような値が typ に決められています。
typ = 6 : MotionEvent typ = 14 : MouseEvent typ = 2 : KeyEvent
x, y : ウィンドウに対するマウスポインタの位置 xroot, yroot : 画面に対するマウスポインタの位置 s : Alt, Caps, Shiftキーの状態
t$ : 押されたキーのキャラクタ
命令:Event?()
書式:a = Event?(mask%)
説明:グラフィクスで待機中のイベントと mask
値のタイプが一致するのなら、真(True)を返します。
mask = 1 : キープレス(押す)イベント mask = 2 : キーリリース(離す)イベント mask = 4 : マウスボタンプレスイベント mask = 8 : マウスボタンリリースイベント mask = 64 : マウス動作イベント
マウスイベント
PC の場合はマウス。Android の場合はタッチパネルにな
ります。ただし、マルチタッチとかには対応してません。
命令:MouseEvent
書式:MouseEvent x,[y, k, xroot, yroot, s]
説明:マウスボタンを押すことで、待機中のイベントを実 行します。
(x,y) ウィンドウに対するマウスポインタの座標 xroot,yroot 画面に対するマウスポインタの座標
それとマウスボタンの状態と Alt/Shift/Caps
キーの状態です。
変数:MouseX, MouseY, MouseK, MouseS
書式:<int-result:x> = MouseX
<int-result:y> = MouseY <int-result:k> = MouseK <int-result:s> = MouseS 説明:次の値が入ってます。
マウス座標(x,y)
マウスボタンの状態(k) k=0 ボタンが押されてない k=1 左ボタン
k=2 中央ボタン
k=4 右ボタン(またはそれを類する状態) Shiftキーや Controlキーの状態(s) s=0 特に押されてない
s=1 Shift s=2 CapsLock s=4 Control
s=8 Alt
s=16 NumLock s=64 Windows-Key
s=128 ScrollLock またはそれに類する状態
命令:MotionEvent
書式:MotionEvent x, y, xroot, yroot, s
説明:マウスが動くまで待機するイベントです。
(x, y) ウィンドウに対する新しいマウスポジション
(xroot, yroot) 画面に対する当たらしいマウスポジション Alt/Shift/Capsキーの状態
キーイベント
端末や OS によってキーコードが違います。私が試した中 では、Linux であり Debian Ubuntu
系である Mint と Lubuntuではキーコードは同じでした。しかし、Android
端末は違っていました。Android
端末はタブレットだったので、BlueTooth
キーボードを使ったのでこのせいかもしれません。Windows も異なってました。
X11-BASIC のシステム変数として OS を見分ける変数があ りますので、マルチプラットホームを目指したプログラム を作成されたかたは、それを利用したら良いと思います。
命令:KeyEvent
書式:KeyEvent kc, ks[, t$, k, x, y, xroot, yroot]
説明:キーを押すことで、待機中のイベントが実行します。
キーイベントの変数は次のとおりです。
kc キーコード
ks Shift/Control/Alt等の状態 t$ corresponding character
x ウィンドウに対するマウスポインタの座標x
y 同じく座標y
xroot 画面に対するマウスポインタの座標x
yroot 同じく y座標 k マウスボタンの状態
まずは、キーコードを調べる方法。
> keyevent a
なにかキーを押す。するとプロンプトが出るので
> Print a
すれば、変数 a に代入されたキーコードが出力されます。
いちいち、そんなこと入力してられないので連続打鍵し てコードを調べられるようにしましょう。それがこちら。
(X11-BASIC) ' keypressx.bas
' 端末のキーコードを取得するプログラム ' Main()
Openw 1
Text 1, 10, "Press Any Key"
ShowPage Do
Keyevent kp Print Str$(kp) Delay 0.5
Loop End
Android
センサAndroid
端末のセンサーを X11-BASIC で制御する方法を紹 介します。主に Sensor と名のつく関係のコマンドです。ご 承知だと思いますが Android 端末一般は、Google がAndroid OS を搭載する端末として認めてるだけで、基本ど んなセンサーを搭載するかはメーカにより異なります。で すので各自の端末にどんなセンサが搭載されてるかは機器 のマニュアルを参照してください。ただし OS は Google の
管轄下なので、どのチャンネルがどんなセンサに対応するかは仕様で決められてるはずです。
まあ壊れるものじゃないので、X11-BASIC をインストール すると付いてくるサンプル sensortest.bas を実行してどん な反応があるのか試してみればいいと思います。そういう お気楽さが BASIC のいいところです。
Sensors 関係の命令
センサー機器について、Sensor コマンドにより取り扱え るようになりました。詳しくは、サンプルプログラムの sensortest.bas を参照してください。
命令:Sensor
書式:Sensor ON
Sensor OFF
説明:センサのスイッチを ON/OFF します。加速度センサ、
温度センサ、気圧センサ、光センサ、湿度センサ、ジャイ
ロスコープ、等。
変数:Sensor?
書式:a = Sensor?
説明:この端末で使用できるセンサ数を返します。使える
センサがなければ、このシステム変数は 0 になります。加 速度センサ、温度センサ、気圧センサ、光センサ、湿度センサ、ジャイロスコープ、等。
(例)
(X11-BASIC アプリを起動して「>」というプロンプトが現れたら)
> Print Sensor? [Enter]
32 ←32個あるよと返ってきました。
>
関数:Sensor()
書式:a = Sensor(n)
説明:第 n
番のセンサーの値を返します。通常、0 : 温度 1 : 照度 3 : 近接
4 : バッテリー 6 : 加速度x 7 : 加速度y 8 : 加速度z
9 : 姿勢 x 10 : 姿勢 y 11 : 姿勢 z
X11-BASIC のサンプルプログラム sensortest.bas より、
Temperature: 0 ーC Pressure: 1 hPa Light: 2 lux Proximity: 3 cm OrientationX: 4 deg OrientationY: 5 deg OrientationZ: 6 deg GyroX: 7 rad/s
GyroY: 8 rad/s GyroZ: 9 rad/s Mag. fieldX: 10 uT Mag. fieldY: 11 uT Mag. fieldZ: 12 uT Accel.X: 13 m/s2 Accel.Y: 14 m/s2 Accel.Z: 15 m/s2 Temperature: 16 ーC Humidity: 17 % RotationX: 18 RotationY: 19 RotationZ: 20 GravityX: 21 m/s2 GravityY: 22 m/s2 GravityZ: 23 m/s2 Lin.Acc.X: 24 m/s2
Lin.Acc.Y: 25 m/s2 Lin.Acc.Z: 26 m/s2 MotionX: 27
MotionY: 28 MotionZ: 29 Game rot.X: 30 Game rot.Y: 31 Game rot.Z: 32
Mag. uncal.X: 33 uT Mag. uncal.Y: 34 uT Mag. uncal.Z: 35 uT Gyr. uncal.X: 36 Gyr. uncal.Y: 37 Gyr. uncal.Z: 38 Step count: 39 Step detect: 40