• 検索結果がありません。

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

' 壁作成

Print

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

端末はタブレットだったので、Blue

Tooth

キーボードを使ったのでこのせいかもしれません。

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

 サンプルに磁気センサの数値を 1

秒おきに表示していく