#author("2017-12-14T13:23:43+09:00","","")
**INKEY$でリアルタイム入力する [#j341288f]
さて、ボールと壁のことはひとまず置いておいて、ボールが壁に当たって跳ね回る無限ループの中に、"==="イコールを3つ並べたラケットを画面下部に表示する。そして、ボールの移動と同じ要領で左右に動かせるようにする。
#author("2023-01-31T10:39:43+09:00","default:maa","maa")

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

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

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

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

- まず、WHILE〜WEND で無限ループを作って、その中で INKEY$ の値を参照しよう。
- INKEY$の値が","の時、ラケットを左に1つ動かすには?
- INKEY$の値が"."の時、ラケットを右に1つ動かすには?
- ラケットが左右の壁を突き破ってしまわないようにするには?

 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