ニャオニャオ21世紀

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

MSX BASICの基礎その4 文字の形をブロックの絵に変える方法。出来ると一番楽しいところ!






今回は、前回#でブロックを表していたところを、

完全なブロックの絵にします。

これにもVRAMがでてきます。

VRAMとは画像のデータが入っているRAMです。

 

これができたら、俄然ゲームぽっくなります。

僕がMSX MAGAZINEなどを見て、

巻末のゲームプログラムを打ち込むと文字が化けてしまって、

なんだこれ?と思っていたのを思い出しますw

 

はじめてノートにゲームらしいゲームを企画したときは、

スペランカーの主人公のようなキャラに、

上から見下ろしの画面で、湖とか森とかがあって、

その中を歩いてアイテムをとったりしながら進むアドベンチャーゲームでした^^

その時は、なぜかLINEで地形を描くものだと思っていましたねw

 

前回の#をちょいちょいと形を変えたいと思います。

まずはじめにスマホで有名な、

1bit-rougeみたいな画面にしたいと思います^^

 

前回のページはこちらへどうぞ。

MSX BASICで地形(ブロック)との当たり判定!これができるとゲームらしくなる!基本その3 - ニャオニャオ21世紀

 

文字を絵にするサンプルプログラム

 

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

 

赤字で書いたところが今回の追加分です。

たったこれだけでブロックの形になるんです^^

文字の形を変える

 

f:id:nyaonyaokun:20180924031245p:plain

 

MSXで、文字というのは8x8ドットでできています。

最後の方のDATA文で、1行8文字のデータが、8桁あるのはそのためです。

(ブロックの形を0と1で表現しています)

 

文字の形は、

VRAMの一番最初のアドレスから順に、

CHR(1)

CHR(2)

CHR(3)

CHR(4)

~

CHR(255)

とMSXのすべての文字(255文字)の形のデータが収められています。

 

VRAMのマップを見ておいてください。

(2つとも^^)

Appendix A.5 VRAM マップ - テクハンw

 

MSX data base : VRAM MAP

 

文字の形は、

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の入っている文字のデータは、形と色が別のところなのです。

 

そのまえにちょっとだけ追加して、ブロックに影をつけてみます。

f:id:nyaonyaokun:20180924040255p:plain

 

おお!いい感じですね^^

 

このままでもいいような気がしますが^^、

色もつけましょう。

 

 

MSX MAGAZINE 永久保存版 [CD-ROM1枚、特製シール付き]
MSXアソシエーション
アスキー
売り上げランキング: 366,184
 

 

MSX MAGAZINE 永久保存版 2
MSX MAGAZINE 永久保存版 2
posted with amazlet at 18.09.04

アスキー
売り上げランキング: 694,835

 

MSX MAGAZINE永久保存版3
MSX MAGAZINE永久保存版3
posted with amazlet at 18.09.04

アスキー
売り上げランキング: 818,909
僕のはwin10じゃないので試していませんが。
ネットで調べてみてください;
BIOSやワークエリアについて一覧があります。
本だとすぐに開けることができるので便利。
付属のpdfファイルにはVDPの機能、VRAMマップなど)
 
 

こちらの方が安いかもしれません^^

msx | 通販ショップの駿河屋
 
 

文字に色を着ける

 

最初のやつにつけてみます。

 

f:id:nyaonyaokun:20180924044043p:plain


1068 VPOKE &H2000+M¥8,&HD1

これだけですw

 

文字の色データは、VRAMの&H2000から入っています。

 (&Hは16進数の意味)

SCREEN1は、すこし癖があります。

なんと8文字単位でしか色がつけられないのです。

しかも、1文字2色!(ラインごとにもつけられません^^;)

そのため、VPOKEのアドレスが、

&H2000+M¥8

という8で割った商ごとになります。

CHR$(0) ~ CHR$(7) で1つの色

CHR$(8) ~ CHR$(15) で1つの色

~

となっていますので...

 

VPOKEの最後の、&HD1

は、色がD(紫)と、1(黒)となります。

 

f:id:nyaonyaokun:20180925100102p:plain

0は透明です。

 

プログラムをCTRL + STOPさせた後は、

SCREEN1

と打ってリターンを押しておいてください。

(文字の形が元に戻ります。)

 

 

 

最後にブロックに影をつけたほうも。

 

f:id:nyaonyaokun:20180924045034p:plain

 

これだけだと表現が乏しくなぁ〜と感じるかもしれません。

でもすこし凝ればそこそこの絵が描けると思います。

少し描いてみました。

f:id:nyaonyaokun:20180924161203p:plain

 

サンプルをWebMSXで試す

 

ダウンロード

伝説の超有名ARPGっぽいのです^^

1画面ですが、

それっぽく見えないでしょうか?(^^)

 

実は、MSX BASICには多色刷りまたは、SCREEN1.5と言われる方法

でもっとカラフルにすることもできます。

ちょっと面倒ですが、こちらに書いてます。

www.nyaonyao21.com

 

上のページの方法なら、こういった絵を描けます。

(多色刷り、SCREEN1.5)

f:id:nyaonyaokun:20180414085416p:plain

 

 

まとめ

 

サンプルプログラムをWebMSXで実行

 

ダウンロード

 

 とりあえずは、初めての方もゲームらしいものが作れるように

なったのではないでしょうか?

忘れてしまっていた方も思い出していただけたでしょうか?

 

小学生の頃にここまではできるようになりたかった( ;  ; )

もっとプログラムの解説書とか読んでいたらよかったのかな〜。

 

こういったゲームプログラムについて、

雑誌が書き出したのが

MSX2もでてかなりたったころでした。

 

僕はもうその頃には、PCエンジンにどっぷりハマってしまっていたので、

MSXはあまり触っていなかったんですよね〜。

ハイドライド3はかなりやっていましたが、

そのころはMSXマガジンも買っていませんでした。

 

今になってまた勉強を始めました。

最終的には、マシン語で

ハイドライドとか、トリトーンのような

ゲームを作るのを目標としています^^

 

次世代MSXもでるという噂なので、

その頃にはバリバリつくっていられるようにしたいです^^

 

MSX実機が欲しい方はこちらでどうぞ。

通販ショップの駿河屋(MSX本体)

 

 

次回は、多色刷り、SCREEN1.5という、

売っているゲームと同じ見栄えになる方法を

やさしく書こうと思います。

上にもリンクを貼っていますが、少し説明が雑なので、

もう少し丁寧に書きます。

 

以前、多色刷り(SCREEN1.5) 用のお絵かきエディタ(EDIO)を作ったのですが、どうもバグがあるようでして、時々エラーをはいて止まってします(~~;)

それの修正もしておきます。

 

それでは〜。

 

 つづきはこちら。

www.nyaonyao21.com

 

 

 

 


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

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