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

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

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

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

12.カタツムリ散歩ゲームを作ろう

 

MSX は1980年代のパソコンです。
今のパソコンと比べ、性能はかなり低いです。
Basicでゲームを作ろうとしても、動きが遅すぎて
速さを要求するゲームは作れませんでした。

これを何とかしようとBasic+マシン語に挑戦する人も多かったです。
マシン語とはコンピュータが理解できる言語です。
Basicは人が理解できる単語で構成されているので、実行するとき
コンピュータのために翻訳する必要があります。そのため遅くなります。
マシン語は翻訳しなくていいので速いのです。

そんな遅いBasicを使い、またゲームを作って行きましょう。
いつか、+マシン語のゲームにも挑戦したい気もしますが
初心者向けの入門サイトとしてはどうなのでしょうか?
悩みます。

 

 

グラフィカルなゲーム

前回のゲームは、絵ではなく記号を使いました。
今回は絵も描いてみようと思います。

学習のハードルが上がり過ぎないように、ゲームルールはシンプルにしました。
そのため面白さも控え目です。
それでも色々と教えたいことが多いです。

 

さてこれから作るものは、カタツムリが穴に落ちないよう橋を移動して
助けるゲームです。

 

橋を移動してカタツムリを助けるゲーム

緑の丸4つが橋です。黄色いのがカタツムリです。
ドットの粗い絵ですが、これが1980年代です。
(もっと高解像度のパソコンもありましたけど…)
まぁ、レトロな感じがして良いのではないでしょうか。

 

作業を始める前に WebMSX を再起動してください。
(ページを更新するか、新しく開き直す)

プログラムの入力作業はスクリーンモード0で行います。
ゲームはスクリーンモード1で動かします。
桁数は40にします。

screen 0 [エンターキー]
width40 [エンターキー]

 

もし、プログラムが長くなり全体を見るのが大変になったら
80桁表示にしても良いと思います。(スクリーンモード0の場合のみ)

width80 [エンターキー]

 

 

初期設定と壁の表示

それでは始めます。
まずは初期設定です。いっしょに上下の壁も表示します。

初期設定と上下の壁プログラム

100 ' - - initial - -

これはコメントです。実行されません。
以前、コメントには REM を使うと説明しましたが、シングルクォーテーションでもコメントになります。
7のキーにあるので、Shiftキーを押しながら入力しましょう。

シングルクォーテーションは7のキーにある

 

COLOR15,1,1

画面の色を設定します。
COLOR 前景色、背景色、周辺色、となっています。
前景色はテキストの色です。周辺色とは、MSXの起動時に画面の周りが水色ですよね、その部分の色です。

MSXで使える色は下図の15色です。
下の文字は16進数です。普段の数え方ならAが10、Fが15です。
1は黒で、0は周辺色と同じ色になります。

MSXで使える色

 

SCREEN1,2

SCREEN 画面モード、スプライトサイズ、となっています。
画面モードの1は 32x24 のテキストモードです。
スプライトサイズの2は 16x16 のスプライトを使用します。

 

DEFINT A-Z

変数をすべて整数型として使うための宣言です。
処理速度を少しでも上げたい時に使います。

 

KEYOFF:WIDTH32

KEYOFFは、ファンクションキーを非表示にします。
WIDTH32 は文字の桁数を32桁にします。

 

STRING$(32,"#")

指定した文字を、指定した数だけつなげて文字列を作ります。
この場合、#を32個つなげた文字列になります。

 

200行目で入力待ちをしています。
キーを押されなければ200行でループします。

210行目は終了処理です。
スクリーンモードを0にして、画面の背景色を暗い青にします。

 

 

実行した画面を見てみましょう。

行番号130,140 で#の壁を、y座標0と22に表示しています。
しかし、実際はスクロールして y座標0の壁は画面外へ、y座標22の壁は座標21のところに表示されてしまいした。

壁を表示したがスクロールしてしまった

 

スクロールした理由は行番号140にあります。
画面と同じ桁数の文字列を表示したため、y座標23で改行コードが実行されたのです。
試しに#を30個に変更して実行してみましょう。

壁を表示したがスクロールしてしまった

y座標22で改行コードが実行されるためスクロールせず、予定通りの画面になりました。
これでスクロールの原因が y座標23で改行コードが実行されたためと分かりました。

 

そもそも改行コードとは何でしょうか?
今まで意識していないだけで、普通に使っていました。
下のサンプルを見てください。
ただのPRINT文ですが、実は自動で改行コードが付いて実行されていたのです。

ただPRINT文を実行すると改行コードが自動で付く

実行結果は改行が行われ、見やすく表示されてますね。

 

今回のように、改行コードを付けたくない時もあります。
そんなときはセミコロン;を使います。

セミコロンを付けて改行コードが付かないようにする

セミコロンの効果で改行コードが付かず、MSXBASICVer 2.0 と1行で表示されました。

 

それでは 140行目にセミコロンを付けましょう。
#の個数も32に戻します。

セミコロンを付けて改行コードが付かないようにする

 

実行してみましょう。
スクロールすることなく、指定したところに壁が表示されます。

スクロールすることなく上下に壁が表示される

 

 

通り道を3つ作ろう

カタツムリの通り道を3つ追加します。

文字列をつなぎ合わせ道を作る

 

A$=STRING$(8,"#")

#を8個つなげた文字列を A$ に代入しています。

 

B$=SPACE$(4)

空白を4個つなげた文字列を B$ に代入します。

 

PRINT A$+B$+A$+B$+A$

文字列と文字列の間に使う+は連結になります。

 

実行してみます。

通り道を3つ作った画面

空いているところは何も表示されていないのではなく、スペース(空白)が表示されていることを意識しましょう。

 

 

壁の絵を入れてみよう

#を使って壁を表示しました。
と言っても、#は#です。壁には見えません。

ここで#のデータを書き換えて、壁として見えるようにします。

#のキャラクターパターンを書き換える

 

今回、キャラクターパターンのデータ(DATA)の入力があります。
普通に入力すると面倒なので、次のようにすると良いです。

まずは310行まで入力します。
データの内容は0でも1でもいいので8個並べます。
入力したらカーソルを動かし、行番号を320に変更します。
そしてエンターキーを押して入力しましょう
これを行番号380まで繰り返します。

dataを入力するときのコツ

 

LISTでプログラムを表示します。
各行のデータを書き換えたら、310から380までをエンターキーで入力し直しましょう。
最後に、もう一度LISTを表示して入力ミスがないかチェックします。

dataを書き換えてエンターキーを押す

 

入力したら実行してみましょう。
#の文字が DATA のパターンと同じ絵に変わります。

#の文字が絵のパターンに変わる

 

スクリーンモード1の場合、1文字は8x8のドットパターンで出来ています。
今回はそのパターンを、次のように描き換えたのです。

1文字が8x8のドットパターンで描かれている

 

 

文字の絵の描き変え

文字の絵を描き変える方法を説明します。
分からない単語はネットで検索しましょう。
難しいと感じたら、プログラムの手順だけ覚えればいいです。

 

文字の絵のデータは VRAM 上のパターンジェネレータテーブルというエリアにあり、書き換えることができます。

書き換えをした部分が次の行です。

dataを読み取りvramを書き換える

190 A=ASC("#")

ASCはキャラクターコード(文字コード)に変換する命令です。
#が何番目の文字なのか調べています。

 

195 READ D$

DATA上の情報を変数 D$ に読み込みます。
この行は FOR により8回行われます。
先ほど入力した DATA は8行ありました。それを1つずつ読み込んでいます。

 

VPOKE A*8+I , VAL("&B"+D$)

VRAM 上にデータを書き込みます。
VPOKE アドレス, 書き込むデータ、になっています。
#の文字コードを調べたのはアドレスを算出するためです。
8倍することでアドレスが分かります。
なぜ8倍かというと、1つの文字は8バイトで構成されているからです。

1文字は8バイトで構成されている

 

VAL("&B"+D$)

読み込んだデータを2進数にして、VALで文字列を数値に変換します。
例えば D$ に 00000011 が入っていたら、&B を連結して &B00000011 の形にします。
これが2進数です。
ただ、実際は文字列なので VAL を使って数値に変換しています。

 

次回につづきます。