初心者のためのゲームプログラミング入門

プログラミングとゲームの杜

初心者のためのプログラミング入門 & ゲームプログラムの作り方入門

人生一度はやってみよう MSX Basic 入門

9.カーソル指定と入力操作

 

これからはゲームプログラミングっぽいことを始めます。
一般的なプログラミング入門とは違います。

命令を覚えることは大切ですが、それよりも画面の中に世界を
構築していくワクワクを楽しんでください。

小説を読むとき、頭の中で世界をイメージしますよね。
同じように画面の中の世界をイメージしていきましょう。

 

前回の作業でスクリーンモードを0にしているなら
screen 1 [エンターキー]
を実行してから始めてください。

 

 

カーソル位置を指定しよう

カーソル位置を変更する命令LOCATEを使ってみましょう。

PRINT 命令はカーソルの位置に表示を行います。
つまり LOCATE を使えば画面の好きなところに表示できるのです。
x座標(横軸)とy座標(縦軸)を指定して使います。

LOCATE <x座標>, <y座標>

 

x座標を変えて大文字のO(オー)を3つ表示してみます。
x座標は 0 と 2 と 7 としました。

LOCATEでカーソル位置を指定する

 

実行結果です。
3つともy座標は0なので、画面の一番上に表示されます。

LOCATEでカーソル位置を指定する

OKのOの位置がx座標0なので、0,2,7の位置に表示されているのが
分かると思います。

 

次の例を見てください。
:(コロン)を使うと命令をつなげて書くことができます。
この方が見易いですね。

LOCATEでカーソル位置を指定する

 

:(コロン)の場所は次のところにあります。これから何度も使いますよ。

コロンキーの場所

 

y座標を指定してみましょう。

LOCATEでy座標を指定する

 

x座標は0にしたので、OKの上にそれぞれ表示されています。

LOCATEでy座標を指定する

 

分かりましたか? それでは
次のように表示するプログラムを LOCATE を使って作ってください。

locateを使ってOを表示する

正解の例です。
xとy座標をそれぞれ1つずつ増やして表示しています。

locateを使ってOを表示する

 

 

押されたカーソルキーを調べる

ゲームでプレイヤーを動かすには入力情報が必要です。
今回は押されたカーソルキーを調べる命令STICKを使ってみます。

これは外部接続されたジョイスティックの情報を得るための命令ですが、
キーボードのカーソルキーにも対応しています。

 

次のプログラムを入力しましょう。

stickで押されたカーソルキーを取得する

STICK(<番号>)

STICK(0) でカーソルキーが押されたかを確認できます。

 

番 号 デバイス
0 カーソルキー
1 ポート1に接続されたジョイスティック
2 ポート2に接続されたジョイスティック

 

実行したら、左右のカーソルキーを交互に押してみましょう。
何もしないときは0ですが、右キーで3、左キーで7を表示します。
なお、下キーを押すとプログラムを終了します

stickで押されたカーソルキーを取得する

 

STICKの命令は0から8までの数を返します。

上キーは1、下キーは5、上キーと右キー同時押しで2を返します。

stickでカーソルキーの

 

 

移動操作をやってみよう

作業の前に SCREEN 0 で40x24文字のテキストモードに変更します

下図は左右キーでGの文字を左右に動かすプログラムです。
入力しましょう。

左右のカーソルキーでGの文字を左右に動かす

行番号50の PRINT” G " では、Gの左右にスペースが入っています
スペースを入れずに “G” とすると正常に動きません。

 

実行したら、左キーまたは右キーを少しだけ押してGが移動することを確認しましょう。

左右のカーソルキーでGの文字を左右に動かす

文字Gを動かす仕組みは簡単です。
変数Xに1を足すと右へ、1引くと左へ移動します。
押されたキーにより足すか引くかを実行すれば、Gは動かせるのです

 

 

なお、文字Gを右へ動かし続けると、改行後に止まってしまいます。
また、左端まで移動させると、下図のようにエラーになります。

左端までGを移動するとエラーになる

 

左へ移動させすぎると変数Xはマイナス値になるため、LOCATE命令でエラーとなります。

LOCATEにマイナス値を入れるとエラーになる

 

とりあえず、エラーを出さないようにします。
LOCATE にマイナス値を入れないように行番号45を追加します。

LOCATEでエラーを出さないようにする

実行したら文字Gを左端まで移動しましょう。
するとエラーは出ず、Gは左端で止まります。

 

このプログラムには中断機能がありません。
中断するにはCtrl+Fn+F9です。(Windowsの場合)
(ファンクションキーがちゃんとあり Fn キーが無いときはCtrl+F9
(Mac ではcontrol+fn+F9

 

ところで「何でこんなことをしているのか?」と思う人もいることでしょう。
このような処理は、キャラクターを動かす古くからある方法なのです。

最近のゲームでも使われたりしている基本中の基本です。
そう考えるとゲームの仕組みって思いのほかシンプルだったりします。
(複雑なものも沢山あります)

 

 

壁を作ってみよう

いま文字Gは自由に動かせます。(左右のみですが)

近くに文字Hを表示して、Gの動きを制限したいと思います。
つまり、Hを壁とする訳です。

行番号45を変更し、行番号55を下図のように追加しましょう。

文字Hを壁として表示する

 

実行して左へ動かすと、GはHの横で止まります。

文字Hを壁として表示する

Gを右へ少し動かして、また左へ動かしてみてください。
Hを超えることなく横で止まります。

ゲームの仕組みとして、画面に表示すればそこに物質が発生する訳ではなく
内部で動きを制限するプログラムを作ることになります。
(こういう言い方をすると夢がない感じですね)

 

それではGの右側にもHを表示してみます。
行番号57を追加しましょう。

Gの右側にも文字Hを表示する

 

このまま実行すると、Gを右へ動かしたときHをすり抜けてしまいます。
止めるための内部処理が無いからです。

 

では、内部処理を入れていきましょう。
行番号47に、右側のHで止まる処理を追加しようと思います。
さて、オレンジのところに入る数値はいくつになるでしょう?
実際に試してから正解を見るといいですよ。

右側のHでGを止めるプログラム

正解は23でした。
Hの座標が25、その左側に表示したいなら24を指定することになります。
しかし、Gの表示には左右にスペースが入っているので、さらに−1する必要があります。

右側のHでGを止めるプログラム

 

キー入力により何かを動かすこと、その行動を制限することを学びました。

今回は「なるほど、何となく分かったかも」でかまいません。
作っていく工程を楽しんでください。

 

 

行番号を付け直してみよう

今回の学習では、プログラムを追加する場面が多くありました。
そのため行番号の間隔がバラバラです。

これを10間隔で整頓したいと思います。
そのための命令RENUMを覚えましょう。

RENUM [エンターキー]

これで10間隔になります。

renumで行番号のつけ直しをする

 

パラメータを指定して、並びを変えることもできます。

RENUM [<新行番号>][, <旧行番号>][, <増分>]

 

RENUM 100 とすれば、行番号100から並びます。

renumで行番号を100から並べる

 

RENUM 100,,20 とすれば、行番号100から20ずつの間隔で並びます。

renumで行番号を100から20間隔で並べる