FreeDraw

作り始めたころは、自由にキャラ配置ができるのでシューティングが作れたらいいなーと思っていました。
しかし、実際使って見ると遅いことが判明…orz
重ねて表示することができるので、それを生かした使い方をするといいと思います…

 

●主な機能

描画;LOCATE座標の位置に、横幅1ドット単位、縦幅8ドット単位(1文字分)で表示できます。

グラフィックコピー:仮想VRAMを使用したキャラクタのコピーができます。

データクリア:指定アドレスから指定範囲を埋めます。0なら白、255なら黒

 

●準備

ユーザーエリアを確保します。RUN MODEでMON[RETURN]でマシン語モードに入り、USER 2F7[RETURN]で確保します。確保する範囲は2F7でFreeDrawプログラムサイズなので、+グラフィックサイズ分を確保してください。現時点で分からない場合は大きめに確保しておくといいでしょう。
組み込みたいプログラムに書きこみプログラムを追加します。プログラムリストはページの一番下にあります。場所はどこでもいいですが、ゲーム等のプログラムに組み込んだ場合、実行時には毎回書き込みプログラムを実行するようにしてください。

 

●描画

画面に表示します。
単位がそれぞれ違うので注意してください。

X=左上のX座標(LOCATE座標
Y=左上のY座標(LOCATE座標
W=表示横幅(1ドット単位
H=表示行数(LOCATE座標
S=仮想画面横幅(1ドット単位
D=グラフィック格納アドレス

X,Y,W,Hで位置、サイズを指定
Sの仮想画面横幅は、キャラクタがはみ出した場合や、横スクロールして画面を大きく使いたい場合に使います。
Wより大きいサイズを指定するとその差分でスクロールできます。
各変数に代入後、CALL &H12Dで表示します。

赤い枠が実際に表示される範囲、青くはみ出した枠がメモリ上での範囲です
上の場合なら、
X=3,Y=1,W=72,H=3,S=102,D=&H400
という感じです。
Hは1行が0から始まります。表示したい行数-1で指定してください。
グラフィックデータはメモリ上で連続しているので、次の行の始まりを計算するのに仮想画面の横幅の値を使っています。
コレを間違えるとずれます。スクロールが必要ない場合はW=Sにしてください。

●コピー

仮想画面を使用してゲーム画面を描画するときに、キャラクターグラフィックを直接仮想画面に送ることができます。座標は仮想画面に対してX,Y軸1ドット単位での指定ができます。
通常のGPRINTではもともとあったグラフィックは四角く消されてしまいますが、これは重ねて表示ができます。
背景グラフィックを用意して、それに重ね合わせることができます。

X=X座標(1ドット単位
Y=Y座標(1ドット単位
W=グラフィックの幅(1ドット単位
H=グラフィックの高さ(LOCATE座標
S=書き込み先の仮想画面横幅(1ドット単位
D=転送元アドレス
E=転送先アドレス

転送元アドレスは、送りたい仮想画面のアドレスを指定します。そのアドレスを先頭にX、Y座標から転送先を自動で計算します。
各変数に代入後、CALL &H15Fでコピーします。

赤い部分が表示用の範囲、青い部分がコピーしたい範囲です。
コピーの場合、座標は画面の座標ではなく、表示部分を基準にした座標を指定します。
X=26,Y=20,W=15,H=0,S=56,D=&H400,E=&H500
Hは1行が0から始まります。表示したい行数-1で指定してください。
2行にまたがっているため、次の行の位置を計算するためにSが必要です。これは書き込み先、実際に表示するデータのSと同じ値にしてください。

 

●クリア

指定範囲を指定データで埋めます。仮想画面のクリアや塗りつぶしをしたい場合に使います。

X=開始アドレス
Y=書き込むサイズ(byte
D=書き込むデータ

CALL &H20Eで書き込みします。

 

●注意

変数は整数部だけを取得するので、少数を含んでいてもかまいません。
エラーチェックをしていませんので、画面外になるような指定をすると思わぬ動作をすることがあります。
特に、コピー処理では間違ったアドレスを指定した場合、BASICプログラム領域に書きこまれたりすることがあります。プログラムを編集中はユーザーエリアを多めに取っておくことをお勧めします。
また、暴走した場合、確保していない領域にどんどん書き込んでしまうので、ポケコン内のデータはすべて破壊されると思ってください。編集中のバックアップは必須です。

 

●動作速度

描画、コピーともに約30回/秒で処理できます。
実際にゲームで使用した場合、描画とコピーはセットで使うものなのでこの時点で秒間15回しか描画できません。
多少妥協してでもGPRINTを使用したほうがいい場合がほとんどかと…

 

●変数一覧

表示 コピー クリア
X 左上X座標(LOCATE座標) 左上X座標(1ドット単位) 開始アドレス
Y 左上Y座標(LOCATE座標) 左上Y座標(1ドット単位) 書き込みサイズ
W 横幅(1ドット単位) 横幅(1ドット単位)
H 表示行数 表示行数
S 横幅仮想サイズ(1ドット単位) 横幅仮想サイズ(1ドット単位)
D グラフィック格納アドレス 転送元アドレス 書き込むデータ
E 転送先アドレス

 

●プログラムリスト

10:DIM M$(0)*50:AD=256:FOR I=0 TO 20:READ M$(0):FOR J=1 TO LEN(M$(0)) STEP 2:POKE AD,VAL("&H"+MID$(M$(0),J,2)):AD=AD+1:NEXT:NEXT
20:DATA 0000000000C8780000000000000010780878187890783878B0
30:DATA 78A8780000000000000000000000000000000000CD27023A20
40:DATA 01473A1C015F3A1E01572A2601CDD0BFED4B24012A26010922
50:DATA 26013A1E013C321E013A22013D322201F8C33001CD27023E00
60:DATA 322C01CD7E01CD27023A1E01C608321E013E01322C01CD7E01
70:DATA C92A1C013A1E01CDF60115FA9201ED4B24010918F5ED4B2801
80:DATA 092228012A2601ED4B28013A20015FCDCE013A22013DF82A28
90:DATA 01ED4B2401092228012A2601ED4B2001092226013A22013D32
100:DATA 2201F8C39A01CDDB01570AB20223031DC818F33A2C01FE0128
110:DATA 0A3A2A013C577ECDF202C93A2B013C577ECDEC02C916001E00
120:DATA FE083805D6081418F7322A01473E0890322B01C9CD27022A1C
130:DATA 01ED4B1E013A2601773E00230BB820F5B920F2C9210E012209
140:DATA 01211C01220B013E07320D01DD2A0901DD6601DD6E00220501
150:DATA 2A09012323220901CD6802ED4B03012A0B0171237023220B01
160:DATA 3A0D013D320D0120D1C92A0501237E1605CDEC023202010100
170:DATA 00ED430301444D030A1605CDEC0226006F220001CDC2022A00
180:DATA 01ED5B0301192203013A02013D320201F80AE60F26006F2200
190:DATA 01CDC2022A0001ED5B0301192203013A02013D320201F818BC
200:DATA 3A02013DF8CDCC0218F9C5E52A0001CDE502CDE502ED4B0001
210:DATA 09CDE502220001E1C1C9CB24CB25D024C915C8CB3F18FA15C8
220:DATA CB2718FA

ちょっと長いです。手打ちはつらいと思うので転送できるなら転送したほうがいいです。

説明下手ですいません。分からないことがあれば掲示板へドゾー
このプログラムはフリーです。ご自由にどうぞ!
なにか作ってサイトで公開したら教えてくれるとうれしいです