第八回講義 「簡単なゲームを作ろう—中編— 仮想画面の実現」

さてさて、前回の講義で既にほぼ目的は達成しているのですが、更に少し複雑な内容として、仮想画面を用いたものを作ってみたいと思います。

この仮想画面というものは、実際に画面に投影されている内容とほぼ一対一対応するもので、メモリ上に展開されているものを指します。つまり、メモリ上にあたかも画面に表示されているかのような情報を保管した領域を展開する事を意味するのですが、このような言い回しでは、Graphicを用いた場合はまるで、1ドットずつまで投影するのかと思われるかもしれませんが、実際はそうではありません。

例えばGraphic上で1キャラ当たりほ8×8の大きさとし、画面は640×400としますと、マス目は80×50になります。仮想画面で展開するのは、このマス目に相当するものであって、GVRAM全体を投影する必要はありません。というより、仮想画面にマス目を展開し、その内容に従ってG-VRAMに情報を正しく転送する(各マス目毎の絵をGVRAMへ転送する)ようにしてやればいいというわけです。


さてではこの仮想画面を作った場合を考えてみましょう。

(尚、今回から添付するSourceがかなり大きくなってきた為、各自でDOWN-Loadして頂く形を取りたいと思います)



このProgramでは、VirtualVRAMの項目以降に実際にText VRAMに投影したい内容をそのまま保管しています。あとはそれをTVRAMに転送しているというだけです(Randomで座標をはたいて、「O」を表示しているだけです)。

まぁこれだけではあまりありがたみがありませんので、今回の講義の本命である内容にさっさと入りましょう。



見た目の動作は前回のものと何ら変わりありませんが、Programの側で大きく違うのは、仮想画面によって衝突判定を行っている所です。

前回は目的物と自キャラの位置の重なりで判断していたのに対し、今回は目的物は既に仮想画面に展開されているとして、自キャラが移動した時に、果たしてその場所に目的があるのかどうかを仮想画面上で調べています(仮想画面上で自キャラの位置に相当する場所に目的があるかどうかを調べるという事です)。

さてこれだけでは、前回より処理がやや複雑化し、更にProgramも長くなってしまっており、殆ど利点など感じられないかもしれません。

では次に目的物以外に、障害物をおくようにしてみましょう。



障害物は「#」となっていますが、この障害物との衝突判定も仮想画面を用いています。ここでもし仮に障害物との衝突判定に前回のような座標の重なりによるものを用いたとしましょう。あらかたの予想はつく事と思いますが、いちいち1つづつcmp-jzによって分岐をしていく事となり(或いはif-thenによると考えて頂いても差し支えありません)障害物の数が多くなれば多くなるほど、判定時間がかなりかかるようになってきます。それに対し、仮想画面によった方法では、単に目的物と障害物を展開しておけば、自キャラを投影する時に「果たしてそこに何があるのか」を判定すればいいようになります。

少なからずとも、自キャラがどのような状態かを問う場合(シューティングゲームなど)ではこのような方法が最も適していると思います。

例えば、敵キャラ・敵玉・障害物を仮想画面に展開し、さらに自キャラを表示する際にそれらとの重なりを仮想画面上で調べ、また自キャラが玉を打ったとしたら、その玉がどこにあるのかを仮想画面上で調べて敵と重なったかを調べる事ができます。特に敵数が増した場合や玉数が無数の場合には座標の重なりを調べる方法よりも、更にこの仮想画面による方法の方が高速化できる事でしょう(但し、仮想画面に一旦展開するという作業が必要となりますが)

また、仮想画面に展開した情報がそのまま実画面に投影されるようになっていますので、仮想画面の方で(単にメモリ上で)ちょっとした操作(アニメーション)などを行えば、それがそのまま実画面に写しだされますので複雑な操作も比較的自由にできるようになる事でしょう(ちなみに、GVRAM上で直接Animationをさせるというのはチラツキ現象などの不具合が多く、大抵は裏画面を用意したり、或いは仮想画面による操舵をしたりします)。

また、仮想画面ではベタに実画面をそのまま持つ必要はないということを冒頭に述べましたが、その事を考えると、然程メモリも沢山消費しないと思われます。80×50でもその使用方法にもよりますが、500 Bytes〜4000 Bytes程度となると思います(500 Bytesなのは、1 Bit = 1 Charだからで、4000 Bytesなのは1 Byte = 1 Charだからです)。


ちなみに、Text VRAMというのもTVRAM上に一旦文字列情報を展開した上でその内容を画面に投影するようになっていますが、これもある意味仮想VRAM(仮想画面)のようなものなのかもしれません。


さて、今回の講義では仮想画面の導入というだけですので、Sourceが長くなった事をのぞけば内容は然程難しいものはありません。

次回講義ではいよいよProgramを組むという事も最後となります。

「味付け」という事で以前宣言しましたように、ちょっとした昔風のゲームっぽいものを作ってみたいと思います。


Back


手元に実機も実行環境もありませんのでサポート不可です。

文章は執筆当時のものをそのまま掲載していますので、時代・時節と合わない表現が含まれています。

また、一部に半角カナ文字が使用されています。