MSX BASICでゲームを作っていて、何気にプログラムがし辛いと感じています^^;
まぁ、仕事でもないとプログラムのアルゴリズムって
暗記できないですよねぇ〜。
そこで、
今まで紹介してきたBASICプログラムのサンプル集を作っておこうと思いました。
このページでコピペして効率よくゲームを作っていただけたら幸いです^^
(暫定。もっと使いやすいように追記していきます。)
その他、MSX BASICの基本のページについての
目次はこちら
www.nyaonyao21.com
初期設定
その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進数
MSXPEN
https://msxpen.com/?code=-LaN44f2dVV5GAstAvX5
その2 16X16スプライト 8個 DATA型は2進数
MSXPEN
https://msxpen.com/codes/-LaN7JDqhFV99NkuzxjY
その3 16X16 スプライト1個 DATA型は16進数 SPRITE Editor TinySpriteより
MSXPEN
https://msxpen.com/codes/-LaRhGqHDZLg6E-yb-IE
その1
10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF 100 'SPRITE TEIGI 110 RESTORE 5000 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 5000 'SPRITE NO.0 5010DATA00,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 5020 'SPRITE NO.1 5030DATA00,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 5040 'SPRITE NO.2 5050DATA00,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 5060 'SPRITE NO.3 5070DATA00,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 5080 'SPRITE NO.4 5090DATA00,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 5100 'SPRITE NO.5 5110DATA00,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 5120 'SPRITE NO.6 5130DATA00,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 5140 'SPRITE NO.7 5150DATA00,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ドット目
↓
このようなDATA順で定義しています。
その2
10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF 100 RESTORE 5000 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 4995 'SPRITE UP0 DATA 5000 DATA1000000000000000 5010 DATA1000000000000000 5020 DATA1010011111110010 5030 DATA1010111111111010 5040 DATA1011111111111110 5050 DATA1001111111111100 5060 DATA1001111111111100 5070 DATA1001111111111100 5080 DATA1001111111111100 5090 DATA1110111111111000 5100 DATA1110011111110111 5110 DATA1110000000001111 5120 DATA1000011101111111 5130 DATA0000000111001111 5140 DATA0000011000110110 5150 DATA0000011000000000 5155 'SPRITE UP1 DATA 5160 DATA0000000000000000 5170 DATA0000000000000000 5180 DATA1010011111110010 5190 DATA1010111111111010 5200 DATA1011111111111110 5210 DATA1001111111111100 5220 DATA1001111111111100 5230 DATA1001111111111100 5240 DATA1001111111111100 5250 DATA1000111111111011 5260 DATA1000011111110111 5270 DATA1110000000011111 5280 DATA1110011101111111 5290 DATA1110000111001110 5300 DATA1000011000110000 5310 DATA0000000000110000 5315 'SPRITE RIGHT2 DATA 5320 DATA0000000000000000 5330 DATA0000000000000000 5340 DATA1001111111000000 5350 DATA1011111111101000 5360 DATA1101111111111000 5370 DATA0011111111110001 5380 DATA1111111011010001 5390 DATA1111111011010001 5400 DATA1111111111110010 5410 DATA0111001111110010 5420 DATA1111101111100100 5430 DATA1101100000000100 5440 DATA1000101101011000 5450 DATA1101101111011000 5460 DATA0111110000000000 5470 DATA0000111011000000 5475 'SPRITE RIGHT3 DATA 5480 DATA0000000000000000 5490 DATA0000000000000000 5500 DATA0100111111100010 5510 DATA0101111111110110 5520 DATA0110111111111110 5530 DATA0001111111111010 5540 DATA0111111101101010 5550 DATA0111111101101010 5560 DATA0111111111111010 5570 DATA0011100111111010 5580 DATA0111110111110010 5590 DATA0110110000000010 5600 DATA0100010110100111 5610 DATA0110110111000111 5620 DATA0011110000010010 5630 DATA0001110000011100 5635 'SPRITE DOWN4 DATA 5640 DATA0000000000000000 5650 DATA0000000000000000 5660 DATA1010011111110010 5670 DATA1010111111111010 5680 DATA1011111111111110 5690 DATA1001111111111100 5700 DATA1001110111011100 5710 DATA1001110111011100 5720 DATA1001111111111100 5730 DATA1000111111111111 5740 DATA1000011111111011 5750 DATA1000000000010001 5760 DATA1110011101111011 5770 DATA1110000111001110 5780 DATA1000011000110000 5790 DATA0000000000110000 5795 'SPRITE DOWN5 DATA 5800 DATA0000000000000000 5810 DATA1000000000000000 5820 DATA1010011111110010 5830 DATA1010111111111010 5840 DATA1011111111111110 5850 DATA1001111111111100 5860 DATA1001110111011100 5870 DATA1001110111011100 5880 DATA1001111111111100 5890 DATA1000111111111000 5900 DATA1110011111111111 5910 DATA1110000000011011 5920 DATA1110011101110001 5930 DATA1000000111011011 5940 DATA0000011000111110 5950 DATA0000011000000000 5955 'SPRITE LEFT6 DATA 5960 DATA0000000000000000 5970 DATA0000000000000000 5980 DATA0000001111111001 5990 DATA0001011111111101 6000 DATA0001111111111011 6010 DATA1000111111111100 6020 DATA1000101101111111 6030 DATA1000101101111111 6040 DATA0100111111111111 6050 DATA0100111111001110 6060 DATA0010011111011111 6070 DATA0010000000011011 6080 DATA0001101011010001 6090 DATA0001101111011011 6100 DATA0000000000111110 6110 DATA0000001101110000 6115 'SPRITE LEFT7 DATA 6120 DATA0000000000000000 6130 DATA0000000000000000 6140 DATA0100011111110010 6150 DATA0110111111111010 6160 DATA0111111111110110 6170 DATA0101111111111000 6180 DATA0101011011111110 6190 DATA0101011011111110 6200 DATA0101111111111110 6210 DATA0101111110011100 6220 DATA0100111110111110 6230 DATA0100000000110110 6240 DATA1110010110100010 6250 DATA1110001110110110 6260 DATA0100100000111100 6270 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,Y),15,0 1030 GOTO 1000
一番早いかもしれません。
こちらも1000行より前にスプライトの定義が必要です。
具体的なサンプル
(BASICでは、スピード的に8ドット単位の移動がいいです)
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 100 'SPRITE TEIGI 110 RESTORE 3000 120 FOR J=0 TO 0 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 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 3000 'SPRITE NO.0 3010 DATA00,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
MSXPEN
https://msxpen.com/codes/-Ld0NJFlAtERuXZhH3Ix
(macの場合
MSXPENはコード編集はsafariが吉です)
tinyspriteさんのサイトでスプライトのデザインをした場合の
サンプル
10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF 12 DIM XO(9),YO(9) 14 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 16 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 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 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 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
MSXPEN
https://msxpen.com/codes/-Ld0QK1pMleQ-8AnWOiJ
tinysprite様
TinySprite 0.7.0 - MSX Sprite Editor
スプライトの歩行アニメーション
その1
1000 S=STICK(0) OR STICK(1) 1010 IF S=1 THEN Y=Y-1:H=(H+1)MOD 2 1020 IF S=2 THEN X=X+1:Y=Y-1:H=(H+1)MOD 2+2 1030 IF S=3 THEN X=X+1 :H=((H+1)MOD 2)+4 1040 IF S=4 THEN X=X+1:Y=Y+1:H=((H+1)MOD 2)+6 1050 IF S=5 THEN Y=Y+1:H=((H+1)MOD 2)+8 1060 IF S=6 THEN X=X-1:Y=Y+1:H=((H+1)MOD 2)+10 1070 IF S=7 THEN X=X-1:H=((H+1)MOD 2)+12 1080 IF S=8 THEN X=X-1:Y=Y-1:H=(H+1)MOD 2+14 1090 PUT SPRITE 0,(X ,Y),15,H 1100 GOTO 1000
1000行より前にスプライトの定義をしてください
上向き (S=1):スプライトパターン 0 , 1
右上向き(S=2):スプライトパターン 2 , 3
右向き (S=3):スプライトパターン 4 , 5
右下向き(S=4):スプライトパターン 6 , 7
下向き (S=5): スプライトパターン8 , 9
左下向き(S=6):スプライトパターン 10, 11
左向き (S=7): スプライトパターン12, 13
左上向き(S=8):スプライトパターン 14, 15
絵を描き、それぞれのスプライトパターンに設定してください。
SPRITE$(0)=ほにゃらら でスプライトパターン0に設定できます。
その1改
1000 S=STICK(0) OR STICK(1) 1010 IF S=1 THEN Y=Y-1:H=(H+1)MOD 2 1020 IF S=2 THEN X=X+1:Y=Y-1:H=(H+1)MOD 2 1030 IF S=3 THEN X=X+1 :H=((H+1)MOD 2)+2 1040 IF S=4 THEN X=X+1:Y=Y+1:H=((H+1)MOD 2)+4 1050 IF S=5 THEN Y=Y+1:H=((H+1)MOD 2)+4 1060 IF S=6 THEN X=X-1:Y=Y+1:H=((H+1)MOD 2)+4 1070 IF S=7 THEN X=X-1:H=((H+1)MOD 2)+6 1080 IF S=8 THEN X=X-1:Y=Y-1:H=(H+1)MOD 2 1090 PUT SPRITE 0,(X ,Y),15,H 1100 GOTO 1000
1000行より前にスプライトの定義をしてください
上向き (S=1):スプライトパターン 0 , 1
右上向き(S=2):スプライトパターン 0 , 1
右向き (S=3):スプライトパターン 2 , 3
右下向き(S=4):スプライトパターン 4 , 5
下向き (S=5): スプライトパターン4 , 5
左下向き(S=6):スプライトパターン 4 , 5
左向き (S=7): スプライトパターン6 , 7
左上向き(S=8):スプライトパターン 0, 1
こちらだとスプライトパターンは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 H=(H+1)MOD 2 3030 RETURN 3100 ' S=2 UP RIGHT 3110 X=X+1:Y=Y-1 3120 H=(H+1)MOD 2 3130 RETURN 3200 ' S=3 RIGHT 3210 X=X+1 3220 H=(H+1)MOD 2+2 3230 RETURN 3300 ' S=4 RIGHT DOWN 3310 X=X+1:Y=Y+1 3320 H=(H+1)MOD 2 +4 3330 RETURN 3400 ' S=5 DOWN 3410 Y=Y+1 3420 H=(H+1)MOD 2 +4 3430 RETURN 3500 ' S=6 LEFT DOWN 3510 X=X-1:Y=Y+1 3520 H=(H+1)MOD 2 +4 3530 RETURN 3600 ' S=7 LEFT 3610 X=X-1 3620 H=(H+1)MOD 2 +6 3630 RETURN 3700 ' S=8 UP LEFT 3710 X=X-1:Y=Y-1 3720 H=(H+1)MOD 2 3730 RETURN
具体的な歩きアニメーションのサンプル
10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF 100 'SPRITE TEIGI 110 RESTORE 5000 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 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,H 1030 GOTO 1000 2990 ' 3000'S=1 UP 3010 Y=Y-1 3020 H=(H+1)MOD 2 3030 RETURN 3100 ' S=2 UP RIGHT 3110 X=X+1:Y=Y-1 3120 H=(H+1)MOD 2 3130 RETURN 3200 ' S=3 RIGHT 3210 X=X+1 3220 H=(H+1)MOD 2+2 3230 RETURN 3300 ' S=4 RIGHT DOWN 3310 X=X+1:Y=Y+1 3320 H=(H+1)MOD 2 +4 3330 RETURN 3400 ' S=5 DOWN 3410 Y=Y+1 3420 H=(H+1)MOD 2 +4 3430 RETURN 3500 ' S=6 LEFT DOWN 3510 X=X-1:Y=Y+1 3520 H=(H+1)MOD 2 +4 3530 RETURN 3600 ' S=7 LEFT 3610 X=X-1 3620 H=(H+1)MOD 2 +6 3630 RETURN 3700 ' S=8 UP LEFT 3710 X=X-1:Y=Y-1 3720 H=(H+1)MOD 2 3730 RETURN 5000 'SPRITE NO.0 5010DATA00,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 5020 'SPRITE NO.1 5030DATA00,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 5040 'SPRITE NO.2 5050DATA00,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 5060 'SPRITE NO.3 5070DATA00,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 5080 'SPRITE NO.4 5090DATA00,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 5100 'SPRITE NO.5 5110DATA00,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 5120 'SPRITE NO.6 5130DATA00,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 5140 'SPRITE NO.7 5150DATA00,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
5000行以降のスプライトデータを入れ替えてください。
tinyspriteさんなどで16進数データを作るといいと思います。
3000行からの移動のサブルーチンにBGとの当たり判定などを
いれるといいと思います。
MSXPEN
https://msxpen.com/codes/-Ld60u7R_h_Kuw6-2Mu7
Tinyspriteさんでデザインしたスプライトで
具体的な歩きアニメーションのサンプル
10 SCREEN1,2:COLOR1,15,1:WIDTH32:DEFINTA-Z:KEYOFF 15 ' --- Slot 0 20 ' color 4 30 DATA 07,1F,37,2F,2F,3F,BF,FF,FF,7F,3F,3F,3F,1F,3B,78 40 DATA E0,F8,FC,FC,FC,FC,FC,FE,FF,FF,FD,FC,FC,FC,DE,C0 50 ' 60 ' --- Slot 1 70 ' color 4 80 DATA 07,1F,37,2F,2F,3F,3F,7F,FF,FF,BF,3F,3F,3F,7B,03 90 DATA E0,F8,FC,FC,FC,FC,FD,FF,FF,FE,FC,FC,FC,F8,DC,1E 100 ' 110 ' --- Slot 2 120 ' color 4 130 DATA 03,07,0F,1F,1F,1F,1F,3F,3F,3F,7F,FD,FE,7F,30,60 140 DATA F0,F8,FC,DC,DC,FF,FE,FC,84,04,84,C5,0B,F6,04,00 150 ' 160 ' --- Slot 3 170 ' color 4 180 DATA 03,07,0F,1F,1F,1F,1F,1F,37,37,2E,2C,72,7E,FF,0F 190 DATA F0,F8,FC,DC,DC,FF,FE,FC,06,06,07,05,04,08,F0,78 200 ' 210 ' --- Slot 4 220 ' color 4 230 DATA 07,1F,3F,3B,3B,3F,BC,F8,FF,70,20,20,20,14,3B,78 240 DATA E0,F8,FC,DC,DC,FC,3C,1E,FF,0F,05,04,04,2C,DE,00 250 ' 260 ' --- Slot 5 270 ' color 4 280 DATA 07,1F,3F,3B,3B,3F,3C,78,FF,F0,A0,20,20,1C,7B,00 290 DATA E0,F8,FC,DC,DC,FC,3D,1F,FF,0E,04,04,04,28,DC,1E 300 ' 310 ' --- Slot 6 320 ' color 4 330 DATA 0F,1F,3F,3B,3B,FF,7F,3F,21,20,21,A3,D0,6F,20,00 340 DATA C0,E0,F0,F8,F8,F8,F8,FC,FC,FC,FE,BF,7F,FE,0C,06 350 ' 360 ' --- Slot 7 370 ' color 4 380 DATA 0F,1F,3F,3B,3B,FF,7F,3F,60,60,E0,A0,20,10,0F,1E 390 DATA C0,E0,F0,F8,F8,F8,F8,F8,EC,EC,74,34,4E,7E,FF,F0 400 DATA * 410 GOSUB 10000 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),4,H 1030 GOTO 1000 2990 ' 3000'S=1 UP 3010 Y=Y-1 3020 H=(H+1)MOD 2 3030 RETURN 3100 ' S=2 UP RIGHT 3110 X=X+1:Y=Y-1 3120 H=(H+1)MOD 2 3130 RETURN 3200 ' S=3 RIGHT 3210 X=X+1 3220 H=(H+1)MOD 2+2 3230 RETURN 3300 ' S=4 RIGHT DOWN 3310 X=X+1:Y=Y+1 3320 H=(H+1)MOD 2 +4 3330 RETURN 3400 ' S=5 DOWN 3410 Y=Y+1 3420 H=(H+1)MOD 2 +4 3430 RETURN 3500 ' S=6 LEFT DOWN 3510 X=X-1:Y=Y+1 3520 H=(H+1)MOD 2 +4 3530 RETURN 3600 ' S=7 LEFT 3610 X=X-1 3620 H=(H+1)MOD 2 +6 3630 RETURN 3700 ' S=8 UP LEFT 3710 X=X-1:Y=Y-1 3720 H=(H+1)MOD 2 3730 RETURN 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
Tinyspriteさんでは、Slotを8つ用意して、
それぞれに絵を描きます。
https://msxpen.com/codes/-LdDW8R2_KS_EKGGjoqT
スプライトサンプル
上のが歩くアニメスピードが早すぎると思われる方はこちら。
10 SCREEN1,2:COLOR1,15,1:WIDTH32:DEFINTA-Z:KEYOFF 15 ' --- Slot 0 20 ' color 4 30 DATA 07,1F,37,2F,2F,3F,BF,FF,FF,7F,3F,3F,3F,1F,3B,78 40 DATA E0,F8,FC,FC,FC,FC,FC,FE,FF,FF,FD,FC,FC,FC,DE,C0 50 ' 60 ' --- Slot 1 70 ' color 4 80 DATA 07,1F,37,2F,2F,3F,3F,7F,FF,FF,BF,3F,3F,3F,7B,03 90 DATA E0,F8,FC,FC,FC,FC,FD,FF,FF,FE,FC,FC,FC,F8,DC,1E 100 ' 110 ' --- Slot 2 120 ' color 4 130 DATA 03,07,0F,1F,1F,1F,1F,3F,3F,3F,7F,FD,FE,7F,30,60 140 DATA F0,F8,FC,DC,DC,FF,FE,FC,84,04,84,C5,0B,F6,04,00 150 ' 160 ' --- Slot 3 170 ' color 4 180 DATA 03,07,0F,1F,1F,1F,1F,1F,37,37,2E,2C,72,7E,FF,0F 190 DATA F0,F8,FC,DC,DC,FF,FE,FC,06,06,07,05,04,08,F0,78 200 ' 210 ' --- Slot 4 220 ' color 4 230 DATA 07,1F,3F,3B,3B,3F,BC,F8,FF,70,20,20,20,14,3B,78 240 DATA E0,F8,FC,DC,DC,FC,3C,1E,FF,0F,05,04,04,2C,DE,00 250 ' 260 ' --- Slot 5 270 ' color 4 280 DATA 07,1F,3F,3B,3B,3F,3C,78,FF,F0,A0,20,20,1C,7B,00 290 DATA E0,F8,FC,DC,DC,FC,3D,1F,FF,0E,04,04,04,28,DC,1E 300 ' 310 ' --- Slot 6 320 ' color 4 330 DATA 0F,1F,3F,3B,3B,FF,7F,3F,21,20,21,A3,D0,6F,20,00 340 DATA C0,E0,F0,F8,F8,F8,F8,FC,FC,FC,FE,BF,7F,FE,0C,06 350 ' 360 ' --- Slot 7 370 ' color 4 380 DATA 0F,1F,3F,3B,3B,FF,7F,3F,60,60,E0,A0,20,10,0F,1E 390 DATA C0,E0,F0,F8,F8,F8,F8,F8,EC,EC,74,34,4E,7E,FF,F0 400 DATA * 410 GOSUB 10000 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),4,H/4 1030 GOTO 1000 2990 ' 3000'S=1 UP 3010 Y=Y-1 3020 H=(H+1)MOD 8 3030 RETURN 3100 ' S=2 UP RIGHT 3110 X=X+1:Y=Y-1 3120 H=(H+1)MOD 8 3130 RETURN 3200 ' S=3 RIGHT 3210 X=X+1 3220 H=(H+1)MOD 8+8 3230 RETURN 3300 ' S=4 RIGHT DOWN 3310 X=X+1:Y=Y+1 3320 H=(H+1)MOD 8 +16 3330 RETURN 3400 ' S=5 DOWN 3410 Y=Y+1 3420 H=(H+1)MOD 8 +16 3430 RETURN 3500 ' S=6 LEFT DOWN 3510 X=X-1:Y=Y+1 3520 H=(H+1)MOD 8 +16 3530 RETURN 3600 ' S=7 LEFT 3610 X=X-1 3620 H=(H+1)MOD 8 +24 3630 RETURN 3700 ' S=8 UP LEFT 3710 X=X-1:Y=Y-1 3720 H=(H+1)MOD 8 3730 RETURN 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
上との違いをみて下さい。
3020行以下がMOD 8となっています。
1020行のPUT SPRITEがH/4となっています。
複数の敵スプライト
10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF 20 DIMEX(2):DIMEY(2):DIMEM(2):DIMEP(2) 30 EN=0 40 EK=2 50 EX(0)=0:EY(0)=0 60 EX(1)=100:EY(1)=100 70 EM(0)=1:EM(1)=1 80 EP(0)=0:EP(1)=1 2000 'ENEMY 2010 EX(EN)=EX(EN)+EM(EN) 2020 PUT SPRITE EN,(EX(EN),EY(EN)-1),15,EP(EN) 2030 EN=EN+1:IF EN>EK-1 THEN EN=0
敵キャラが2体の場合です。
EN...動かす敵スプライトのナンバー
EK...敵キャラの数
EX( )...敵のX座標
EY( )...敵のY座標
EM( )...敵の移動量(X=X+1 , Y=Y+1などの1の部分です)
EP( )...敵スプライトナンバー。
20行の2の値が、敵スプライトの数です。ここを変更。
30行〜70行変更。
2000行より前にスプライトの定義がいります。
2010行のEM( )を変えてやると、敵キャラがそれぞれ異なった動きをさせることができます。
2020行で PUT SPRITE ENとなっていますが、プレイヤーをスプライト0にした場合は、
敵キャラは、PUT SPRITE EN+1とするといいでしょう。
(PUT SPRITE スプライトナンバー , (EX(ナンバー) , EY(ナンバー) , 色 , スプライトパターン)
(スプライトパターンは、SPRITE$(スプライトパターン)です。 )
2030行で、1回のループごとに動かす敵キャラクタースプライトを切り替えます。
MSX BASIC 敵キャラをたくさん出す!BASICだと遅くなってしまうのですが、そこをなんとかする方法です^^基礎 その7 - ニャオニャオ21世紀
具体的に
10 SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF 20 DIMEX(2):DIMEY(2):DIMEM(2):DIMEP(2) 30 EN=0 40 EK=2 50 EX(0)=0:EY(0)=0 60 EX(1)=100:EY(1)=100 70 EM(0)=1:EM(1)=1 80 EP(0)=0:EP(1)=1 100 'SPRITE TEIGI 110 RESTORE 3000 120 FOR J=0 TO 1 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 2000 'ENEMY 2010 EX(EN)=EX(EN)+EM(EN) 2020 PUT SPRITE EN,(EX(EN),EY(EN)-1),15,EP(EN) 2030 EN=EN+1:IF EN>EK-1 THEN EN=0 2040 GOTO 2000 3000 'SPRITE NO.0 3010 DATA00,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 3030 DATA00,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
スプライト同士の当たり判定
その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では¥の文字なのですが、
コピペで使うには、 \ となります。
250行の &HD1が色です。
5000行のDATAの1の部分がD色(赤っぽい色)、0の部分が1色(黒色)です。
その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色(黒色)です。
5000行は、白白白黒黒白白白
5010行は、水水水黒黒水水水
5020行は、青青黒黒黒青青青
となります。