今回は、前回#でブロックを表していたところを、
完全なブロックの絵にします。
これにもVRAMがでてきます。
VRAMとは画像のデータが入っているRAMです。
これができたら、俄然ゲームぽっくなります。
僕がMSX MAGAZINEなどを見て、
巻末のゲームプログラムを打ち込むと文字が化けてしまって、
なんだこれ?と思っていたのを思い出しますw
はじめてノートにゲームらしいゲームを企画したときは、
スペランカーの主人公のようなキャラに、
上から見下ろしの画面で、湖とか森とかがあって、
その中を歩いてアイテムをとったりしながら進むアドベンチャーゲームでした^^
その時は、なぜかLINEで地形を描くものだと思っていましたねw
前回の#をちょいちょいと形を変えたいと思います。
まずはじめにスマホで有名な、
1bit-rougeみたいな画面にしたいと思います^^
前回のページはこちらへどうぞ。
MSX BASICで地形(ブロック)との当たり判定!これができるとゲームらしくなる!基本その3 - ニャオニャオ21世紀
その他、MSX BASICの基本のページについての
目次はこちら
文字を絵にするサンプルプログラム
10 SCREEN1,2:COLOR15,1,1:KEYOFF:WIDTH32
20 LOCATE 0,0:PRINT"############
####################"
30 LOCATE 0,1:PRINT"#
#"
40 LOCATE 0,2:PRINT"#
#"
50 LOCATE 0,3:PRINT"# # ######
### ############ #"
60 LOCATE 0,4:PRINT"# #
# #"
70 LOCATE 0,5:PRINT"# #
# #"
80 LOCATE 0,6:PRINT"# #########
# ############ #"
90 LOCATE 0,7:PRINT"#
# # # #"
100 LOCATE 0,8:PRINT"#
# # # #"
110 LOCATE 0,9:PRINT"# ## ####
# # # ### # #"
120 LOCATE 0,10:PRINT"# ## ###
## # # ### # ##"
130 LOCATE 0,11:PRINT"# ## ###
## # # # ### # #"
140 LOCATE 0,12:PRINT"# ## ###
## # # # #"
150 LOCATE 0,13:PRINT"#
# # # #"
160 LOCATE 0,14:PRINT"#
# # ######### #"
170 LOCATE 0,15:PRINT"# ## ###
##### # #"
180 LOCATE 0,16:PRINT"# ## #
# # #"
190 LOCATE 0,17:PRINT"# ## #
# ############ #"
200 LOCATE 0,18:PRINT"# #
#"
210 LOCATE 0,19:PRINT"# #
#"
220 LOCATE 0,20:PRINT"##########
######################"
1000 X=96:Y=80
1010 FOR I=0 TO 15
1020 READ DT$
1030 L$=L$+CHR$(VAL("&B"+LEFT$(D
T$,8)))
1040 R$=R$+CHR$(VAL("&B"+RIGHT$(
DT$,8)))
1050 NEXT
1060 SPRITE$(0) =L$+R$
1061 M=ASC("#")
1062 FOR I=0 TO 7
1063 READ BG$
1064 VPOKE M*8+I,VAL("&B"+BG$)
1065 NEXT
1070 S=STICK(0) OR STICK(1)
1080 TX=X:TY=Y
1090 IF S=1 THEN Y=Y-8
1100 IF S=2 THEN X=X+8:Y=Y-8
1110 IF S=3 THEN X=X+8
1120 IF S=4 THEN X=X+8:Y=Y+8
1130 IF S=5 THEN Y=Y+8
1140 IF S=6 THEN X=X-8:Y=Y+8
1150 IF S=7 THEN X=X-8
1160 IF S=8 THEN X=X-8:Y=Y-8
1170 A$=CHR$(VPEEK(&H1800+(X\8)+
(Y\8)*32))
1180 B$=CHR$(VPEEK(&H1800+(X\8)+
1+(Y\8)*32))
1190 C$=CHR$(VPEEK(&H1800+(X\8)+
(Y\8+1)*32))
1200 D$=CHR$(VPEEK(&H1800+(X\8)+
1+(Y\8+1)*32))
1210 IF A$="#" THEN X=TX:Y=TY
1220 IF B$="#" THEN X=TX:Y=TY
1230 IF C$="#" THEN X=TX:Y=TY
1240 IF D$="#" THEN X=TX:Y=TY
1250 PUT SPRITE 0,(X ,Y),15,0
1260 GOTO1070
2000 DATA0000000110000000
2010 DATA1000110110110000
2020 DATA1001111001111000
2030 DATA1011111111111100
2040 DATA1010000000000100
2050 DATA1010111111110101
2060 DATA1110101111010111
2070 DATA1010101111010100
2080 DATA1000111111110000
2090 DATA1000011111100000
2100 DATA1110000000011111
2110 DATA1110011111011011
2120 DATA1110111111010001
2130 DATA1000001001011011
2140 DATA0000110110111011
2150 DATA0000111001101110
2160 'block
2170 DATA11100111
2180 DATA11100111
2190 DATA11000111
2200 DATA00000000
2210 DATA01111110
2220 DATA01111110
2230 DATA01110010
2240 DATA00000000
赤字で書いたところが今回の追加分です。
たったこれだけでブロックの形になるんです^^
文字の形を変える
MSXで、文字というのは8x8ドットでできています。
最後の方のDATA文で、1行8文字のデータが、8桁あるのはそのためです。
(ブロックの形を0と1で表現しています)
文字の形は、
VRAMの一番最初のアドレスから順に、
CHR(1)
CHR(2)
CHR(3)
CHR(4)
~
CHR(255)
とMSXのすべての文字(255文字)の形のデータが収められています。
VRAMのマップを見ておいてください。
(2つとも^^)
VRAMについて書きました。
最初に御覧ください^^
文字の形は、
0000H番地 ~ 07FFH番地に入っています。
(Hは16進数の意味)
形を変えたい文字のアドレスに、
自分で作ったデータを書き込んでやります。
最初に#の形のデータが入ったVRAMのアドレスを求めます。
まず、
1061 M=ASC("#")
で、#がアスキーコードで何番なのか求めます。
一つ知っておきたいのが、
1文字の形を表すデータは、8バイト使っています。
MSXの文字は8x8ドットなので、横1バイト x 8桁あるためです。
(1バイト = 8ビット)
<アスキーコード0番を例にします>
CHR$(0)は、VRAMのアドレスの0~7番地を使っています。
だから、
CHR$(n番)は、n*8 のアドレスから文字データが入っているのです。
n*8から、8つ分で1文字になります。
<1文字のデータのアドレス>
n*8、n*8+1、n*8+2、n*8+3、n*8+4、n*8+5、n*8+6、n*8+7
に上から1ラインづつ形のデータが入っています。
Aだったら、
<n*8> 00010000
<n*8+1> 00101000
<n*8+2> 01000100
<n*8+3> 01111100
<n*8+4> 01000100
<n*8+5> 10000010
<n*8+6> 10000010
<n*8+7> 00101000
(1と0でAの文字の形を表していますが分かりますでしょうか?)
(Aのアスキーコードは65。n=65として考えてください)
VPOKEはVRAMにデータを書き込む命令なので、
1064 VPOKE M*8+I,VAL("&B"+BG$)
を8回。(for文で、Iが0から7まで増えます。)
このようになります。
命令文
VPOKE アドレス , データ(1バイト 2進数で8文字分)
上のVPOKEを、FOR文で8回繰り返して、やっと1文字の絵を書き変えることができます^^
あとは、ブロックに色をつけたいところですね。
VRAMの入っている文字のデータは、形と色が別のところなのです。
そのまえにちょっとだけ追加して、ブロックに影をつけてみます。
おお!いい感じですね^^
このままでもいいような気がしますが^^、
色もつけましょう。
アスキー
売り上げランキング: 366,184
こちらの方が安いかもしれません^^
msx | 通販ショップの駿河屋文字に色を着ける
最初のやつにつけてみます。
1068 VPOKE &H2000+M¥8,&HD1
これだけですw
文字の色データは、VRAMの&H2000から入っています。
(&Hは16進数の意味)
SCREEN1は、すこし癖があります。
なんと8文字単位でしか色がつけられないのです。
しかも、1文字2色!(ラインごとにもつけられません^^;)
そのため、VPOKEのアドレスが、
&H2000+M¥8
という8で割った商ごとになります。
(Mは文字#のアスキーコードが入っています。
M=ASC("#")
前の方で、このようにMを定義しています)
CHR$(0) ~ CHR$(7) で1つの色 (アスキーコード0~7の8文字ですね)
CHR$(8) ~ CHR$(15) で1つの色 (アスキーコード8~15の8文字です)
~
となっていますので...
VPOKEの最後の、&HD1
は、色がD(紫)と、1(黒)となります。
0は透明です。
プログラムをCTRL + STOPさせた後は、
SCREEN1
と打ってリターンを押しておいてください。
(文字の形が元に戻ります。)
最後にブロックに影をつけたほうも。
これだけだと表現が乏しくなぁ〜と感じるかもしれません。
でもすこし凝ればそこそこの絵が描けると思います。
少し描いてみました。
伝説の超有名ARPGっぽいのです^^
1画面ですが、
それっぽく見えないでしょうか?(^^)
実は、MSX BASICには多色刷りまたは、SCREEN1.5と言われる方法
でもっとカラフルにすることもできます。
ちょっと面倒ですが、こちらに書いてます。
上のページの方法なら、こういった絵を描けます。
(多色刷り、SCREEN1.5)
まとめ
とりあえずは、初めての方もゲームらしいものが作れるように
なったのではないでしょうか?
忘れてしまっていた方も思い出していただけたでしょうか?
小学生の頃にここまではできるようになりたかった( ; ; )
もっとプログラムの解説書とか読んでいたらよかったのかな〜。
こういったゲームプログラムについて、
雑誌が書き出したのが
MSX2もでてかなりたったころでした。
僕はもうその頃には、PCエンジンにどっぷりハマってしまっていたので、
MSXはあまり触っていなかったんですよね〜。
ハイドライド3はかなりやっていましたが、
そのころはMSXマガジンも買っていませんでした。
今になってまた勉強を始めました。
最終的には、マシン語で
ハイドライドとか、トリトーンのような
ゲームを作るのを目標としています^^
次世代MSXもでるという噂なので、
その頃にはバリバリつくっていられるようにしたいです^^
MSX実機が欲しい方はこちらでどうぞ。
次回は、多色刷り、SCREEN1.5という、
売っているゲームと同じ見栄えになる方法を
やさしく書こうと思います。
上にもリンクを貼っていますが、少し説明が雑なので、
もう少し丁寧に書きます。
以前、多色刷り(SCREEN1.5) 用のお絵かきエディタ(EDIO)を作ったのですが、どうもバグがあるようでして、時々エラーをはいて止まってします(~~;)
それの修正もしておきます。
それでは〜。
つづきはこちら。