ニャオニャオ21世紀

アイデア。レトロゲーム(MSX、PCエンジン、ファミコン、メガドライブセガサターン)と、MSXのゲーム開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハック、電子工作ほか雑記を綴っています

MSX BASICでゲームを作ろう!第三弾。VRAMを弄ってブロックの形へ(URLクリックで実行できます)

MSXの機体の情報が一杯 これは必見の書籍!! 僕らの好きなMSXハードカタログ

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

 

f:id:nyaonyaokun:20180222065757p:plain

 

ソースコードを。


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

 

f:id:nyaonyaokun:20180222090911p:plain

 

ブロックとの当たり判定を入れたら、あとはマップと、敵を入れたら

ゲームっぽくなりますね。

今はまだいいですが、やっぱりスピードが足りないです。

一部でマシン語を使いたくなります。

がんばるか〜w

 

最後に、

iphoneとandroidでアプリを作っております。

MSXっぽいアプリで、横スクロールランアクションゲームです。

8ドットカクカクスクロールです!

 

8bit run run go

8bit run run go

  • nao21
  • ゲーム
  • 無料

  

play.google.com

 

www.nyaonyao21.com

 

 こちらもよろしく、です!

 

次のページ

www.nyaonyao21.com

 


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください