ニャオニャオ21世紀

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

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

MSXの機体の情報が一杯 これは必見の書籍!! 僕らの好きなMSXハードカタログ

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

f:id:nyaonyaokun:20180925100102p:plain


その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ドット目

f:id:nyaonyaokun:20190321045302p:plain

    ↓
f:id:nyaonyaokun:20190321045404p:plain
このような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では¥の文字なのですが、
コピペで使うには、 \ となります。

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」をご覧ください