ニャオニャオ21世紀

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

MSX BASIC ゲームを作るときに便利なコピペサンプル






MSX BASICでゲームを作っていて、何気にプログラムがし辛いと感じています^^;
まぁ、仕事でもないとプログラムのアルゴリズムって
暗記できないですよねぇ〜。

 

そこで、
今まで紹介してきたBASICプログラムのサンプル集を作っておこうと思いました。
このページでコピペして効率よくゲームを作っていただけたら幸いです^^

 (暫定。もっと使いやすいように追記していきます。)

初期設定

その1

10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF

10行に、SCREEN1(使いやすい文字画面、スプライト16X16単位)で、
COLORで画面の色、
WIDTH32で横画面32文字表示、
DEFINTA-Zで整数のみ(スピードが早くするため)、
KEYOFFで画面下のcolorなどを非表示。

その2

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

SCREEN1.5を使うときに使用。
もっといい方法があればコメントください^^
20行でBIOSでSCREEN1をSCREEN2のように設定します。
(この設定だけではSCREEN1.5にはなりません。あしからず。)




スプライト

その1 16X16スプライト 8個  DATA型は16進数
https://msxpen.com/?code=-LaN44f2dVV5GAstAvX5

 
その2 16X16スプライト 8個 DATA型は2進数
https://msxpen.com/codes/-LaN7JDqhFV99NkuzxjY

 

その3 16X16 スプライト1個 DATA型は16進数 SPRITE Editor TinySpriteより
https://msxpen.com/codes/-LaRhGqHDZLg6E-yb-IE

f:id:nyaonyaokun:20180925100102p:plain


その1

10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
100 'SPRITE TEIGI
110 RESTORE 3000
120 FOR J=0 TO 7
130 S$=""
140 FOR I=0 TO31
150 READ DT$
160 S$=S$+CHR$(VAL("&H"+DT$))
170 NEXT
180 SPRITE$(J)=S$
190 NEXT 
1000 PUT SPRITE 0,(0,50),2,0
1010 PUT SPRITE 1,(16,50),3,1
1020 PUT SPRITE 2,(32,50),4,2
1030 PUT SPRITE 3,(48,50),5,3
1040 PUT SPRITE 4,(0,66),6,4
1050 PUT SPRITE 5,(16,66),7,5
1060 PUT SPRITE 6,(32,66),8,6
1070 PUT SPRITE 7,(48,66),8,7 
3000 'SPRITE NO.0
3010DATA00,00,4F,5F,7F,3F,3F,3F,3F,1F,EF,F0,FE,F3,6C,00,01,01,E5,F5,FD,F9,F9,F9,F9,F7,E7,07,E1,80,60,60
3020 'SPRITE NO.1
3030DATA00,00,4F,5F,7F,3F,3F,3F,3F,DF,EF,F8,FE,73,0C,0C,00,00,E5,F5,FD,F9,F9,F9,F9,F1,E1,07,E7,87,61,00
3040 'SPRITE NO.2
3050DATA00,00,47,4B,6B,0B,6B,6B,6B,2B,0B,1C,1B,03,1C,1C,00,00,E0,F4,FC,F8,68,68,F8,F8,FE,1A,B0,DA,3E,3C
3060 'SPRITE NO.3 
3070DATA00,00,4F,5E,6D,1D,7D,7D,7A,3A,15,0C,1B,1B,24,0E,00,00,E0,F4,7C,78,58,58,F8,F0,FE,1A,50,DA,0E,E4
3080 'SPRITE NO.4 
3090DATA00,00,A7,AF,BF,9F,9D,9D,9F,8F,87,80,E7,E1,86,00,00,00,F2,FA,FE,FC,DC,DC,FC,FF,FB,11,7B,CE,30,30
3100 'SPRITE NO.5
3110DATA00,80,A7,AF,BF,9F,9D,9D,9F,8F,E7,E0,E7,81,06,06,00,00,F2,FA,FE,FC,DC,DC,FC,F8,FF,1B,71,DB,3E,00
3120 'SPRITE NO.6
3130DATA00,00,03,17,1F,8F,8B,8B,4F,4F,27,20,1A,1B,00,03,00,00,F9,FD,FB,FC,7F,7F,FF,CE,DF,1B,D1,DB,3E,70
3140 'SPRITE NO.7
3150DATA00,00,47,6F,7F,5F,56,56,5F,5F,4F,40,E5,E3,48,38,00,00,F2,FA,F6,F8,FE,FE,FE,9C,BE,36,A2,B6,3C,38

120行が定義するスプライトの数(16ドットX16ドット)です。
120 FOR J=0 TO 7
0~7までなので8個のスプライトです。3000行以降のDATA文は8個になります。
例:スプライトを16個定義するときは、
7を15にしてやり、DATA文を16個用意してやるなど。

 PUT SPRITE 0,(100,50),1,0
などとして使用します。
PUT SPRITE スプライト番号 , (X座標 , Y座標) ,カラー , スプライトパターン番号
3000 'UP------SPRITE NO.0
のNO.0の0がスプライトパターン番号です。

 なお、DATAは、上横1列1~8ドット目〜下横1列8ドット目
      -> 上1列9~16ドット目〜下1列9~16ドット目

f:id:nyaonyaokun:20190321045302p:plain

    ↓
f:id:nyaonyaokun:20190321045404p:plain
このようなDATA順で定義しています。
 

 

その2

10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
100 RESTORE 3000
110 FOR J=0 TO 7
120 FOR I=0 TO 15
130 READ DT$
140 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
150 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
160 NEXT
170 SPRITE$(J) =L$+R$
180 L$="":R$=""
190 NEXT
950 ' 
1000 PUT SPRITE 0,(0,50),2,0
1010 PUT SPRITE 1,(16,50),3,1
1020 PUT SPRITE 2,(32,50),4,2
1030 PUT SPRITE 3,(48,50),5,3
1040 PUT SPRITE 4,(0,66),6,4
1050 PUT SPRITE 5,(16,66),7,5
1060 PUT SPRITE 6,(32,66),8,6
1070 PUT SPRITE 7,(48,66),8,7 
2995 'SPRITE UP0 DATA
3000 DATA1000000000000000
3010 DATA1000000000000000
3020 DATA1010011111110010
3030 DATA1010111111111010
3040 DATA1011111111111110
3050 DATA1001111111111100
3060 DATA1001111111111100
3070 DATA1001111111111100
3080 DATA1001111111111100
3090 DATA1110111111111000
3100 DATA1110011111110111
3110 DATA1110000000001111
3120 DATA1000011101111111
3130 DATA0000000111001111
3140 DATA0000011000110110
3150 DATA0000011000000000
3155 'SPRITE UP1 DATA
3160 DATA0000000000000000
3170 DATA0000000000000000
3180 DATA1010011111110010
3190 DATA1010111111111010
3200 DATA1011111111111110
3210 DATA1001111111111100
3220 DATA1001111111111100
3230 DATA1001111111111100
3240 DATA1001111111111100
3250 DATA1000111111111011
3260 DATA1000011111110111
3270 DATA1110000000011111
3280 DATA1110011101111111
3290 DATA1110000111001110
3300 DATA1000011000110000
3310 DATA0000000000110000
3315 'SPRITE RIGHT2 DATA
3320 DATA0000000000000000
3330 DATA0000000000000000
3340 DATA1001111111000000
3350 DATA1011111111101000
3360 DATA1101111111111000
3370 DATA0011111111110001
3380 DATA1111111011010001
3390 DATA1111111011010001
3400 DATA1111111111110010
3410 DATA0111001111110010
3420 DATA1111101111100100
3430 DATA1101100000000100
3440 DATA1000101101011000
3450 DATA1101101111011000
3460 DATA0111110000000000
3470 DATA0000111011000000
3475 'SPRITE RIGHT3 DATA
3480 DATA0000000000000000
3490 DATA0000000000000000
3500 DATA0100111111100010
3510 DATA0101111111110110
3520 DATA0110111111111110
3530 DATA0001111111111010
3540 DATA0111111101101010
3550 DATA0111111101101010
3560 DATA0111111111111010
3570 DATA0011100111111010
3580 DATA0111110111110010
3590 DATA0110110000000010
3600 DATA0100010110100111
3610 DATA0110110111000111
3620 DATA0011110000010010
3630 DATA0001110000011100
3635 'SPRITE DOWN4 DATA
3640 DATA0000000000000000
3650 DATA0000000000000000
3660 DATA1010011111110010
3670 DATA1010111111111010
3680 DATA1011111111111110
3690 DATA1001111111111100
3700 DATA1001110111011100
3710 DATA1001110111011100
3720 DATA1001111111111100
3730 DATA1000111111111111
3740 DATA1000011111111011
3750 DATA1000000000010001
3760 DATA1110011101111011
3770 DATA1110000111001110
3780 DATA1000011000110000
3790 DATA0000000000110000
3795 'SPRITE DOWN5 DATA
3800 DATA0000000000000000
3810 DATA1000000000000000
3820 DATA1010011111110010
3830 DATA1010111111111010
3840 DATA1011111111111110
3850 DATA1001111111111100
3860 DATA1001110111011100
3870 DATA1001110111011100
3880 DATA1001111111111100
3890 DATA1000111111111000
3900 DATA1110011111111111
3910 DATA1110000000011011
3920 DATA1110011101110001
3930 DATA1000000111011011
3940 DATA0000011000111110
3950 DATA0000011000000000
3955 'SPRITE LEFT6 DATA
3960 DATA0000000000000000
3970 DATA0000000000000000
3980 DATA0000001111111001
3990 DATA0001011111111101
4000 DATA0001111111111011
4010 DATA1000111111111100
4020 DATA1000101101111111
4030 DATA1000101101111111
4040 DATA0100111111111111
4050 DATA0100111111001110
4060 DATA0010011111011111
4070 DATA0010000000011011
4080 DATA0001101011010001
4090 DATA0001101111011011
4100 DATA0000000000111110
4110 DATA0000001101110000
4115 'SPRITE LEFT7 DATA
4120 DATA0000000000000000
4130 DATA0000000000000000
4140 DATA0100011111110010
4150 DATA0110111111111010
4160 DATA0111111111110110
4170 DATA0101111111111000
4180 DATA0101011011111110
4190 DATA0101011011111110
4200 DATA0101111111111110
4210 DATA0101111110011100
4220 DATA0100111110111110
4230 DATA0100000000110110
4240 DATA1110010110100010
4250 DATA1110001110110110
4260 DATA0100100000111100
4270 DATA0011100000111000




その3
スプライトエディタができるサイトがあります。

tinysprite様
TinySprite 0.7.0 - MSX Sprite Editor

こちらはデザインしたスプライトのBASICプログラムまで
吐き出してくれます^^
この方法が一番簡単かもしれません(*^^*)

10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
20 ' color 2
30 DATA 03,07,0E,07,07,05,07,07,07,0F,05,03,03,03,07,03
40 DATA C0,E0,E0,F0,E0,E0,E0,E0,B0,E0,E0,C0,40,C0,E0,C0
50 DATA *
60 GOSUB 10000
70 PUT SPRITE 0,(0,0),2,0
80 GOTO 80
10000 REM -- LOAD SPRITES
10010 S=BASE(9)
10020 READ R$: IF R$="*" THEN RETURN ELSE VPOKE S,VAL("&H"+R$):S=S+1:GOTO 10020

スプライトをカーソルキーで動かす


その1

1000  S=STICK(0) OR STICK(1)
1010 IF S=1 THEN Y=Y-1 
1020 IF S=2 THEN X=X+1:Y=Y-1
1030 IF S=3 THEN X=X+1
1040 IF S=4 THEN X=X+1:Y=Y+1
1050 IF S=5 THEN Y=Y+1
1060 IF S=6 THEN X=X-1:Y=Y+1
1070 IF S=7 THEN X=X-1
1080 IF S=8 THEN X=X-1:Y=Y-1
1090 PUT SPRITE 0,(X ,Y),15,0
1100  GOTO 1000

シンプルな方法です。
カーソルキーとジョイスティック1でも動かせます。

注意点は、1000行より前にスプライトの定義をしておかないといけません。
1ドット単位の移動となります。
キャラクター単位(8ドット単位)の移動は、

1100 PUT SPRITE 0,(X*8,Y*8),15,0

として下さい。
(または、X=X+1ではなく、X=X+8としてもOKです。8ドット単位移動)


その2

1000  S=STICK(0) OR STICK(1)
1010 ON S GOSUB 3000,3100,3200,3300,3400,3500,3600,3700
1020 PUT SPRITE 0,(X ,Y),15,0
1030  GOTO 1000
2990 '
3000'S=1 UP 
3010 Y=Y-1 
3020 RETURN
3100 'S=2 UP RIGHT
3110 X=X+1:Y=Y-1
3120 RETURN
3200 'S=3 RIGHT
3210 X=X+1
3220 RETURN
3300 'S=4 RIGHT DOWN
3310 X=X+1:Y=Y+1
3320 RETURN
3400 'S=5 DOWN
3410 Y=Y+1
3420 RETURN
3500 'S=6 LEFT DOWN
3510  X=X-1:Y=Y+1
3520 RETURN
3600 'S=7  LEFT
3610 X=X-1
3620 RETURN
3700 'S=8 UP LEFT
3710 X=X-1:Y=Y-1
3720 RETURN

こちらも1000行より前にスプライトの定義が必要です。
3000行以降にサブルーチン化してあります。
こちらのほうが実行速度は早くなるかもしれません。


その3

10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
20 DIM XO(9),YO(9)
30 XO(0)=0:XO(1)=0:XO(2)=1:XO(3)=1:XO(4)=1:XO(5)=0:XO(6)=-1:XO(7)=-1:XO(8)=-1
40 YO(0)=0:YO(1)=-1:YO(2)=-1:YO(3)=0:YO(4)=1:YO(5)=1:YO(6)=1:YO(7)=0:YO(8)=-1

1000  S=STICK(0) OR STICK(1)
1010 X=X+XO(S):Y=Y+YO(S)
1020 PUT SPRITE 0,(X*8 ,Y*8),15,0
1030  GOTO 1000

一番早いかもしれません。
こちらも1000行より前にスプライトの定義が必要です。

スプライト同士の当たり判定

その1

1020 IF X-16>EX AND X+16<EX THEN PRINT"X ATARI"
1030 IF Y-16>EY AND Y+16<EY THEN PRINT"Y ATARI"

1020行がX座標のみ。
1030行がY 座標のみ。
EXとEYは敵の座標とします。

その2

1020 IF ABS(X-EX)<16 AND ABS(Y-EY)<16 THEN FG=1

EXとEYは敵の座標とします。
当たった場合は、FGに1を入れます。




文字をブロックの絵に変更

その1 SCREEN1 8文字単位で、1文字あたり2色
https://msxpen.com/codes/-LaRkBCne83kKbyOZ9po

その2 SCREEN1.5 多色刷り 1文字単位で、1ライン2色
https://msxpen.com/?code=-LaRlxeHJ2QS7Z10Zr-m

 
その1

10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
200 M=ASC("a"):RESTORE 5000
210 FOR I=0 TO 7
220 READ BG$
230 VPOKE M*8+I,VAL("&B"+BG$)
240 NEXT
250 VPOKE &H2000+M\8,&HD1
260 '
270 print"aaaaaaaa"
280 end
5000 'block
5010 DATA11100111
5020 DATA11100111
5030 DATA11000111
5040 DATA00000000
5050 DATA01111110
5060 DATA01111110
5070 DATA01110010
5080 DATA00000000

aという文字の形を変えます。
5000行以降のDATAの形になります。

250 VPOKE &H2000+M\8,&HD1
の \ の文字はMSXでは¥の文字なのですが、
コピペで使うには、 \ となります。

f:id:nyaonyaokun:20180925100102p:plain
250行の &HD1が色です。
5000行のDATAの1の部分がD色(赤っぽい色)、0の部分が1色(黒色)です。
f:id:nyaonyaokun:20190421133324p:plain


その2

10 COLOR15,1,1:SCREEN2:SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
20 DEFUSR=&H7E:A=USR(0)
200 'BLOCK TEIGI
210 M=ASC("a"):RESTORE5000
220 'KATACHI
230 FOR I=0 TO 7
240 READ BG$
250 VPOKE M*8+I,VAL("&B"+BG$)
260 VPOKE &H800+M*8+I,VAL("&B"+BG$)
270 VPOKE &H1000+M*8+I,VAL("&B"+BG$)
280 NEXT
290 'COLOR
300 FOR I=0 TO 7
310 READ CR$
320 VPOKE &H2000+M*8+I,VAL("&H"+CR$)
330 VPOKE &H2800+M*8+I,VAL("&H"+CR$)
340 VPOKE &H3000+M*8+I,VAL("&H"+CR$)
350 NEXT
360 '
370 print"aaaaaaaa"
380 end
5000 'block
5010 DATA11100111
5020 DATA11100111
5030 DATA11000111
5040 DATA00000000
5050 DATA01111110
5060 DATA01111110
5070 DATA01110010
5080 DATA00000000
5090 'COLOR
5100 DATAF1,71,51,51,51,41,41,41

aの文字をカラフルな形に変えます。
5100行のDATA文が色となっています。
上から1ラインづつ色が変わります。
最初の16進数の数字が1、後ろの数字が0の色になります。
F1,71,51,51....のF1だったら、
5000行のDATAの1の部分がF色(白色)、0の部分が1色(黒色)です。
f:id:nyaonyaokun:20180925100102p:plain

5000行は、白白白黒黒白白白
5010行は、水水水黒黒水水水
5020行は、青青黒黒黒青青青
となります。
f:id:nyaonyaokun:20190421124340p:plain


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

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