ニャオニャオ21世紀

雑記と、MSXぽいアプリ開発と、ゲーム関係、身体(身体意識など)、ライフハックほか雑記を綴っています

WebMSXでMSX BASICの自作ゲーム作成!第五弾。 多色刷りでカラフルに!(URLクリックで実行できます)

 

ブロックをカラフルにしたいと思います。

前回は、1キャラクター(8x8ドット)当たりに、

2色にしか出来ませんでした。

それも8文字1セットでしか色変えが出来ませんでした。

 

今日は、1文字ごとに1ライン8ドット2色に挑戦します。

プログラム的にわかりやすくするために単純な書き方をしています。

ご了承ください。

URLクリックで実行できます。

 

http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/color (3).dsk

 

f:id:nyaonyaokun:20180224082610p:plain

 

デザイン的にはアレですけど、カラフルになりました!

これを応用していけば、見栄えだけは商用のゲームと同じような

ものがつくれます!

(絵の書き換えとかスピードではだめだめですがw)

 

 

それではソースコードです。

 

10 SCREEN2:COLOR15,1,5:SCREEN1,2,0:DEFINTA-Z:KEYOFF:WIDTH32
15 DEFUSR=&H7E:A=USR(0)
20 H2 = 1:X=128:Y=160:XX=4:YY=4
30 FOR J=0 TO 7:S$="":FOR I=1 TO32:READD$:S$=

S$+CHR$(VAL("&H"+D$)):NEXT:SPRITE$(J)=S$:NEXT
40 A1=ASC("A"):D$=" ":RESTORE 1000
50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)
90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)
96 NEXT
100 LOCATE 15,15:PRINT "AAA"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "AAA"
140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX,A1

160 NEXT
170 S=STICK(0):TG=STRIG(0)
180 XX=0
190 IF S=3 THEN XX=4
200 IF S=7 THEN XX=-4
210 X=X+XX
220 'IF S=1 THEN Y=Y-YY
230 'IF S=5 THEN Y=Y+YY
240 H2=-H2:IF JF=1 THEN H2=-1
250 IF S=3 AND H2=1 THEN H=0
260 IF S=3 AND H2=-1 THEN H=4
270 IF S=7 AND H2=1 THEN H=1
280 IF S=7 AND H2=-1 THEN H=5
290 IF X<0 THEN X=0
300 IF X>240 THEN X=240
310 IF JF=1 THEN 340
320 IF TG=0 THEN 390
330 JF=1:JY=-8:JC=6
340 IF JC=0 THEN 370
350 IF TG=0 THEN JC=0:GOTO 370
360 JC=JC-1
370 IF JC=0 AND JY<8 THEN JY=JY+2
380 Y=Y+JY
390 Y2=Y\8:IF JF=0 THEN JY=0
400 AD = &H1800+(X\8)+Y2*32
410 IF VPEEK(AD+64)=A1 THEN Y=Y2*8:JF=0:GOTO 440
420 IF VPEEK(AD+1+64)=A1 THEN Y=Y2*8:JF=0:GOTO 440
430 IF JF=0 THEN JF=1:JC=0:JY=0
440 PUTSPRITE 0,(X,Y),7,H
450 PUTSPRITE 1,(X,Y),11,H+2
460 GOTO 170
800 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
810 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
820 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
830 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
840 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
850 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
860 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
870 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,
00,00,00

1000 DATA 10000001,12
1010 DATA 10000001,14
1020 DATA 10000001,16
1030 DATA 11111111,15
1040 DATA 00011000,18
1050 DATA 00011000,1a
1060 DATA 00011000,1c
1070 DATA 11111111,14

 

今回は行番号を書き換えていません。(面倒臭いので。)

10 SCREEN2:COLOR15,1,5:SCREEN1:DEFINTA-Z:KEYOFF:WIDTH32
15 DEFUSR=&H7E:A=USR(0)

と、

50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)
90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)
96 NEXT

 

と、あとDATA文1000 DATA 10000001,12
1010 DATA 10000001,14
1020 DATA 10000001,16
1030 DATA 11111111,15
1040 DATA 00011000,18
1050 DATA 00011000,1a
1060 DATA 00011000,1c
1070 DATA 11111111,14

 

前回は、1000行以降の

ブロックのDATAを16進数にしていましたが、

今回はわかりやすくするために、

 

ブロックの絵を、2進数

色データを、16進数

 

にしております。

 

それほど多くの追加ではないですね!

順番に見ていきましょう。

 

10 SCREEN2:COLOR15,1,5:SCREEN1

 

多色刷りモード(カラフル)は、本来、SCREEN1では出来ません。

そこでSCREEN2の力を借ります。

だから、SCREEN1.5などと呼ばれています。

(正式にはSCREEN1.5モードというものはないです。)

SCREEN2は文字が表示できないので、SCREEN1とSCREEN2のいいとこどりを

します。

 

15 DEFUSR=&H7E:A=USR(0)

BASICでは、DEFUSR命令とUSR関数が、

機械語サブルーチンを呼び出す方法らしいです。

それで&H7Eはなにかと調べてみると、

VDPのみをSCREEN2に初期化するとあります。(BIOS)

まだこのあたりのことはよくわからないです;

おいおいVDPのことも調べていきたいです^^

(VDP = ビデオディスプレイプロセッサ)

 

いよいよ文字を絵に書き換えです。

50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)


90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)
96 NEXT

 

前回は

70 VPOKE A1*8+I,VAL("&b"+D$)

90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)

だけだったと思います。

(90行は色を設定するところでしたが、少し変わっていますね。)

(90行は、前回の8文字単位ではなくなるため、素直なアドレスになりますw)

 

文字の形を設定する文と、

文字の色を設定する文とに別れていました。

 

それがなぜかVPOKE文が、3倍になっています。

1文字変えるだけなのになぜ?と思われると思います。

 

それはSCREEN2に似ている、多色刷りのVRAM構成は、

画面を上段、中段、下段と書き換えなければいけないのです。

-------------------------------------

上段

-------------------------------------

中段

-------------------------------------

下段

-------------------------------------

(画面構成)

 

 

なぜこんな仕組みになっているんでしょうね?

文字の形の入っているパターンジェネレータテーブルは、

(VRAMの構成)

&H0000-------------------------------------

↓   画面上段の文字        

&H0800-------------------------------------

↓   画面中段の文字  

&H1000-------------------------------------

↓   画面下段の文字

&H1800-------------------------------------

 

となっているので、

70 VPOKE&H0000+*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)

となるわけです。

 

色のほうも、画面を、上段、中段、下段と分けて

入っています。

文字の色の入っているカラーテーブルは、

(VRAMの構成)

&H2000-------------------------------------

↓   画面上段の文字の色         

&H2800-------------------------------------

↓   画面中段の文字の色  

&H3000-------------------------------------

↓   画面下の文字の色 

&H3800-------------------------------------

となっています。

90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)

 

 

文字の形と色のデータは、

1010 DATA 10000001,14
1020 DATA 10000001,16
1030 DATA 11111111,15
1040 DATA 00011000,18
1050 DATA 00011000,1a
1060 DATA 00011000,1c
1070 DATA 11111111,14

 

DATA 8桁の2進数(形),2桁の16進数(色)

となっていて、

色データは、カラーパレットの色の値がそのまま入ります。

2進数部分の1が、色データの左側で、

2進数部分の0が、色データの右側です。

 

1010 DATA 10000001,14 (1は黒、4は暗い青)

なら、

1010 DATA 黒、暗い青、暗い青、暗い青、暗い青、暗い青、暗い青、黒

となります。

 

なお、CTRL + F9でプログラムを止めた時は、SCREEN1 と打ちreturnキーを押して

ください。

 

VRAMで文字を書き換えるのは時間がかかりますね〜

書き換えるデータが多くなると、待ち時間が多くなりそうです。

よく雑誌に載っているBASICプログラムは、最初にかなり待たされたのは

このせいだったんですね!

だから、この部分をマシン語で書きたいです。

後々の話ですが。

 

絵のデータを用意するのが大変そうです。

16進数とかに直すのが。

いいツールはないんですかね〜。

JAVAで書かれたPCGエディターツールを見つけたのですが、

私の環境では動かなかったですよね。

う〜ん。

作るしかないのかなぁ。

 

今日のサンプルコードで、

しばらくはいろんな絵を描いて遊べそうです。

みなさんも、遊んでみてください。

できれば、それを公開して欲しいなぁ。なんて^^

 

最後に、

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」をご覧ください