今回はARPGやRPGに使える画面切り替えを書きたいと思います。
敵の移動についてはまた今度。すみませんm(_ _)m
この基礎ブログは、ハイドライドオマージュが最終目標にしたいと思います。
そのためには、世界を表現するマップが必要です。
マップと言いますと、
ファミコンならスクロールでてくてくとどこまででも歩いていけるますねぇ。
ドラクエみたいなのとか。
でもMSXなので、スクロールのゲームは辛いです(~~;)
ましてやBASIC...
まず無理です。
MSX1にはハードウェアスクロールがないので。
MSX2+とかならできるんでしょうか?
MSX1といいますと、ハイドライド やガリウスの迷宮とかトリトーンとかみたいに
画面の端にいったら、次の画面が表示されるというのが多いのではないでしょうか?
今回は、画面の端にいったら、画面を書き換えるというのをやります。
(ハイドライド のように画面切り替えをスクロールでするのはマシン語でないと...)
昔のMSXマガジンで、BASICでRPGを作るというコーナーがありましたが、
あれが大変役にたつと思います^^
ドラクエタイプのRPGでしたが...
あまり期待はしないで頂きたいですが、
まぁBASICでここまでできたらちょっと感動しますね!
マップは4x3の12画面です。
最初、4x4でやっていたのですが、さすがにノー圧縮では無理みたいでw
画面切り替えの基礎なので、圧縮とかは一切やりません!
あまり知らないですし♪(´ε` )
今回は、マップは適当に作っています。
ゲームを完成させるときは、いろいろと考えて作らないと面白くないですけど、
MSX BASICの基礎が目的ですので。
MSXPen - MSX Developer Playground & Code Editor in the Browser
はじまるまで結構時間がかかりますm(_ _)m
その他、MSX BASICの基本のページについての
目次はこちら
それではソースコードを。
サンプルプログラム (ソースコード)
5 TIME=0
10 COLOR15,1,1:SCREEN2:SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
20 DEFUSR=&H7E:A=USR(0)
25 POKE &HF3B1,26
26 POKE &HF3DB,0
28 KEY1,CHR$(12)+"POKE&HF3B1,24"+CHR$(13)
30 KEY2,"SCREEN1"+CHR$(13)
35 DIMEX(4),EY(4),EM(4),UX(4),UY(4),ES(4),EC(4),EP(4)
39 EN=0:EK=4
40 X=20:Y=15:H=0:SX=2:SY=2
41 EX(0)=20:EY(0)=1:EX(1)=12:EY(1)=4:EX(2)=20:EY(2)=18:EX(3)=12:EY(3)=13
42 EM(0)=1:EM(1)=-1:EM(2)=1:EM(3)=-1
43 BS=&H1800:B2=&H800:B3=&H1000:C1=&H2000:C2=&H2800:C3=&H3000
44 DIMMP$(72)
46 EP(0)=8:EP(1)=8:EP(2)=8:EP(3)=8
47 EC(0)=7:EC(1)=7:EC(2)=7:EC(3)=7
48 NG=ASC("@")-1
50 'MOJI TEIGI========================
51 N=35
52 FOR J=0 TO 121
53 FOR I=0 TO 7
54 VPOKE B2+N*8+I,VPEEK(N*8+I)
55 VPOKE B3+N*8+I,VPEEK(N*8+I)
56 'COLOR TEIGI
57 VPOKE C1+N*8+I,&HF1
58 VPOKE C2+N*8+I,&HF1
59 VPOKE C3+N*8+I,&HF1
60 NEXT
61 N=N+1
63 NEXT
64 LOCATE10,10:PRINT"please wait!"
70 'SPRITE TEIGI======================
80 RESTORE 2000
90 FOR J=0 TO 9
100 FOR I=0 TO 15
110 READ DT$
120 L$=L$+CHR$(VAL("&B"+LEFT$(DT$,8)))
130 R$=R$+CHR$(VAL("&B"+RIGHT$(DT$,8)))
140 NEXT
150 SPRITE$(J) =L$+R$
160 L$="":R$=""
170 NEXT
175 'BLOCK TEIGI======================
180 M=ASC("#")
185 RESTORE 4010
186 FOR J=0 TO 29
187 BG$="":CR$=""
190 READ BG$,CR$
192 FOR I=0 TO 7
193 BK$="":CK$=""
195 BK$=MID$(BG$,I*2+1,2)
196 CK$=MID$(CR$,I*2+1,2)
200 VPOKE M*8+I,VAL("&H"+BK$)
210 VPOKE B2+M*8+I,VAL("&H"+BK$)
220 VPOKE B3+M*8+I,VAL("&H"+BK$)
250 VPOKE C1+M*8+I,VAL("&H"+CK$)
260 VPOKE C2+M*8+I,VAL("&H"+CK$)
270 VPOKE C3+M*8+I,VAL("&H"+CK$)
280 NEXT
290 M=M+1
295 IF M=40 THEN M=64
300 NEXT
435 'MAP
440 GOSUB 20500
890 'BGM WARIKOMI====================
900 RESTORE 20000
910 GOSUB 1860
920 ON INTERVAL=80 GOSUB 1860
930 INTERVAL ON
995 'MAIN LOOP
996 'PLAYER==========================
998 M=ASC("a")-1
999 H=4
1000 S=STICK(0) OR STICK(1)
1001 A=TIME
1010 TX=X:TY=Y
1018 'PLAYER
1020 ON S GOTO 1400,1040,1410,1040,1420,1040,1430,1040
1025 'PLAYER - ALL ENEMY ATARI HANTEI
1030 GOTO1680
1040 'SPRITE HYOUJI
1050 PUT SPRITE 0,(X*8 ,Y*8-1),15,H/2
1100 'ENEMY==========================
1220 UX(EN)=EX(EN):UY(EN)=EY(EN)
1230 EX(EN)=EX(EN)+EM(EN)
1235 IF EX(EN)<1 THEN EM(EN)=-EM(EN)
1236 IF EX(EN)>29 THEN EM(EN)=-EM(EN)
1240 EF=0
1250 IF EM(EN)>0 THEN1440
1260 IF EM(EN)<0 THEN1450
1270 'ENEMY - PLAYER ATARI HANTEI====
1280 GOTO1770
1330 PUT SPRITE EN+1,(EX(EN)*8,EY(EN)*8-1),EC(EN),EP(EN)
1340 EN=EN+1:IF EN>EK-1 THEN EN=0
1345 B=TIME
1346 C=B-A:TIME=0
1347 LOCATE0,0:PRINT C;"/60"
1350 GOTO1000
1395 'UP=============================
1400 IF Y=0 THEN Y=22:H=(H+1)MOD 4:GOTO1910
1401 Y=Y-1:H=(H+1)MOD 4
1402 IF VPEEK(BS+X+Y*32)>NG THEN X=TX:Y=TY
1403 IF VPEEK(BS+X+1+Y*32)>NG THEN X=TX:Y=TY
1405 GOTO1030
1409 'RIGHT
1410 IF X=30 THEN X=0:H=( (H+1)MOD 4)+4:GOTO1930
1411 X=X+1:H=( (H+1)MOD 4)+4
1412 IF VPEEK(BS+X+1+Y*32)>NG THEN X=TX:Y=TY
1413 IFVPEEK(BS+X+1+(Y+1)*32)>NG THEN X=TX:Y=TY
1415 GOTO1030
1419 'DOWN
1420 IF Y=22 THEN Y=0:H=( (H+1)MOD 4)+8:GOTO1950
1421 Y=Y+1:H=( (H+1)MOD 4)+8
1422 IF VPEEK(BS+X+(Y+1)*32)>NG THEN X=TX:Y=TY
1423 IF VPEEK(BS+X+1+(Y+1)*32)>NG THEN X=TX:Y=TY
1425 GOTO1030
1429 'LEFT
1430 IF X=0 THEN X=30:H=( (H+1)MOD 4)+12:GOTO1970
1431 X=X-1:H=( (H+1)MOD 4)+12
1432 IF VPEEK(BS+X+Y*32)>NG THEN X=TX:Y=TY
1433 IF VPEEK(BS+X+(Y+1)*32)>NG THEN X=TX:Y=TY
1435 GOTO1030
1438 'ENEMY CHIKEI======================
1439 'ENEMY RIGHT
1440 IF VPEEK(BS+EX(EN)+1+EY(EN)*32) >NG THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1441 IF VPEEK(BS+EX(EN)+1+(EY(EN)+1)*32) >NG THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1442 IF EF=1 THEN EM(EN)=-EM(EN)
1443 GOTO1270
1449 'ENEMY LEFT
1450 IF VPEEK(BS+EX(EN)+EY(EN)*32) >NG THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1451 IF VPEEK(BS+EX(EN)+(EY(EN)+1)*32) >NG THEN EX(EN)=UX(EN):EY(EN)=UY(EN):EF=1
1452 IF EF=1 THEN EM(EN)=-EM(EN)
1453 GOTO1270
1680 'PLAYER ALL ENEMY ATARI HANTEI===============
1690 ED=99
1700 FOR I=0 TO EK-1
1710 IF ABS(X-EX(I))<2 AND ABS(Y-EY(I))<2 THEN ED=I
1720 NEXT
1730 IF ED=99 THEN 1040
1740 X=TX:Y=TY
1745 PUT SPRITE 0,(X*8,Y*8-1),15,H/2
1747 'DAMAGE ENEMY
1750 PUT SPRITE ED+1,(EX(ED)*8,EY(ED)*8-1),9,9
1755 GOSUB1830
1756 PUT SPRITE ED+1,(EX(ED)*8,EY(ED)*8-1),EC(ED),EP(ED)
1760 GOTO1040
1765 'ENEMY ATARI HANTEI===========
1770 IF ABS(X-EX(EN))<2 THEN IF ABS(Y-EY(EN))<2 THEN1790
1780 GOTO1330
1790 EX(EN)=UX(EN):EY(EN)=UY(EN):EM(EN)=-EM(EN)
1800 PUT SPRITE 0,(X*8,Y*8-1),9,9:GOSUB1830
1810 PUT SPRITE 0,(X*8,Y*8-1),15,H/2
1820 GOTO1330
1825 'WAIT
1830 FOR I=0 TO 1000
1840 NEXT
1850 RETURN
1855 'BGM===============================
1860 IF PEEK(&HFB40)<>0 THEN RETURN
1870 READ U$
1880 IF U$="##" THEN RESTORE 20000:READ U$
1890 PLAY"O5"+U$
1900 RETURN
1365 'STAGE MOVE========================
1910 IF SY>0 THEN SY=SY-1 ELSE SY=2
1920 GOSUB21500:GOTO1100
1930 IF SX<3 THEN SX=SX+1 ELSE SX=0
1940 GOSUB21500:GOTO1100
1950 IF SY<2 THEN SY=SY+1 ELSE SY=0
1960 GOSUB21500:GOTO1100
1970 IF SX>0 THEN SX=SX-1 ELSE SX=3
1980 GOSUB21500:GOTO1100
1995 'SPRITE UP0 DATA===================
2000 DATA1000000000000000
2010 DATA1000000000000000
2020 DATA1010011111110010
2030 DATA1010111111111010
2040 DATA1011111111111110
2050 DATA1001111111111100
2060 DATA1001111111111100
2070 DATA1001111111111100
2080 DATA1001111111111100
2090 DATA1110111111111000
2100 DATA1110011111110111
2110 DATA1110000000001111
2120 DATA1000011101111111
2130 DATA0000000111001111
2140 DATA0000011000110110
2150 DATA0000011000000000
2155 'SPRITE UP1 DATA
2160 DATA0000000000000000
2170 DATA0000000000000000
2180 DATA1010011111110010
2190 DATA1010111111111010
2200 DATA1011111111111110
2210 DATA1001111111111100
2220 DATA1001111111111100
2230 DATA1001111111111100
2240 DATA1001111111111100
2250 DATA1000111111111011
2260 DATA1000011111110111
2270 DATA1110000000011111
2280 DATA1110011101111111
2290 DATA1110000111001110
2300 DATA1000011000110000
2310 DATA0000000000110000
2315 'SPRITE RIGHT2 DATA
2320 DATA0000000000000000
2330 DATA0000000000000000
2340 DATA1001111111000000
2350 DATA1011111111101000
2360 DATA1101111111111000
2370 DATA0011111111110001
2380 DATA1111111011010001
2390 DATA1111111011010001
2400 DATA1111111111110010
2410 DATA0111001111110010
2420 DATA1111101111100100
2430 DATA1101100000000100
2440 DATA1000101101011000
2450 DATA1101101111011000
2460 DATA0111110000000000
2470 DATA0000111011000000
2475 'SPRITE RIGHT3 DATA
2480 DATA0000000000000000
2490 DATA0000000000000000
2500 DATA0100111111100010
2510 DATA0101111111110110
2520 DATA0110111111111110
2530 DATA0001111111111010
2540 DATA0111111101101010
2550 DATA0111111101101010
2560 DATA0111111111111010
2570 DATA0011100111111010
2580 DATA0111110111110010
2590 DATA0110110000000010
2600 DATA0100010110100111
2610 DATA0110110111000111
2620 DATA0011110000010010
2630 DATA0001110000011100
2635 'SPRITE DOWN4 DATA
2640 DATA0000000000000000
2650 DATA0000000000000000
2660 DATA1010011111110010
2670 DATA1010111111111010
2680 DATA1011111111111110
2690 DATA1001111111111100
2700 DATA1001110111011100
2710 DATA1001110111011100
2720 DATA1001111111111100
2730 DATA1000111111111111
2740 DATA1000011111111011
2750 DATA1000000000010001
2760 DATA1110011101111011
2770 DATA1110000111001110
2780 DATA1000011000110000
2790 DATA0000000000110000
2795 'SPRITE DOWN5 DATA
2800 DATA0000000000000000
2810 DATA1000000000000000
2820 DATA1010011111110010
2830 DATA1010111111111010
2840 DATA1011111111111110
2850 DATA1001111111111100
2860 DATA1001110111011100
2870 DATA1001110111011100
2880 DATA1001111111111100
2890 DATA1000111111111000
2900 DATA1110011111111111
2910 DATA1110000000011011
2920 DATA1110011101110001
2930 DATA1000000111011011
2940 DATA0000011000111110
2950 DATA0000011000000000
2955 'SPRITE LEFT6 DATA
2960 DATA0000000000000000
2970 DATA0000000000000000
2980 DATA0000001111111001
2990 DATA0001011111111101
3000 DATA0001111111111011
3010 DATA1000111111111100
3020 DATA1000101101111111
3030 DATA1000101101111111
3040 DATA0100111111111111
3050 DATA0100111111001110
3060 DATA0010011111011111
3070 DATA0010000000011011
3080 DATA0001101011010001
3090 DATA0001101111011011
3100 DATA0000000000111110
3110 DATA0000001101110000
3115 'SPRITE LEFT7 DATA
3120 DATA0000000000000000
3130 DATA0000000000000000
3140 DATA0100011111110010
3150 DATA0110111111111010
3160 DATA0111111111110110
3170 DATA0101111111111000
3180 DATA0101011011111110
3190 DATA0101011011111110
3200 DATA0101111111111110
3210 DATA0101111110011100
3220 DATA0100111110111110
3230 DATA0100000000110110
3240 DATA1110010110100010
3250 DATA1110001110110110
3260 DATA0100100000111100
3270 DATA0011100000111000
3275 'SPRITE SLIME DATA
3280 DATA0000000000000000
3290 DATA0000000000000000
3300 DATA0000000000000000
3310 DATA0000000000000000
3320 DATA0000000000000000
3330 DATA0000000000000000
3340 DATA0000000000000000
3350 DATA0000000000000000
3360 DATA0000111111110000
3370 DATA0011111111111100
3380 DATA0111111111111110
3390 DATA1111111111111111
3400 DATA1111111111111111
3410 DATA1111111111111111
3420 DATA1111111111111111
3430 DATA0111111001111110
3435 'SPRITE DAMAGE
3440 DATA1111111111111111
3450 DATA1111111111111111
3460 DATA1111111111111111
3470 DATA1111111111111111
3480 DATA1111111111111111
3490 DATA1111111111111111
3500 DATA1111111111111111
3510 DATA1111111111111111
3520 DATA1111111111111111
3530 DATA1111111111111111
3540 DATA1111111111111111
3550 DATA1111111111111111
3560 DATA1111111111111111
3570 DATA1111111111111111
3580 DATA1111111111111111
3590 DATA1111111111111111
4000 'YUKA
4010 DATA0000000000000000,2222222222222222
4020 'BLOCK
4030 DATA7F7F7F00F7F7F700,4141414141414141
4040 'RIVER
4050 DATA00C0000600000060,F7F7F7F7F7F7F7F7
4060 'TREES
4070 DATA3E57A8D70B050B07,13131212121C1C1C
4080 DATA03D7BFD3C7C78368,1C1C161626262686
8990 'DRAGON
9000 DATAF8F87B7EFEFCFDFD,2C32312121312121
9010 DATAF87E3C7DFDFB7FF8,3231212131212132
9020 DATADFDBEABE9FDFFDFD,C12121C1C121C1C1
9030 DATABF9EDCEEEBFBFEFF,2121C1C121C1C121
9040 DATAB7B797C7677FFF7E,CF3F3FCE3E31C131
9050 DATA28305C6FDE5F2F37,F1F131C1C2C2C2C2
9060 DATAEDEDE9E3E67E7F7E,CF2F2FCE2E21C121
9070 DATA140C3A767B7AF4EC,F1F121C1C2C2C2C2
9080 DATA3F3F3D1D1F0FFFFF,C4C4C4C4C4C44444
9090 DATAFCFCBCB8F8F00000,C4C4C4C4C4C4C4C4
9100 DATA6060E0E0E0C0C080,C4C4C4C4C4C4C4C4
9110 DATA0606070707030301,C4C4C4C4C4C4C4C4
9115 'TAKARA
10010 DATA00010F3DDAB3B3B3,F1F1F1F1B1B1B6B1
10020 DATAB7348731C7390700,B171B1B1B1B1A1A1
10030 DATA00F8E43219594D73,F1F1F1A1A1A4ADA1
10040 DATA451555071C70C000,A1A1A1E1E1E1E1A1
10050 'CHIP
10060 DATABEFEFEFEFEF6F2FF,5141414141414111
10070 DATA6060000101181800,32C23232C232C232
10080 DATA0000000000000000,3232323232323232
10090 DATA0000000020505000,F6F6F6F6F6E6E6E6
10100 DATAFF92A4C992A4C992,1B1B1B1B1A1A1A1A
10110 DATAF0FFCF9FBF7F7F9A,313131312121212C
10120 DATA7D7F7FBEC003070F,C1C1C1C1C1828262
10130 DATA0F83C181D168F0F0,2121212121C1C1C1
10140 DATAE8C0D201B0E0F0F8,C1C1C1C161626262
19990 'MUSIC DATA
20000 DATAG4E8E4F8E8D8C8
20010 DATAG4E8E8D4R4
20020 DATAE8E8G8G8A8A8R8A8
20030 DATAO6C4O5E8E8G4R4
20040 DATAGE8E8F8E8D8C8
20050 DATAGE8E8D4R4
20060 DATAGE8E8A4G8G8
20070 DATAA8A8B8B8O6C4O5R4
20080 DATA##
20490 'MAP DATA
20500 MP$(0)= "####################################################################################################P%%%%P######################"
20510 MP$(1)= "#################################$$$$$$####$$$$$$$##$$$$$$$$$$$#####################################P%%%%P######################"
20520 MP$(2)= "################################$$$$$$$$$$$$$$$$$$$$$$$TTTTTTTTTTTTTT###############################P%%%%P######################"
20530 MP$(3)= "##############################PPPPPPPPPP$$$$$$$$$$$$$$$$$$$$$$$#####################################P%%%%P######################"
20540 MP$(4)= "##############################$$$$$$$$$P$$$$$$$$$$$$$$$$$$$$$$$#####################################P%%%%P######################"
20550 MP$(5)= "##############################$$$$$$$$$P$$$$$$$$$$$$$$$$$TTTTTTTTTTTT###############################P%%%%P######################"
20560 MP$(6)= "##############################PPPPPPP$$P$$$$$$$$$$$$$TTTTT&#&&&&&&##################################P%%%%P######################"
20570 MP$(7)= "####################################P$$P$$$$$$$$$$$$$$$$$T&&&&&&&&##################################P%%%%P######################"
20580 MP$(8)= "####################################P$$P$$$&&&$$$$$$$$$$$T&&&&''''##################################P%%%%P######################"
20590 MP$(9)= "#############UW#####################P$$P$$$&&&&&$$$$$$T$$T''''######################################P%%%%P######################"
20600 MP$(10)="#############VX#################PPPPP$$P&&&&&&&&$$$$$$T$$T#######################UW#################P%%%%P######################"
20610 MP$(11)="################################P$$$$$$P&&&&''''####$$$$$$UWPPPPP################VX#################P%%%%P######################"
20620 MP$(12)="################################P$$$$$$P&&&&##########$$$$VXP%%PP###################################P%%%%P######################"
20630 MP$(13)="################################P$$PPPPP&&&&##########$$$$$$P%%PP###################################P%%%%P######################"
20640 MP$(14)="################################P$$P&&&&&&&&UW########$$$$$$P%%PP###################################P%%%%P######################"
20650 MP$(15)="##########################PPPPPPP$$P&&&&&&&&VX#########$$$##P%%PP#####PP###PPP######################P%%%%P######################"
20660 MP$(16)="##########################PLN$$$$$$P'''&&&''###########$$$##P%%PPPPPPP%%PPP%%%P#####################P%%%%P######################"
20670 MP$(17)="##########################PMO$$$$$$P###'''#############$$$##P%%%%%%%%%%%%%%%%%P#####################P%%%%P######################"
20680 MP$(18)="##########################PPPPPPPPPP###################$$$##P%%%%%%%%%%%%%%%%%P#####################P%%%%P######################"
20690 MP$(19)="&&&&&##################################################$$$$#PPPPPPPP%%%%%%%%%%%P####################P%%%%P######################"
20700 MP$(20)="&&&&&&######################################$$$$$$$$###$$$$####TTLNP%%%%%%%%%%%P####################P%%%%P&&&&##################"
20710 MP$(21)="&&&&&&&#################################$$$$$$$$$$$$$##$$$$####TTMOP%%%%%%%%%%%P#########&&#########P%%%%P&&&&&#################"
20720 MP$(22)="'''&&&'###############################$$$$$$$TTTTTT$$$$$$$$$$$$TT##P%%%%%%%%%%P#########&&&&########P%%%%P&&&&&&################"
20730 MP$(23)="##&&&&&&########################$$$$$$$$TT$$$TTTTTT$$$$$$$$$$$$TT###P%%%%%%%%%P########&&&&&&#######P%%%%P&&&&&&################"
20740 MP$(24)="&&&&&&&'########################TLN$$$$$T$$$$$$@B$$$$$$$$$$$$$$TT###P%%%%%%%%%%P#######'&&&''#######P%%%%P&&&&&&########&&&&&&&&"
20750 MP$(25)="'''&&''#########################TMO$$$$$T$$$$$$AC$$$$$$$$$$$$$$TT##P%%%%%%%%%%%P########'''#########P%%%%P&&&&&#######&&&&&&&###"
20760 MP$(26)="###''###################################T$$$$$$@B$$$$$$TTTTTTTTTT##P%%%%%%%%%%%P#################&&&P%%%%P&&&&#######&&&&&&&####"
20770 MP$(27)="PPPPPPPPPPPPPPPPPPPPPP##PPPPPPPPPPPPPPPPT$$$$$$AC$$$$$$$$LN$$$$TT###PPP%%%%%%%%P################&&&&P%%%%PPPPPPPPPPPPPPPPPPPPPPP"
20780 MP$(28)="%%%%%%%%%%%%%%%%%%%%%P##P%%%%%%%%%%%%%%PT$$$$$KDFJ$$$$$LNMO$$$$TT######PPPPPPPP################&&&&&P%%%%%%%%%%%%%%%%%%%%%%%%%%%"
20790 MP$(29)="%%%%%%%%%%%%%%%%%%%%%P##P%%%%%%%%%%%%%%PT$$$$$$EG$$$$$$MOTTTTTTTT#############################&&&&&&P%%%%%%%%%%%%%%%%%%%%%%%%%%%"
20800 MP$(30)="PPPPPPPPPPPPPPPPPPPPPP##PPPPPPPPPPPPP%%PT$$$$$$HI$$TTTTTTT&#&&################################'&&&&&P%%%%PPPPPPPPPPPPPPPPPPPPPPP"
20810 MP$(31)="####################################P%%PT$$$$$$$$$$$$$$$$T&&&&&&&&&#########################&&&&&&&&P%%%%P######################"
20820 MP$(32)="####################################P%%PT$$TTT$$$$$$$$$$$T&&&&''&&&#######################&&&&&&&&&&P%%%%P######################"
20830 MP$(33)="#############UW#####################P%%PT$$T$$$$$$$T$$T$$T''''##'''#####################&&&&&&&&&&&&P%%%%P######################"
20840 MP$(34)="#############VX################PPPPPP%%PT$$T$$$$$$$T$$T$$T#######################UW####&&&&&&&&&&&&&P%%%%P######################"
20850 MP$(35)="###############################PP%%%%%%PTTTTTTTTTTTT$$TTTTUW#####################VX####'''''&&&&&&&&P%%%%P######################"
20860 MP$(36)="###############################PP%%%%%%P&&&&&&&&&#########VX##########################UW####''&&&&&&P%%%%P#########TTTTTT#######"
20870 MP$(37)="###############################PP%%PPPPP&&&&&&&&'##########################UW#########VX######'&&&&&P%%%%P#########T$$$$T#######"
20880 MP$(38)="###############################PP%%P&&&&&&&&UW''###########################VX##################'&&&&P%%%%P#########T$LN$$#######"
20890 MP$(39)="###################PPPPPPPPPPPPPP%%P&&&&&&&&VX&&&###########################################&&&&&&&&P%%%%P#########T$MO$$#######"
20900 MP$(40)="###################P%%%%%%%%%%%%%%%P'''&&&''##&&&###########################################'&&&&&&&P%%%%P#########T$$$$T#######"
20910 MP$(41)="###################P%%%%%%%%%%%%%%%P###'''####'''#######UW##########################UW#######&&&&&&&P%%%%P#########TTTTTT#######"
20920 MP$(42)="###################P%%PPPPPPPPPPPPPP####################VX##########################VX#######''&&&&&P%%%%P######################"
20930 MP$(43)="###################P%%P#####################################################################&&&&&&&&P%%%%P######################"
20940 MP$(44)="###################PPPP#####################################################################'''&&&&&P%%%%P######################"
20950 MP$(45)="#######################################################################&&&&&#################&&&&&&&P%%%%PTTTTTTTTTTTTTTTT######"
20960 MP$(46)="#####################################################################&&&&'''#################'&&&&&&P%%%%PT$$$$$P$$$$$$$$T######"
20970 MP$(47)="###################PPPP##############################################&&&&&&######&&&&&&#######''&&&&P%%%%PT$$$$$P$$$$$$$$T######"
20980 MP$(48)="###################P%%P#############UW############################&&&&&&&&&&&##&&&&&&''#####&&&&&&&&P%%%%PT$$P$$P$$$$$$$$T######"
20990 MP$(49)="###################P%%P#############VX############################&&&&''''&&&&&&&&'''######&&&&&&&&&P%%%%PT$$P$$P$$PPPP$$T######"
21000 MP$(50)="###################P%%P###########################################'&&&&##&&&&&&&''####&&&&&&&&&&&&&&P%%%%PT$$P$$$$$P$$$$$T######"
21010 MP$(51)="###################P%%PPPPPPPPPPPPPPPPPP###########################''''##''&&&''####&&&&&&'''''&&&&&P%%%%PT$$P$$$$$P$$$$$T######"
21020 MP$(52)="###################P%%%%%%%%%%%%%%%%%%%P#################################&&&&&&&####&&&&&&#####'''''P%%%%PTPPPPPP$$PPPP$$T######"
21030 MP$(53)="###################P%%%%%%%%%%%%%%%%%%%P####&&&############&&&&##########'&&&&&'###&&&&&&&##########P%%%%PT$$$$$$$$$$$P$$T######"
21040 MP$(54)="###################PPPPPPPPPPPPPPPPPP%%P#&&&&&&&##########&&&&'##########&&&&&&&###'&&&&&'########&&P%%%%PT$$$$$$$$$$$P$$T######"
21050 MP$(55)="####################################P%%P#&&&&&&&##########&&&&&&#########'&&&&''###&&&&&&&######&&&&P%%%%PT$$P$$PPPP$$P$$T######"
21060 MP$(56)="####################################P%%P#&&&&&&&&#########&&&&''##########''''#####''&&&&&&#####'&&&P%%%%PT$$P$$$$$$$$$$$T######"
21070 MP$(57)="#############UW#####################P%%P&&&&&&&&&#########''''######################&&&&&&'#####&&&&P%%%%PT$$P$$$$$$$$$$$T######"
21080 MP$(58)="#############VX################PPPPPP%%P&&&&&&&&&################################UW#''''''######''''P%%%%PT$$PPPPPPPPPP$$T######"
21090 MP$(59)="###############################PP%%%%%%P&&&&&&&&&################################VX#################P%%%%PT$$$$$$$$PLN$$$T######"
21100 MP$(60)="###############################PP%%%%%%P&&&&&&PPPP#####PPÅPP#########################################P%%%%PT$$$$$$$$PMO$$$T######"
21110 MP$(61)="###############################PP%%PPPPP&&&&&P%%%%PPPPP%%%%PP#######################################PPPPPPTTTTTTT$$TTTTTTT######"
21120 MP$(62)="###############################PP%%P&&&&&'''P%%%%%%%%%%%##%%%P##################################################################"
21130 MP$(63)="###############################PP%%P&&'''###P%%%%%%%%%%#LN#%%P##################################################################"
21140 MP$(64)="########UW#####################PP%%P''#####P%%%%%%PP%%%#MO#%%P######################################PPPPPP######################"
21150 MP$(65)="########VX#####################PP%%P######P%%%%PPP##PP%####%%P######################################P%%%%P######################"
21160 MP$(66)="###############################PPPPP######P%%%%P####P%%%%%%%P#######################################P%%%%P######################"
21170 MP$(67)="##########################################P%%%%%#####PPPPPPPP#######################################P%%%%P######################"
21180 MP$(68)="##########################################P%%%%%####################################################P%%%%P######################"
21190 MP$(69)="###########################################PPPPP####################################################P%%%%P######################"
21200 MP$(70)="####################################################################################################P%%%%P######################"
21210 MP$(71)="####################################################################################################P%%%%P######################"
21490 'MAP HYOUJI=============================
21500 PUT SPRITE 0,(X*8,Y*8-1),15,H/2
21510 CLS:K=0:FOR I=SY*24 TO SY*24+23
21520 LOCATE 0,K:PRINT MID$(MP$(I),SX*32+1,32)
21530 K=K+1:NEXT
21540 RETURN
マップ表示のプログラムの解説
最初に、前回のBASICの高速化のところで、
全体の座標をキャラクターベースの座標に変えました。
今までは、
X: 0 ~ 255
Y: 0 ~ 191
の座標で色々と計算していましたが、
(PUT SPRITE 0,(X,Y), , はこちらの座標を使っています。)
それだとところどころで割り算を使用しないといけないから
(VPEEKとかですね^^)
遅いと指摘して頂き、
キャラクターベース(文字座標)の
X: 0 ~ 31
Y: 0 ~ 23
に変えました。
これは、LOCATE X,Yとかで使う座標です。
スプライトの表示はX*8 , Y*8の座標になります。
(8ドット単位でしか動かせないのですけどね^^;)
前回は、ハイドライド の内藤さんに教えて頂き、
上のプログラムよりもっと速く、短いプログラムに修正したのですが、
直感的にわかりづらいかなぁ^^;と思い、
今回はわかりやすい方法にしました。
(それでも最初の頃より速いです!)
この基礎講座を終えて、最終的に完成させる時には、
内藤さんの方法に戻したいと思います。
ご了承くださいm(_ _)m
マップの表示方法も変えました。
今までは、
メインループの前に、一度PRINTですべての地形を表示していました。
(横32文字 X 縦20行とか)
500 LOCATE 0,0:PRINT "caaaaaaaaaaaaaaaaaaaaaaaaaaaaaad"
510 LOCATE 0,1:PRINT "b b"
520 LOCATE 0,2:PRINT "b b"
530 LOCATE 0,3:PRINT "b j haaaaaaad haaaaaaaaaai b"
540 LOCATE 0,4:PRINT "b b b b"
550 LOCATE 0,5:PRINT "b b b b"
こんな感じでした^^
今回はマップ切り替えですので、マイキャラが端に行ったら
画面を書き換えてやらないといけません。
そのためマップ表示をサブルーチン化しました。
21490 'MAP HYOUJI=============================
21500 PUT SPRITE 0,(X*8,Y*8-1),15,H/2
21510 CLS:K=0:FOR I=SY*24 TO SY*24+23
21520 LOCATE 0,K:PRINT MID$(MP$(I),SX*32+1,32)
21530 K=K+1:NEXT
21540 RETURN
このまま見てもよく分からないかもしれません。
順に説明していきます。
まずマップとなる文字列を配列に入れておきます。
20500 MP$(0)= "####################################################################################################P%%%%P######################"
20510 MP$(1)= "#################################$$$$$$####$$$$$$$##$$$$$$$$$$$#####################################P%%%%P######################"
20520 MP$(2)= "################################$$$$$$$$$$$$$$$$$$$$$$$TTTTTTTTTTTTTT###############################P%%%%P######################"
MP$(71)まで。
以前の方法だと、
500 LOCATE 0,0:PRINT "caaaaaaaaaaaaaaaaaaaaaaaaaaaaaad"
の"caaa~~~d"に当たる場所ですね。
その横1行を、配列に入れます。
MP$(0)に横一列を丸々入れておきます。
20500行
MP$(0)="####################################################################################################P%%%%P######################"
お気づきになられたかもしれないですが、前回のマップ1行より随分長いです^^
それはなぜかといますと、32 x 4の128文字だからです。
今回、ワールドのマップは 4 x 3の12画面なのですが、
マイキャラが歩けるのは、横に4画面分です。
その横すべてを、MP$( )配列に入れます。
そのため32文字(1画面の横一列文字数) x 4 (4画面分) = 128 文字なのです。
配列MP$( )は72個分用意します。
今回はワールドマップは 4 x 3画面分なので、縦が3画面分。
1画面の縦24列 x 3画面分で72列。
そのため配列数は72個。
画面切り替えの方法は、
1画面づつを保存しておいて、次々と表示するのではありません^^
全体マップ( 4x3画面 )すべてを配列にドーンと入れておいて、
表示画面の分だけ切り抜いて使うという感じになります。
(色々な方法がありますが、今回はそういう風にやります^^)
マップの表示処理は、
21510 CLS:K=0:FOR I=SY*24 TO SY*24+23
21520 LOCATE 0,K:PRINT MID$(MP$(I),SX*32+1,32)
21530 K=K+1:NEXT
この部分ですね。
SXとSYは、表示するマップの座標になります。
横 4 x 縦 3画面分のマップですので、
SX は0 ~ 3 、 SY は0 ~ 2 になります^^
(マップ(SX,SY)は、(0,0) ~ (3,2)までとなります。)
SX=0、SY=0だと、
MP$(0)の0番目~31番目の文字 ~ MP$(23)の0番目~31番目文字を
マップとして表示します。
まず、縦ですが、
MP$( Y座標 ) = "~~~~ 128文字~~~~"
MP$の添字部分になります。
FOR I=SY*24 TO SY*24+23
SY=0だと、0~23の24列。
MP$(0) ~ MP$(23)。
SY=1だと、MP$(24) ~ MP$(47)。
SY=2だと、MP$(48) ~ MP$(73)。
FOR文の添字の I を使ってやればOKです。
21520 LOCATE 0,K:PRINT MID$(MP$(I),SX*32+1,32)
MP$( I )
と。
うまいことやれていますが、こういうのはややこしいですよねぇ〜(~~;)
まぁ、こういう風にやるんだなぁと覚えていけばいいのではないでしょうか?
こういうパターンをいくつも書いたりしていると
いつか自分でも使えるようになるような気がします。
結局、数学と同じかなぁと思います。
数学は、公式を覚えて計算問題をたくさんこなさないと、
問題が解けません。
プログラムも、基本命令を覚えて、
いくつもプログラムのアルゴリズムを真似て書いていると
自分でもかけるようになっていきそうです。
優秀なプログラマだと、一からすべて思いつくのかもしれないですが(^^;)
数学だって、優秀な人は問題集をそれほどやらなくても、
いい点を取っていたので同じですね( ´∀`)
でもそれは本当に一部の人でした^^
話が横にそれましたが、
横 座標の、
SX=0とかは、
MID$(MP$(I),SX*32+1,32)
これで出来ます。
MID$というのは、
文字列の中から特定の文字数を抜き出すのに使います。
MID$ ( 文字列 , スタート位置 , 文字数)
です。
SX=0なら、1番目の文字 (SX * 32 +1だから) から32文字抜き出します。
SX=1だと、33番目の文字から、32文字を抜き出します。
このようすると、表示に使われるマップの文字を抜き出すことが出来ます^^
そして、
SXとSYは、
仮にSX=1の時に、画面の右端からさらに右に行ったら、
右側のマップSX=2に行きます。
これはSX=SX+1というようにします。
1409行 'RIGHT
1410行 IF X=30 THEN X=0:H=((H+1)MOD 4)+4:GOTO1930
1930行 IF SX<3 THEN SX=SX+1 ELSE SX=0
プログラムだとこんな感じです。
X座標が30の時は、1930行にいきます。
1930行では、SX=SX+1をしています。
(今回はハイドライドと同じで、世界をループさせています。
SX=3のさらに右は、SX=0のように。)
右に進んで画面を切り替えたときは、
マイキャラのスプライトの座標を左端にいないとだめなので、X=0としてやります。
色々とややこしいですよね(^^;)
1365 'STAGE MOVE========================
1910 IF SY>0 THEN SY=SY-1 ELSE SY=2
1920 GOSUB21500:GOTO1100
1930 IF SX<3 THEN SX=SX+1 ELSE SX=0
1940 GOSUB21500:GOTO1100
1950 IF SY<2 THEN SY=SY+1 ELSE SY=0
1960 GOSUB21500:GOTO1100
1970 IF SX>0 THEN SX=SX-1 ELSE SX=3
1980 GOSUB21500:GOTO1100
まとめ
今回はこんな感じです。
マップがいかにもハイドライドなので、少し変えないといけませんねぇ^^
ハイドライドライクなゲームというのは皆さんの夢だと思います。
そもそも僕がMSXでゲーム作りを再開したのは、
ハイドライド もどきを作るためでした^^
マシン語でないと出来ないと思っていましたが、
MSX BASICでも結構できるものですね〜( ・∇・)
全体的なスピードが遅いので、一部にマシン語を入れたいところですが。
MSXの勉強を大人になって始めたときには、マシン語ってサッパリでした。
よくMSX FANとかのプログラムリストにも、
一部マシン語を使用していましたが、なんじゃこれ?という感じでした。
そのときは少しでもわかるようになるとは思いませんでした^^
現在のPCは、マシン語を使うことは全くないかもしれません。
でも、コンピュータ言語はすべて一度マシン語に直されるので
この知識も全く無駄ではないですねぇ。
仕組みを知ることにより、少し世界が広がったような気がします^^
まぁMSXに限って言えば、画面描画が速くなるよねぇ〜という感じです♪(´ε` )
興味を持たれましたら、こちらもどうぞ。
WebMSXでMSX BASICの自作ゲーム作成!第十弾。 圧倒的速さ!マシン語で画面切り替え!(URLクリックで実行できます) - ニャオニャオ21世紀
MSX マシン語入門 (Z80 アセンブラ・機械語) 勉強レポート 第1回 - ニャオニャオ21世紀
MSX ゲーム・本体・雑誌など