WebMSXでMSX BASICの自作ゲーム作成!第三弾。
VRAMを弄ってブロックの絵にしたいと思います。
とりあえず簡単な2色です。
カラフルな多色刷りはまた今度ということで。
VRAMには様々な絵に関するデータが入っています。
文字の形や、文字の色、スプライトデータとか、画面上の文字だとか。
その各アドレスに8bit(2進数で8文字 00000000とか)のデータが
入っていて、それらに直接アクセスし、データを書き換えることで
文字の形などを変えてやるというものです。
このURLクリックで、今回のプログラムがWebMSXで
実行できます。
http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/move (2).dsk
ソースコードを。
10 SCREEN1,2,0:DEFINTA-Z:KEYOFF:
WIDTH32: COLOR15,5,1
20 H2 = 1:X=128:Y=160
30 FOR J=0 TO 7:S$="":FOR I=1 TO
32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 A1=ASC("A"):D$=" ":RESTORE 100
0
50 FOR I=0 TO 7
60 READ D$
70 VPOKE A1*8+I,VAL("&B"+D$)
80 NEXT
90 VPOKE &H2000+A1¥8,&H1D
100 LOCATE 0,22
110 G$="AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA":PRINT G$
120 S=STICK(0):TG=STRIG(0)
130 IF S=3 THEN X=X+4
140 IF S=7 THEN X=X-4
150 IF S=1 THEN Y=Y-4
160 IF S=5 THEN Y=Y+4
170 H2=-H2:IF JF=1 THEN H2=-1
180 IF S=3 AND H2=1 THEN H=0
190 IF S=3 AND H2=-1 THEN H=4
200 IF S=7 AND H2=1 THEN H=1
210 IF S=7 AND H2=-1 THEN H=5
220 IF X<0 THEN X=0
230 IF X>240 THEN X=240
240 IF JF=1 THEN 270
250 IF TG=0 THEN 330
260 JF=1:JY=-8:JC=6
270 IF JC=0 THEN 300
280 IF TG=0 THEN JC=0:GOTO 300
290 JC=JC-1
300 IF JC=0 AND JY<8 THEN JY=JY+
2
310 Y=Y+JY
320 IF Y>160 THEN Y=160:JF=0
330 PUTSPRITE 0,(X,Y),7,H
340 PUTSPRITE 1,(X,Y),11,H+2
350 GOTO 120
500 DATA 2E,2D,67,7E,78,7C,38,06
,16,17,0F,14,1D,07,0F,0F,F0,F8,8
0,00,00,00,00,00,E0,70,70,20,50,
80,80,E0
510 DATA 0F,1F,01,00,00,00,00,00
,07,0E,0E,04,0A,01,01,07,74,B4,E
6,7E,1E,3E,1C,60,68,E8,F0,28,B8,
E0,F0,F0
520 DATA 10,10,18,00,01,01,01,00
,00,00,00,03,00,00,00,00,00,00,1
0,50,D8,F0,E0,00,00,00,00,00,00,
00,00,00
530 DATA 00,00,08,0A,1B,0F,07,00
,00,00,00,00,00,00,00,00,08,08,1
8,00,80,80,80,00,00,00,00,C0,00,
00,00,00
540 DATA 00,1E,5D,4B,7E,78,7C,38
,06,0D,1D,0D,16,2B,38,1E,00,E0,F
8,80,00,00,00,00,00,E0,F0,30,20,
D4,3C,38
550 DATA 00,07,1F,01,00,00,00,00
,00,07,0F,0C,04,2B,3C,1C,00,78,B
A,D2,7E,1E,3E,1C,60,B0,B8,B0,68,
D4,1C,78
560 DATA 00,20,20,30,00,01,01,01
,00,00,00,00,00,00,00,00,00,00,0
0,10,50,D8,F0,E0,00,00,00,C0,C0,
00,00,00
570 DATA 00,00,00,08,0A,1B,0F,07
,00,00,00,03,03,00,00,00,00,04,0
4,0C,00,80,80,80,00,00,00,00,00,
1000 DATA 10000001
1010 DATA 10000001
1020 DATA 11111111
1030 DATA 11111111
1040 DATA 00011000
1050 DATA 00011000
1060 DATA 11111111
1070 DATA 11111111
今回の追加は
40 A1=ASC("A"):D$=" ":RESTORE 100
0
50 FOR I=0 TO 7
60 READ D$
70 VPOKE A1*8+I,VAL("&B"+D$)
80 NEXT
90 VPOKE &H2000+A1¥8,&H1D
100 LOCATE 0,22
110 G$="AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA":PRINT G$
と、
1000 DATA 10000001
1010 DATA 10000001
1020 DATA 11111111
1030 DATA 11111111
1040 DATA 00011000
1050 DATA 00011000
1060 DATA 11111111
1070 DATA 11111111
です。
一番シンプルでわかりやすくなっていますので、
データは2進数になっております。
40行
40 A1=ASC("A"):D$=" ":RESTORE 1000
文字Aのアスキーコードを取得しています。
文字にはすべて番号がついております。
今回はAの文字の形をブロックに変えます。
Aの文字がVRAMのどのアドレスにはいっているかを知るために
アスキーコードが知りたかったのです。
RESTORE 1000
はDATA文を1000行目から読んでねというものです。
50~80行目は、
50 FOR I=0 TO 7
60 READ D$
70 VPOKE A1*8+I,VAL("&B"+D$)
80 NEXT
READ文でDATA文の横一列のデータを読みます。
今回は、DATA 10000001の
8文字です。
VPOKEは、VRAMの指定したアドレスのデータを書き換えます。
VPOKE アドレス,データ
A1*8+Iは、
ある文字のアスキーコード*8で、その文字が入っているアドレスがわかります。
その先頭アドレスから、8つ分で一文字ですね。
文字は8x8ドットで定義されていますので、1バイトに横一列分のデータ(8ドット分)が
入っています。
(VRAMの一番最初の方のアドレスには、文字の形のデータが入っています。)
VALは文字を数字に直す命令。
&Bは2進数を表します。先頭につけないと、2進数か10進数か、16進数かわからない
ですよね。ちなみに16進数は&Hです。10進数はつけなくてもかまいません。
90行は
90 VPOKE &H2000+A1¥8,&H1D
文字の色を変えます。
文字の色は、&H2000のアドレス以降に入っています。
SCREEN1では、8文字ごとに色が変えることができます。
色を変えると8文字いっぺんに変わってしまいます。
+A1¥8では、文字Aのカラーコードのアドレスを指定しています。
¥は、16¥2なら、値が8となります。
17¥2でも値は8です。余は捨てられます。
+A1¥8なのは、8文字で1つの色なので。入っているアドレスも8で割った商です。
後半の&H1Dは文字の色です。16進数です。
color 1 黒とcolor D 紫(color 13)です。
1000 DATA 10000001
1010 DATA 10000001
1020 DATA 11111111
1030 DATA 11111111
1040 DATA 00011000
1050 DATA 00011000
1060 DATA 11111111
1070 DATA 11111111
1が黒で、0が紫ですね。
ブロックの表示は一番簡単な方法で、
100 LOCATE 0,22
110 G$="AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA":PRINT G$
LOCATE 0,22は文字表示の位置を指定するものです。
もうちょっといい風にしたいですが。
まだブロックとの当たり判定はいれていません。
ちょっと当たり判定をやってみたのですが、かなり遅くなってしまうのですよね〜
今は、
IF Y>160 THEN Y=160
という軽くてシンプルな方法です。
ブロックのデータの読み込みを16進数に変えるのは、
70 VPOKE A*8+I,VAL("&H"+D$)
&Bの2進数だったところを、&Hの16進数に変えるだけです。
1000 DATA 7E,7E,00,00,E7,E7,00,00
データは1行になります。
2進数から16進数への変換は、今はツールがあるので、探してみてください。
ちなみに私は、
TinySprite 0.4.7 - MSX Sprite Editor
で8x8ドットだけドットを打って、コピペしています。
16x16ドット用なので使い勝手が悪いですがw
ちょっと絵を描けばこのくらいの感じになります。
http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/move (3).dsk
ブロックとの当たり判定を入れたら、あとはマップと、敵を入れたら
ゲームっぽくなりますね。
今はまだいいですが、やっぱりスピードが足りないです。
一部でマシン語を使いたくなります。
がんばるか〜w
最後に、
iphoneとandroidでアプリを作っております。
MSXっぽいアプリで、横スクロールランアクションゲームです。
8ドットカクカクスクロールです!
こちらもよろしく、です!
次のページ