ワンポイントテクニック No.012

PRINT文でドット単位に表示する

 グラフィック表示を行う場合、GPRINTよりもPRINT(フォント書き換え)の方が速いのは明白なのですが当然ながらキャラクタ単位でしか表示されません。これが1ドット単位で表示できればフォント書き換えの活用場面が増えるのに・・・と考えている人も多いでしょう。
 しかし、擬似的にドット単位で表示を行うことは可能なのです。

 原理はすごく簡単で、1ドットずつずらしたキャラを6種用意(フォントが横6ドット単位で構成されているため)して順番に表示してやれば良いだけです。具体的にどのようにすればよいかは下記のサンプルを参考にしてみてください。
 なお、このサンプルではPRINTの高速化を行っています。

《 フォント書き換え版 サンプルリスト 》
10 CLS :CLEAR :DIM G$(5):E$="000000000000":G$=E$+"60F0F874747C7474F8F07060"+E$
20 FOR I=0TO 5:H=177+I*3:G$(I)=" "+CHR$ (H)+CHR$ (H+1)+CHR$ (H+2)+" "
30 FOR J=0TO 17
40 POKE &BFAE6+I*18+J,VAL ("&"+MID$ (G$,(J-I)*2+11,2))
50 NEXT :NEXT
60 POKE &BFC93,&80,&FA,&B:OPEN "SCRN:"FOR OUTPUT AS #1:X=99
70 K=VAL INKEY$:X=X+(K=1)*SGN X+(K=3)*SGN (X-215)
80 LOCATE X/6,2:PRINT #1,G$(X-INT (X/6)*6)
90 GOTO 70

 このサンプルを起動させると車が表示されますが、[1][3]を使い画面左右に1ドット単位で動いていることが分かるでしょう。このサンプルの80行を

80 GCURSOR (X,23):GPRINT G$

と変更すれば普通にGPRINTを使ったプログラムになります。メインルーチン1回当たりの実行速度はPRINTの方は45m秒、GPRINTの方は69m秒ということで1.5倍しか速くなってないのですが純粋な表示部分だけを見るとPRINTの方は9m秒、GPRINTの方は45m秒ということで5倍くらい速くなっています。そのため表示以外の部分をゲームに合わせて最適化すればさらに速くすることができます。

 あとフォント書き換えではなくOPASのスクロール機能を使えば6種のキャラを別途用意する必要はなく1種のキャラ(「アイウエ」のみ)で同等のものが作れます。

《 OPAS版 サンプルリスト 》
10 CLS :CLEAR :DIM G$(5):E$="000000000000":G$=E$+E$+"60F0F874747C7474F8F07060"+E$+E$
20 FOR I=0TO 35
30 POKE &BFAE6+I,VAL ("&"+MID$ (G$,I*2+1,2))
40 NEXT
50 POKE &BFC94,&FA,&B:OPEN "SCRN:"FOR OUTPUT AS #1:X=99
60 K=VAL INKEY$:X=X+(K=1)*SGN X+(K=3)*SGN (X-215)
70 POKE &BFC93,134-X+INT (X/6)*6:LOCATE X/6,2:PRINT #1,"アイウエ"
80 GOTO 60

 OPASを使用したものはキャラクタを切り替える必要がない分だけ高速動作が期待されますが、このグラフィックサイズだとフォント書き換えを使用したものと比べて速度的なアドバンテージはなく、アドレス演算部分が余計に必要であるためフォント書き換えよりも速度は速くなっていません。
 ただ、OPAS版もフォント書き換え版も表示座標計算はGPRINT用のものをそのまま流用しているのでこれをPRINT用に最適化することによりさらに速くすることが可能になります。1ドット単位ではなく1/6キャラ単位の座標計算にすることで6で割ったりかけたりする必要がなくなりますからね。
 ドット単位での移動といっても横方向だけなので使える場面は限られますが意外に応用範囲が広いので上手く使ってみてください。


RETURN

inserted by FC2 system