INKEY$でリアルタイム入力する

さて、ボールと壁のことはひとまず置いておいて、ボールが壁に当たって跳ね回る無限ループの中に、"==="イコールを3つ並べたラケットを画面下部に表示する。そして、ボールの移動と同じ要領で左右に動かせるようにする。

ところが今度はボールの時と違い、プレーヤーの指示に従って動かす必要がある。そこで今回は、"<"キーを押している間は左に、">"キーを押している間は右に動かすようにすることを考える。("<",">"は視覚的に左右と直感しやすいが、入力には"Shift"キーと一緒に押す必要があるので、実際には"Shift"を押さない状態で入力される"<"→","と">"→"."を使うことにする。)

#ref(): File not found: "racket.png" at page "ラケットを左右に動かせるようにする"

ここでは簡単のために、これまでに作った「壁の中をボールが跳ね回る」プログラムとは別に、まずは、ラケットを左右に動かすプログラムをだけを作ろう。

これまで、キーボードからの入力はINPUT文を使うことを学んだが、INPUT文だとその場で入力待ちとなり、その間、ボールも止まってしまってゲームにならない。すなわち、プログラムを止めずにリアルタイムにキー入力を得る必要がある。これにはINKEY$を使うと良い。

INKEY$は最後に"$"が付いているので文字列変数と同じである。ただ違うのは、その瞬間に押されていたキーの文字が、リアルタイムに代入されている特殊な文字列変数ということである。

100	CLS
110	'--- ラケットの座標 BX,BY 移動方向 BM 持ち玉数 BALL
120	BX=38:BY=22:BM=0:BALL=3
130	'--- 最初のラケットの表示
140	LOCATE BX,BY:PRINT "==="
150	'--- メインループ 持ち球がある間はゲームが続く
160	WHILE BALL>0
170		'--- 押されているキーを読み取る
180		K$=INKEY$
190		'--- 左右(,.)のキーが押されていたら移動方向をセットして *MOVE へ
200		IF K$="," AND BX>20 THEN BM=-1:GOSUB *MOVE
210		IF K$="." AND BX<56 THEN BM= 1:GOSUB *MOVE
220	WEND
230	END
240	'--- ラケットを表示するサブルーチン
250	*MOVE
260		'--- ラケットを消す
270		LOCATE BX,BY:PRINT "   "
280		'--- ラケットの座標を計算して表示
290		BX=BX+BM:BM=0
300		LOCATE BX,BY:PRINT "==="
310	RETURN

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS