ニャオニャオ21世紀

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

MSX BASICの基礎 その5 グラフィックを市販品と同じくらいキレイにできます!SCREEN1.5 多色刷りを簡単に説明!






今回は、見た目を市販品と同レベルにできるようにします。

ちょっと大げさに書きましたが、要はSCREEN1.5 多色刷りのことです^^

 

前回は文字をブロックの形にしましたが、

アレだと、文字のラインごとに色を変えることができないんですよねぇ〜。

市販品だと、8ドット1ライン2色という制限がありますが、

カラフルですよね?

ガリウスの迷宮とか、ハイドライド3とか、ザナドゥとか、

グラディウス2とか。

 

技術的にはBASICでも、これらの絵を出せるようになります。

あとは美術的センスだけですw

最初は、市販品のゲーム の絵を自分で描いてみて、

自分のゲームに取り入れてみると面白いですよ〜w

(ネットでの公開はやめてくださいね!お願いします。

コナミさんあたりは厳しいです。

過去に公開を取りやめにさせられたオマージュゲームがあります。

ときめきナイトメアとか^^

クローンゲームの栞

 

僕も、ポポロンみたいなキャラとか動かしていますが

マズイですね~~;  (一応アレンジはしてますが...)

今後はオリジナルなキャラとかに差し替えていきたいと思います。

コナミ系は特に;

まぁ、ドット絵を完全にパクってなくて、

アレンジしてあるならメーカーさんに許してもらえるかもしれないです。

ただそれはメーカーさんのお気持ち一つなので^^;

そのあたりのリスクは考えておきましょう!)

 

オマージュな感じで、しかも自分でドット絵を打つのなら

ギリギリな感じですね。

僕はハイドライドのオマージュ作品が作りたい〜。

マリドライドの場合、全部自分でドット絵を打っていますw

f:id:nyaonyaokun:20180711051031p:plain

 

f:id:nyaonyaokun:20180919092837p:plain

 

似てるけど、違いますよね!

(これはスマホ用ですが...

レトロゲーム開発で生活費を得るのは難しいなぁ。マリドライド開発の今後。 - ニャオニャオ21世紀

)

 

みなさんも、今回のSCREEN1.5 (多色刷り )が出来るように

なったらご自分でデザインしてみてください。

 

じつは、そのMSX1のSCREEN1.5のデザイン用ツールを作りました!

あまり使ってもらっていませんが^^;

MSX BASICで作っているので遅いです。

いまのところ、webmsxのみでしか動作検証していないので、

いずれ実機でも動くようにしたいです。

でもエミュでMSXのゲームを作るなら、

Java scriptでお絵かきツールを作った方が便利かもしれないので、

そちらをそのうち作るかもしれないです。

(他の方が作ったツールは、僕の環境では動かなかったんですよね;)

 

www.nyaonyao21.com

 

 

SCREEN1.5(多色刷り) サンプルコード

 

f:id:nyaonyaokun:20180928062156p:plain

 

10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
15 DEFUSR=&H7E:A=USR(0)
18 KEY1,"SCREEN1"+CHR$(13)
20 X=96:Y=80
25 'SPRITE TEIGI
30 FOR I=0 TO 15
40 READ DT$
50 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
60 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
70 NEXT
80 SPRITE$(0) =L$+R$
85 'BLOCK TEIGI
90 M=ASC("a")

95 'KATACHI
100 FOR I=0 TO 7
110 READ BG$
120 VPOKE M*8+I,VAL("&B"+BG$)
122 VPOKE &H800+M*8+I,VAL("&B"+BG$)
124 VPOKE &H1000+M*8+I,VAL("&B"+BG$)
130 NEXT

132 'COLOR
135 FOR I=0 TO 7
138 READ CR$
140 VPOKE &H2000+M*8+I,VAL("&H"+CR$)
142 VPOKE &H2800+M*8+I,VAL("&H"+CR$)
144 VPOKE &H3000+M*8+I,VAL("&H"+CR$)
150 NEXT
495 'MAP
500 LOCATE 0,0:PRINT "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
510 LOCATE 0,1:PRINT "a a"
520 LOCATE 0,2:PRINT "a a"
530 LOCATE 0,3:PRINT "a a aaaaaaaaa aaaaaaaaaaaa a"
540 LOCATE 0,4:PRINT "a a a a"
550 LOCATE 0,5:PRINT "a a a a"
560 LOCATE 0,6:PRINT "a aaaaaaaaa a aaaaaaaaaaaa a"
570 LOCATE 0,7:PRINT "a a a a a"
580 LOCATE 0,8:PRINT "a a a a a"
590 LOCATE 0,9:PRINT "a aa aaaaa a a aaa a a"
600 LOCATE 0,10:PRINT"a aa aaaaa a a aaa a a"
610 LOCATE 0,11:PRINT"a aa aaaaa a a a aaa a a"
620 LOCATE 0,12:PRINT"a aa aaaaa a a a a"
630 LOCATE 0,13:PRINT"a a a a a"
640 LOCATE 0,14:PRINT"a a a aaaaaaaaa a"
650 LOCATE 0,15:PRINT"a aa aaaaaaaa a a"
660 LOCATE 0,16:PRINT"a aa a a a a"
670 LOCATE 0,17:PRINT"a aa a a aaaaaaaaaaaa a"
680 LOCATE 0,18:PRINT"a a a"
690 LOCATE 0,19:PRINT"a a a"
700 LOCATE 0,20:PRINT"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
995 'MAIN LOOP
1000 S=STICK(0) OR STICK(1)
1010 TX=X:TY=Y
1020 IF S=1 THEN Y=Y-8
1030 IF S=2 THEN X=X+8:Y=Y-8
1040 IF S=3 THEN X=X+8
1050 IF S=4 THEN X=X+8:Y=Y+8
1060 IF S=5 THEN Y=Y+8
1070 IF S=6 THEN X=X-8:Y=Y+8
1080 IF S=7 THEN X=X-8
1090 IF S=8 THEN X=X-8:Y=Y-8
1100 A$=CHR$(VPEEK(&H1800+(X\8)+(Y\8)*32))
1110 B$=CHR$(VPEEK(&H1800+(X\8)+1+(Y\8)*32))
1120 C$=CHR$(VPEEK(&H1800+(X\8)+(Y\8+1)*32))
1130 D$=CHR$(VPEEK(&H1800+(X\8)+1+(Y\8+1)*32))
1140 IF A$="a" THEN X=TX:Y=TY
1150 IF B$="a" THEN X=TX:Y=TY
1160 IF C$="a" THEN X=TX:Y=TY
1170 IF D$="a" THEN X=TX:Y=TY
1180 PUT SPRITE 0,(X ,Y),15,0
1190 GOTO1000
1995 'SPRITE DATA
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 DATA01111110
2240 DATA00000000
2250 'COLOR
2260 DATAF1,71,51,51,51,41,41,41

 

プログラムの解説

 

前回のブロックを形に変える方法は、

SCREEN1を利用しています。

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

 

 

SCREEN1だと、8文字ごとに色が変えることができます。

1文字2色ですが。

(ラインによる色変更はできません)

 

SCREEN1を使う理由は文字を表示できるから。

文字操作の方が、プログラムを作りやすいので。

 

それで、色制限があるが文字が使えるSCREEN1と

色が自由だけど文字が使えないSCREEN2の

いいとこ取りをする方法が、

SCREEN1.5 (多色刷り)なのです。

このSCREEN1.5はMSXマガジンで勝手に命名していただけで

正式名称ではないのであしからず^^

 

この1行を書くだけで、SCREEN1.5になります。

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

簡単ですね^^

 

何をしているかといいますと、

BIOSを使っています。

MSXマガジンも永久保存版3によりますと、

 

SETGRP (007EH)

機能:VDPのみをGRAPHIC2モード(SCREEN2)に初期化する

 

とあります。

 

なお、

DEFUSR=アドレス:A=USR(0)

この1行(赤い文字で表しているアドレスを変更して頂くと)で、

BIOSを呼び出せますので色々試してみると

面白いですよ!

(007EH  --->  &H7Eです)

 

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

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

 

こちらの方が安い場合もありますので、ご確認ください^^ 

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

 

 

  

DEFUSR=アドレス:A=USR(0)

 

この1文は、BASICでマシン語を使う時にもでてきます。

まぁ、DEFUSRで指定したアドレスを読み込むだけの

命令なんですけど^^

 

BIOSを使うって何???

って方もいると思いますが、

 

BIOS

SETGRP (007EH)

機能:VDPのみをGRAPHIC2モード(SCREEN2)に初期化する

 

を例にすると、 

要は&H7E ( 007EH )のアドレスから始まるところに

SCREEN1.5にするマシン語のプログラム

書かれているだけのことです。

 

こういう便利なマシン語のプログラムが、

標準でいくつかはいっているのです。

 

続いて、文字の形を変えるところを説明します。

 

95 'KATACHI

100 FOR I=0 TO

110 READ BG$

120 VPOKE M*8+I,VAL("&B"+BG$)

122 VPOKE &H800+M*8+I,VAL("&B"+BG$)

124 VPOKE &H1000+M*8+I,VAL("&B"+BG$)

130 NEXT

 

紫のところは、前回と同じです。

120 VPOKE M*8+I,VAL("&B"+BG$)

VPOKEはVRAMに値を書き込む命令でした。

この場合は、

M*8+I

はVRAMのアドレスです。

VAL("&B"+BG$)

は書き込むデータ。

 

SCREEN1.5 (多色刷り)での追加は、赤いところ。

120 VPOKE M*8+I,VAL("&B"+BG$)

122 VPOKE &H800+M*8+I,VAL("&B"+BG$)

124 VPOKE &H1000+M*8+I,VAL("&B"+BG$)

 

違いがわかりますでしょうか?

3つVPOKEがありますが、

VRAMのアドレスが異なるだけですね!

 

SCREEN1.5では、

VRAMの中での画面の管理が、

上段、中段、下段と分かれています。

それぞれに文字の形の定義をしたり、色の定義をしてやらないといけないのです!

 

f:id:nyaonyaokun:20180928054414p:plain

(上段、中段、下段を色分けしてみました^^)

 

こんなことは普通は知らないですよねw

僕もなんだこりゃ?って思いましたw 

 

上段の文字の形データが入っているVRAMのアドレスは、

&H0000 ~ 

 

中段の文字の形データが入っているVRAMのアドレスは、

 &H0800 ~

 

下段の文字の形データが入っているVRAMのアドレスは、

 &H1000 ~

 

上のプログラムは、

3カ所のVRAMのアドレスに同じデータを書き込んでやるだけです。

120 VPOKE M*8+I,VAL("&B"+BG$)

122 VPOKE &H800+M*8+I,VAL("&B"+BG$)

124 VPOKE &H1000+M*8+I,VAL("&B"+BG$)

 

 

次は色を変えます。

135 FOR I=0 TO 7
138 READ CR$
140 VPOKE &H2000+M*8+I,VAL("&H"+CR$)
142 VPOKE &H2800+M*8+I,VAL("&H"+CR$)
144 VPOKE &H3000+M*8+I,VAL("&H"+CR$)
150 NEXT

 

2250 'COLOR
2260 DATAF1,71,51,51,51,41,41,41

 

色も形と同じように、

VRAMの3か所に同じデータを書き込みます。

最初にREAD文で、色データを読み込んでいますが、

こちらは16進数です。

(前回の説明でも16進数でした)

 

ちょっと前回と違うのが、

1文字ごとに、(各文字の1ラインごとに)

色が変えられるということです。

(前回は8文字ごとだったので、少しプログラムが違います。

ご注意ください。)

 

 

ブロックの形は、1と0で作っていました。

2160 'BLOCK
2170 DATA11100111
2180 DATA11100111
2190 DATA11000111
2200 DATA00000000
2210 DATA01111110
2220 DATA01111110
2230 DATA01111110
2240 DATA00000000

 

それに色をつけます。

2250 'COLOR
2260 DATAF1,71,51,51,51,41,41,41

 

上の1ラインから

1ライン   <2170 DATA11100111>の色 :  F1  (白と黒)

2ライン   <2180 DATA11100111>の色 :  71  (水色と黒)

3ライン   <2190 DATA11000111>の色 :  51  (淡い青と黒)

~~

8ライン   <2240 DATA00000000>の色 :  41 (青と黒)

 

f:id:nyaonyaokun:20180925100102p:plain

 

形データの1の部分の色は、データの前、

F1のFとか、71の7とか、51の5ですね。

 

形データの0の部分が後ろのデータ、

F1の1とか、71の1とか、51の1ですね。

(今回はすべて黒ですが別に何色でもoKです)

 

色データを書き込む:

140 VPOKE &H2000+M*8+I,VAL("&H"+CR$)
142 VPOKE &H2800+M*8+I,VAL("&H"+CR$)
144 VPOKE &H3000+M*8+I,VAL("&H"+CR$)

 

上段の文字の形データが入っているVRAMのアドレスは、

&H2000 ~ 

 

中段の文字の形データが入っているVRAMのアドレスは、

 &H2800 ~

 

下段の文字の形データが入っているVRAMのアドレスは、

 &H3000 ~

 

 

 

まとめ

 

・BIOSを呼ぶ SETGRP (007EH)

   (SCREEN1.5にするために)

 ・形を変えるために、VRAMの3か所に同じデータを書く

・色を変えるために、VRAMの3か所に同じデータを書く

 

SCREEN1.5(多色刷り)のしていることはこれだけです。

 

サンプルプログラムはこちらで実行できます(Webmsx)

 

ダウンロード

 

サンプルプログラムでCTRL + STOP でプログラムを止めたら、

F1キーを押してください。

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

 

 

根気があれば、こんな画面を表示することだってできます!

(スピードを気にしなければ^^)

 

f:id:nyaonyaokun:20180711040105p:plain

f:id:nyaonyaokun:20180711051232p:plain

f:id:nyaonyaokun:20180711051926p:plain

 

追記----------------------------------- 

自分でも何か描いてみようと思い、

ドラゴンを描いてみました。

(ハイドライド3を参考にしております^^)

 

僕が作ったEDIOで絵をデザインしてみたのですが、

ちょっと自分以外には使えないようなややこしさでした;

申し訳ないですm(_ _)m

もう少し使いやすいように直したいと思います。

 

f:id:nyaonyaokun:20180929064232p:plain

 

サンプルを試す(WebMSX)

 

ダウンロード

 

次回は、EDIOの使い方を書きたいと思います

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

 

 

 

 

 

しかし、

今回のプログラムを使って、

たくさんの文字の形を変えるとなると、

かなり時間がかかることになります。

雑誌に載っていたBASICゲームを打ち込んで、

ゲームを開始するときに

かなり待たされた経験があると思います。

それは、VRAMにデータを書き込んでいたためです。

 

SCREEN1.5(多色刷り)は、前回のプログラムの3倍の時間がかかります~~;

(今回は1文字なので別に問題はないのですが)

これが意外にキツイのです。

この部分をマシン語にしてしまう方法もあります。

 

WebMSXでMSX BASICの自作ゲーム作成!第13弾。 マシン語で最初の待ち時間を3秒縮めました(URLクリックで実行できます) - ニャオニャオ21世紀

 

WebMSXでMSX BASICの自作ゲーム作成!第14弾。 さらに早く!キャラクターパターンを読み込んで、前回より8.5秒短縮!(URLクリックで実行できます) - ニャオニャオ21世紀

 

 

これで見栄えはプロ並のものが作れるようになりました!

今まで、キャラクターを動かしたり、地形との当たり判定をいれたりしたので、

かなりゲームぽくなりましたね^^

 

あとは、キャラクターの歩行アニメーションとか、

キャラクターの向きの絵を変えたりしたいところですね。

その辺りは、出来る人が多いかもしれませんが、

次回に説明しておこうと思います。

今はドラクエ1みたいなんでw

 

敵キャラを入れたり、音楽を鳴らしたら、ほぼゲーム になります。

あとは画面切り替えとかも説明したいです。

すべてBASICでやろうと思います。

他のページのところではマシン語でやっていますが、

BASICのみのプログラムというのも魅力があるので。

 

色々と勉強してくると、MSXの実機が欲しくなります^^

こちらで買えます。

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

(ネットでMSX本体を買おうと思うと、ヤフオクかメルカリ、

駿河屋さんになると思います。

他はベラボーに高かったりするので...)

 

 

 

BASICの問題はスピードです。

 

昔、MSX BASICをやられていた方も、スピードで限界を感じて

マシン語を勉強したという話をよく聞きます。

しかし、BASICでゲームが作ることができなければ、マシン語でも作れません。

僕ももっとBASICでゲームを作っていきたいです。

そして部分的にマシン語を取り入れていき、最後はフルマシン語で!

 

マシン語に興味を持たれた方がいましたら、

マシン語勉強レポートを書いていますのでよろしければ。

MSX マシン語入門 (Z80 アセンブラ・機械語) 勉強レポート 第1回 - ニャオニャオ21世紀

 

 つづきはこちら

www.nyaonyao21.com

 

 

 

 


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

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