以前にハイドライドもどきでマップを設置しましたが
そのときは16画面または、12画面だけでした。
今回は、容量をできるだけ節約して、100画面にしたいと思います^^
そんなことができるのか!って思われるかもしれませんが、
マップを単調にすれば可能なのです(・∀・)
どのくらい単調にするかがキモですが、まぁそれなりな感じになりそうです^^
昔はメガROMじゃないゲームでも、100画面くらいのゲームがありました。
ザ・キャッスルってメガROMじゃなかったと思いますが、
100画面ありました。
フラッピーのようにブロック1つずつが意味を持つゲームは
最大50面くらいでした。
今回は、なんとかプログラムをしてみた!というレベルなので、
本格的にゲームに組み込むには、色々パーツの設定を考えないと
いけません。
こんな感じになります。
(今回のプログラムでも、
もっと色々と描き込めるのですが、マップデータを作るのが面倒なので^^;)
こちらで実行してみて下さい。
https://msxpen.com/codes/-LfrLTTYBQ7_wYnr0sQa
ソースコード
5 TIME=0
10 COLOR15,1,1:SCREEN2:SCREEN1,2:COLOR15,1,1:WIDTH32:DEFINTA-Z:KEYOFF
20 DEFUSR=&H7E:A=USR(0)
21 DEFUSR1=&H0090
25 POKE &HF3B1,26
26 POKE &HF3DB,0
28 KEY1,CHR$(12)+"POKE&HF3B1,24"+CHR$(13)
30 KEY2,"SCREEN1"+CHR$(13)
31 DIMEX(4),EY(4),EM(4),UX(4),UY(4),ES(4),EC(4),EP(4),IS(4),IX(4),IY(4),KS(4),KX(4),KY(4),G2(8)
32 IS(0)=3:IS(1)=7:IS(2)=11:IS(3)=15:IX(0)=5:IX(1)=5:IX(2)=5:IX(3)=5:IY(0)=9:IY(1)=9:IY(2)=9:IY(3)=9
33 KS(0)=0:KS(1)=1:KS(2)=2:KS(3)=3:KX(0)=10:KX(1)=10:KX(2)=10:KX(3)=10:KY(0)=10:KY(1)=10:KY(2)=10:KY(3)=10
34 EN=0:EK=4:IT=4:KE=4
35 X=11:Y=12:H=4:SX=0:SY=0
36 EX(0)=20:EY(0)=1:EX(1)=13:EY(1)=4:EX(2)=20:EY(2)=18:EX(3)=14:EY(3)=13
37 ES(0)=0:ES(1)=1:ES(2)=0:ES(3)=1
38 BS=&H1800:B2=&H800:B3=&H1000:C1=&H2000:C2=&H2800:C3=&H3000
39 DIMMP$(110),IM$(8),MC$(54)
40 EP(0)=8:EP(1)=8:EP(2)=8:EP(3)=8
41 EC(0)=7:EC(1)=7:EC(2)=7:EC(3)=7
42 NG=ASC("`")-1:IM=ASC("u"):IT=IT-1:KE=KE-1
43 IM$(0)="ITEM 0":IM$(1)="ITEM 1":IM$(2)="ITEM 2":IM$(3)="ITEM 3":IM$(4)="ITEM 4":IM$(5)="ITEM 5":IM$(6)="ITEM 6":IM$(7)="ITEM 7"
50 'MOJI TEIGI========================
51 LOCATE10,10:PRINT"PLEASE WAIT!":N=48
52 FOR J=0 TO 41
53 FOR I=0 TO 7
54 K=VPEEK(N*8+I)
55 L=K OR (K\2)
56 VPOKE N*8+I,L
57 VPOKE B2+N*8+I,L
58 VPOKE B3+N*8+I,L
59 'COLOR TEIGI
60 VPOKE C1+N*8+I,&HF1
61 VPOKE C2+N*8+I,&HF1
62 VPOKE C3+N*8+I,&HF1
63 NEXT
64 N=N+1
65 NEXT
66 'LOCATE10,10:PRINT"PLEASE WAIT!"
70 'SPRITE TEIGI======================
80 RESTORE 3000
90 FOR J=0 TO 9
100 S$=""
110 FOR I=0 TO31
120 READ DT$
130 S$=S$+CHR$(VAL("&H"+DT$))
140 NEXT
150 SPRITE$(J)=S$
160 NEXT
175 'BLOCK TEIGI======================
180 M=ASC("#")
185 RESTORE 4010
186 FOR J=0 TO 30
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=96
300 NEXT
305 'WAKU
310 GOSUB 2600
435 'MAP
440 GOSUB 20300
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 TK=1
1021 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
1100 'ENEMY==========================
1110 UX(EN)=EX(EN):UY(EN)=EY(EN)
1200 C=RND(1)*5
1220 IF C=1 THEN ES(EN)=RND(1)*4
1230 EF=0
1240 ON ES(EN)+1 GOTO 1440,1450,1460,1470
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"
1348 LOCATE 24,15:PRINT"SY:SX"
1349 LOCATE 24,16:PRINTSY;SX
1350 GOTO1000
1395 'UP=============================
1400 IF Y=1 THEN Y=21:H=(H+1)MOD 2:GOTO1910
1401 Y=Y-1:H=(H+1)MOD 2:V1=VPEEK(BS+X+Y*32):V2=VPEEK(BS+X+1+Y*32)
1402 IF V1>NG THEN TK=1:IF V1<IM GOTO1437
1403 IF V2>NG THEN TK=1:IF V2<IM GOTO1437
1404 IF TK=1 GOTO 2000
1405 GOTO 1030
1409 'RIGHT
1410 IF X=21 THEN X=1:H=( (H+1)MOD 2)+2:GOTO1930
1411 X=X+1:H=( (H+1)MOD 2)+2:V1= VPEEK(BS+X+1+Y*32):V2=VPEEK(BS+X+1+(Y+1)*32)
1412 IF V1>NG THEN TK=1:IF V1<IM GOTO1437
1413 IF V2>NG THEN TK=1:IF V2<IM GOTO1437
1414 IF TK=1 GOTO2000
1415 GOTO 1030
1419 'DOWN
1420 IF Y=21 THEN Y=1:H=( (H+1)MOD 2)+4:GOTO1950
1421 Y=Y+1:H=( (H+1)MOD 2)+4:V1=VPEEK(BS+X+(Y+1)*32):V2=VPEEK(BS+X+1+(Y+1)*32)
1422 IF V1>NG THEN TK=1:IF V1<IM GOTO1437
1423 IF V2>NG THEN TK=1:IF V2<IM GOTO1437
1424 IF TK=1 GOTO2000
1425 GOTO 1030
1429 'LEFT
1430 IF X=1 THEN X=21:H=( (H+1)MOD 2)+6:GOTO1970
1431 X=X-1:H=( (H+1)MOD 2)+6:V1=VPEEK(BS+X+Y*32):V2=VPEEK(BS+X+(Y+1)*32)
1432 IF V1>NG THEN TK=1:IF V1<IM GOTO1437
1433 IF V2>NG THEN TK=1:IF V2<IM GOTO1437
1434 IF TK=1 GOTO2000
1435 GOTO 1030
1437 X=TX:Y=TY:GOTO1030
1438 'ENEMY MOVE==================
1439 'ENEMY UP 0
1440 EY(EN)=EY(EN)-1
1441 IF EY(EN)<1 THEN EF=1
1442 IF VPEEK(BS+EX(EN)+(EY(EN)*32)) >NG THEN EF=1:GOTO1444
1443 IF VPEEK(BS+EX(EN)+1+EY(EN)*32) >NG THEN EF=1
1444 IF EF=1 THEN ES(EN)=2:EX(EN)=UX(EN):EY(EN)=UY(EN)
1445 GOTO1270
1449 'ENEMY RIGHT 1
1450 EX(EN)=EX(EN)+1
1451 IF EX(EN)>21 THEN EF=1
1452 IF VPEEK(BS+EX(EN)+1+EY(EN)*32) >NG THEN EF=1:GOTO1454
1453 IF VPEEK(BS+EX(EN)+1+(EY(EN)+1)*32) >NG THEN EF=1
1454 IF EF=1 THEN ES(EN)=3:EX(EN)=UX(EN):EY(EN)=UY(EN)
1455 GOTO1270
1459 'ENEMY DOWN 2
1460 EY(EN)=EY(EN)+1
1461 IF EY(EN)>21 THEN EF=1
1462 IF VPEEK(BS+EX(EN)+(EY(EN)+1)*32) >NG THEN EF=1:GOTO1464
1463 IF VPEEK(BS+EX(EN)+1+(EY(EN)+1)*32) >NG THEN EF=1
1464 IF EF=1 THEN ES(EN)=0:EX(EN)=UX(EN):EY(EN)=UY(EN)
1465 GOTO1270
1469 'ENEMY LEFT 3
1470 EX(EN)=EX(EN)-1
1471 IF EX(EN)<1 THEN EF=1
1472 IF VPEEK(BS+EX(EN)+EY(EN)*32) >NG THEN EF=1:GOTO1474
1473 IF VPEEK(BS+EX(EN)+(EY(EN)+1)*32) >NG THEN EF=1
1474 IF EF=1 THEN ES(EN)=1:EX(EN)=UX(EN):EY(EN)=UY(EN)
1475 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
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):ES(EN)=(ES(EN)+2)MOD4
1800 PUT SPRITE 0,(X*8,Y*8-1),9,9:GOSUB1830
1810 PUT SPRITE 0,(X*8,Y*8-1),15,H
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"T120O5"+U$
1900 RETURN
1365 'STAGE MOVE========================
1910 IF SY>0 THEN SY=SY-1 ELSE SY=9
1920 GOSUB2200:GOTO1100
1930 IF SX<9 THEN SX=SX+1 ELSE SX=0
1940 GOSUB2200:GOTO1100
1950 IF SY<9 THEN SY=SY+1 ELSE SY=0
1960 GOSUB2200:GOTO1100
1970 IF SX>0 THEN SX=SX-1 ELSE SX=9
1980 GOSUB2200:GOTO1100
1990 'ITEM CHECK==========================
2000 FOR I=0 TO 1
2010 FOR J=0 TO 1
2020 V=VPEEK(BS+X+I+(Y+J)*32)
2030 IF V<IM THEN GOTO 2090
2040 NEXT:NEXT
2045 PUT SPRITE 0,(X*8,Y*8-1),15,H
2050 IF G1<>99 THEN IF IX(G1)=X AND IY(G1)=Y THEN LOCATE 7,10:PRINT IM$(G1);" GET":XX=IX(G1):YY=IY(G1):IS(G1)=99:M=2:GOSUB 2100:GOSUB 2140
2060 FOR K=0 TO 7
2070 IF G2(K)<>99 THEN IF KX(G2(K))=X AND KY(G2(K))=Y THEN LOCATE 8,10:PRINT "KEY ";G2(K);" GET":XX=KX(G2(K)):YY=KY(G2(K)):KS(G2(K))=99:M=2:GOSUB 2100:GOSUB 2140
2080 NEXT
2090 GOTO1030
2099 'TAKARA SITA CHIKEI HYOUJI
2100 'FOR J=0 TO 1000:NEXT
2105 'FOR I=0 TO 1
2110 'LOCATE 1,YY+I-1:PRINT MC$(VAL(MID$(MP$(SY*11+YY/2),SX*2+1,2))+I)
2120 'NEXT
2125 GOSUB 2300
2130 RETURN
2135 'GET SOUND
2140 INTERVAL OFF:B=USR1(0):PLAY"T255O4ABO5CDE"
2150 'FOR I=0 TO 1000:NEXT
2160 XX=1:YY=10:M=21:GOSUB 2100
2170 INTERVAL ON
2180 RETURN
2200 'MAP HYOUJI=============================
2210 PUT SPRITE 0,(0,193)
2300 'MAP HYOUJI2----------------------------
2310 K=0
2350 FOR I=SY*11 TO SY*11+10
2390 LOCATE 1,K*2+1:PRINT MC$(VAL(MID$(MP$(I),SX*2+1,2)))
2400 LOCATE 1,K*2+2:PRINT MC$(VAL(MID$(MP$(I),SX*2+1,2))+1)
2420 K=K+1
2430 NEXT
2435 'TAKARA
2440 SS=SX+10*SY:NN=0:G1=99
2450 FOR I=0 TO IT
2460 IF IS(I)=SS THEN OX=IX(I):OY=IY(I):G1=I:GOSUB 2540
2470 NEXT
2480 G2(0)=99:G2(1)=99:G2(2)=99:G2(3)=99:G2(4)=99:G2(5)=99:G2(6)=99:G2(7)=99
2490 FOR J=0 TO KE
2500 IF KS(J)=SS THEN OX=KX(J):OY=KY(J):G2(NN)=J:GOSUB 2540
2510 NEXT
2520 NN=0:PUT SPRITE 0,(X*8,Y*8-1),15,H
2530 RETURN
2539 'TAKARA HYOUJI
2540 IF NN<8 THEN NN=NN+1
2550 LOCATE OX,OY:PRINT "u"
2560 LOCATE OX,OY+1:PRINT "v"
2570 LOCATE OX+1,OY:PRINT "w"
2580 LOCATE OX+1,OY+1:PRINT "x"
2590 RETURN
2599 'WAKU HYOUJI
2600 LOCATE 0,0
2610 PRINT"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
2620 FOR I=1 TO 22
2630 LOCATE 0,I:PRINT"y yyyyyyyy"
2640 NEXT
2650 LOCATE 0,23:PRINT"yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
2660 LOCATE 24,2:PRINT"HP"
2670 LOCATE 24,3:PRINT USING"######";255
2680 LOCATE 24,5:PRINT"STR"
2690 LOCATE 24,6:PRINT USING"######";255
2700 LOCATE 24,8:PRINT"EXP"
2710 LOCATE 24,9:PRINT USING"######";255
2720 FOR I=15 TO 21
2730 LOCATE 24,I:PRINT " "
2740 NEXT
2750 RETURN
2995 'SPRITE UP0 DATA===================
3000 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
3010 'SPRITE UP1 DATA
3020 DATA00,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
3030 'SPRITE RIGHT2 DATA
3040 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
3050 'SPRITE RIGHT3 DATA
3060 DATA00,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
3070 'SPRITE DOWN4 DATA
3080 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
3090 'SPRITE DOWN5 DATA
3100 DATA00,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
3110 'SPRITE LEFT6 DATA
3120 DATA00,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
3130 'SPRITE LEFT7 DATA
3140 DATA00,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
3150 'SPRITE SLIME DATA
3160 DATA00,00,00,00,0F,3F,7F,FF,FF,FF,FF,7E,00,00,00,00,00,00,00,00,F0,FC,FE,FF,FF,FF,FF,7E,00,00,00,00
3170 'SPRITE DAMAGE
3180 DATAFF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF,FF
3990 'BG DATA===========================
4000 'YUKA GLASS #
4010 DATA0000000000000000,2222222222222222
4020 'YUKA BLUE BLOCK $
4030 DATA7F7F7F00F7F7F700,4141414141414141
4040 'YUKA RIVER %
4050 DATA00C0000600000060,F7F7F7F7F7F7F7F7
4060 'YUKA TREES &
4070 DATA3E57A8D70B050B07,13131212121C1C1C
4080 DATA03D7BFD3C7C78368,1C1C161626262686
8985 'BG ATARI HANTEI ARI-------
8990 'DRAGON abcdefghijk
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
10050 'KAWA BLOCK l
10060 DATABEFEFEFEFEF6F2FF,F151515151515111
10065 'GLASS DASH m NON
10070 DATA6060000101181800,32C23232C232C232
10075 'GLASS n NON
10080 DATA0000000000000000,3232323232323232
10085 'HAKA o NON
10090 DATA0000000020505000,F6F6F6F6F6E6E6E6
10095 'YELLOW BLOCK t p
10100 DATAFF92A4C992A4C992,1B1B1B1B1A1A1A1A
10105 'TREE qrst
10110 DATAF0FFCF9FBF7F7F9A,313131312121212C
10120 DATA7D7F7FBEC003070F,C1C1C1C1C1828262
10130 DATA0F83C181D168F0F0,2121212121C1C1C1
10140 DATAE8C0D201B0E0F0F8,C1C1C1C161626262
10144 'ITEM---------------
10145 'TAKARA uvwx
10150 DATA00010F3DDAB3B3B3,F1F1F1F1B1B1B6B1
10160 DATAB7348731C7390700,B171B1B1B1B1A1A1
10170 DATA00F8E43219594D73,F1F1F1A1A1A4ADA1
10180 DATA451555071C70C000,A1A1A1E1E1E1E1A1
10185 'WAKU
10190 DATA7F7F7F00F7F7F700,D1D1D1D1D1D1D1D1
19990 'MUSIC DATA
20000 DATAG4E8E4F8E8D8C8
20010 DATAG4E8E8D4R4
20020 DATAE8E8G8G8A8A8R8A8
20030 DATAO6C4O5E8E8G4R4
20040 DATAGE8E8F8E8D8C8
20050 DATAGE8E8D4R4
20060 DATAGE8E8A4G8G8
20070 DATAA8A8B8B8O6C4O5R4
20080 DATA##
20290 'MAP CHIP
20300 MC$(0)="######################"
20301 MC$(1)="######################"
20302 '
20305 MC$(2)="######################"
20306 MC$(3)="llllllll##############"
20307 '
20310 MC$(4)="%%%%%%%l##############"
20311 MC$(5)="%%%%%%%l##############"
20312 '
20315 MC$(6)="lllll%%l##############"
20316 MC$(7)="####l%%l##############"
20317 '
20320 MC$(8)="####l%%l##############"
20321 MC$(9)="####l%%l##############"
20322 '
20325 MC$(10)="####l%%l##############"
20326 MC$(11)="####l%%lllllllllllllll"
20327 '
20330 MC$(12)="####l%%%%%%%%%%%%%%%%%"
20331 MC$(13)="####l%%%%%%%%%%%%%%%%%"
20332 '
20335 MC$(14)="####llllllllllllllllll"
20336 MC$(15)="######################"
20337 '
20340 MC$(16)="######################"
20341 MC$(17)="llllllllllllllllllllll"
20342 '
20345 MC$(18)="%%%%%%%%%%%%%%%%%%%%%%"
20346 MC$(19)="%%%%%%%%%%%%%%%%%%%%%%"
20347 '
20350 MC$(20)="llllllllllllllllllllll"
20351 MC$(21)="######################"
20352 '
20355 MC$(22)="######################"
20356 MC$(23)="####llllllllllllllllll"
20357 '
20360 MC$(24)="####llll%%%%%%%%%%%%%%"
20361 MC$(25)="#######l%%%%%%%%%%%%%%"
20362 '
20365 MC$(26)="#######l%%%%%%%%%%%%%%"
20366 MC$(27)="####llll%%%%%%%%%%%%%%"
20367 '
20370 MC$(28)="######################"
20371 MC$(29)="#######lllllllllllllll"
20372 '
20375 MC$(30)="&&&&&###########&&&&&&"
20376 MC$(31)="&&&&&&&#########''&&&&"
20377 '
20380 MC$(32)="'''''''#&&&#######''''"
20381 MC$(33)="########'''###########"
20382 '
20385 MC$(34)="&&&&&''#########'&&&&&"
20386 MC$(35)="&&&&&&&#########&&&&&&"
20387 '
20390 MC$(36)="##########&&&&&#######"
20391 MC$(37)="##########&'&&'#######"
20392 '
20395 MC$(38)="##########'#''########"
20396 MC$(39)="######################"
20397 '
20400 MC$(40)="$$$$$$$$$$$$$$$$$$$$$$"
20401 MC$(41)="$$$$$$$$$$$$$$$$$$$$$$"
20402 '
20405 MC$(42)="##$$$$$$$$$$$$$$$##$$$"
20406 MC$(43)="###$$$$$$###$$$$$#####"
20407 '
20410 MC$(44)="######$$$$$$$$$#######"
20411 MC$(45)="###$$$$$$#############"
20412 '
20415 MC$(46)="#########$$###########"
20416 MC$(47)="#########$$###########"
20417 '
20420 MC$(48)="######################"
20421 MC$(49)="####pppppppppppppp####"
20422 '
20425 MC$(50)="####p$$$$$$$$$$$$p####"
20426 MC$(51)="####p$$$$$$$$$$$$p####"
20427 '
20430 MC$(52)="####pppppppppppppp####"
20431 MC$(53)="######################"
20490 'MAP DATA
20499 '0-0 0-9
20500 MP$(0)= "00000000003630000000"
20501 MP$(1)= "00300000003832000000"
20502 MP$(2)= "02320000360000000000"
20503 MP$(3)= "04000000380000003000"
20504 MP$(4)= "06000000000000003200"
20505 MP$(5)= "08480000000000000000"
20506 MP$(6)= "08500000000036000036"
20507 MP$(7)= "08500000364138000038"
20508 MP$(8)= "08500000384100000000"
20509 MP$(9)= "08500000004100000000"
20510 MP$(10)="08500000420000000000"
20599 '1-0 1-9
20600 MP$(11)="08500000460000000000"
20601 MP$(12)="08500000460000000000"
20602 MP$(13)="08500000460000300000"
20603 MP$(14)="08504040400000340000"
20604 MP$(15)="08500046000000340000"
20605 MP$(16)="08500046000000340000"
20606 MP$(17)="08500046000000340000"
20607 MP$(18)="08520046000000340000"
20608 MP$(19)="08000046000000320000"
20609 MP$(20)="08000046000000000000"
20610 MP$(21)="08000046000000000000"
20699 '2-0 2-9
20700 MP$(22)="08000046000000000000"
20701 MP$(23)="08000046000000000000"
20702 MP$(24)="08000046000000480000"
20703 MP$(25)="10161616020000480000"
20704 MP$(26)="12181818040000500000"
20705 MP$(27)="14202020060000000000"
20706 MP$(28)="00000000080000000000"
20707 MP$(29)="00000000080000000000"
20708 MP$(30)="00000000080000000000"
20709 MP$(31)="00000000080000000000"
20710 MP$(32)="00000000100000000000"
20799 '3-0 3-9
20800 MP$(33)="00000000120400000000"
20801 MP$(34)="00000000120400000000"
20802 MP$(35)="00000000120400000000"
20803 MP$(36)="00000000120400000000"
20804 MP$(37)="00360000240400000000"
20805 MP$(38)="00380000250400000000"
20806 MP$(39)="00000000250400000000"
20807 MP$(40)="00000000250400000000"
20808 MP$(41)="00000000250400000000"
20809 MP$(42)="00000000261800000000"
20810 MP$(43)="00000000121800000000"
20899 '4-0 4-9
20900 MP$(44)="00000000121800000000"
20901 MP$(45)="00003000121800000000"
20902 MP$(46)="00003400121800000000"
20903 MP$(47)="00003400121800000000"
20904 MP$(48)="00003200142000000000"
20905 MP$(49)="00000000000000000000"
20906 MP$(50)="22000000000000000000"
20907 MP$(51)="12003000000000000000"
20908 MP$(52)="12003400000000000000"
20909 MP$(53)="12003400000000000000"
20910 MP$(54)="14003200000000000000"
20999 '5-0 5-9
21000 MP$(55)="00000000000000000000"
21001 MP$(56)="00000000000030000000"
21002 MP$(57)="00000000000034000000"
21003 MP$(58)="00000000000030360000"
21004 MP$(59)="00003600000034380000"
21005 MP$(60)="00003800000030000000"
21006 MP$(61)="00000000000034360000"
21007 MP$(62)="00000000000030380000"
21008 MP$(63)="00000000000034000000"
21009 MP$(64)="00000000000032000000"
21010 MP$(65)="00000044000000000000"
21099 '6-0 6-9
21100 MP$(66)="00000044000000000000"
21101 MP$(67)="00000042000000000000"
21102 MP$(68)="00000042000000000000"
21103 MP$(69)="00000046000000000000"
21104 MP$(70)="00000044000000000000"
21105 MP$(71)="00000040000000000000"
21106 MP$(72)="00000040000000000000"
21107 MP$(73)="00000040000000000000"
21108 MP$(74)="00000040000000000000"
21109 MP$(75)="00000040000000000000"
21110 MP$(76)="00000042000000000000"
21199 '7-0 7-9
21200 MP$(77)="00000000000000000000"
21201 MP$(78)="00000000000030000000"
21202 MP$(79)="00000000000034000000"
21203 MP$(80)="00000030000034000000"
21204 MP$(81)="00000034000000000000"
21205 MP$(82)="00000034000030000000"
21206 MP$(83)="00000034000034000000"
21207 MP$(84)="00000034000034000000"
21208 MP$(85)="00000034000034000000"
21209 MP$(86)="00000000000034000000"
21210 MP$(87)="00000000000034000000"
21299 '8-0 8-9
21300 MP$(88)="00000000000000000000"
21301 MP$(89)="00500000000000520000"
21302 MP$(90)="00500000000000000000"
21303 MP$(91)="00500000000000000000"
21304 MP$(92)="00000000000000000000"
21305 MP$(93)="00000000000000000000"
21306 MP$(94)="00000000000000000000"
21307 MP$(95)="00002222220200000000"
21308 MP$(96)="00001212120400000000"
21309 MP$(97)="00001414140600520000"
21310 MP$(98)="00000000000000000000"
21399 '9-0 9-9
21400 MP$(99)= "00000000000000004400"
21401 MP$(100)="00000000003600004400"
21402 MP$(101)="00003600003800004400"
21403 MP$(102)="00003800360000004200"
21404 MP$(103)="00000000380000004200"
21405 MP$(104)="00003600000000004300"
21406 MP$(105)="00003800000042004500"
21407 MP$(106)="00000000000042000000"
21408 MP$(107)="00360000000042000000"
21409 MP$(108)="00380000000043000000"
21410 MP$(109)="00000000000042000000"
21420 GOTO2200
スポンサーリンク
プログラムの解説
それほど難しいことはやっておりません^^
以前にやったマップ表示は、1文字づつ(草、ブロックなど)すべてをPRINTするという方法でした。
今回は、まず、画面表示されるパーツを設定します。
そのパーツは、Y軸方向1ライン分としました。
(22文字を1パーツ単位とします。)
(ゲームなどによって色々パーツの作り方は変わると思います。
4ブロックを1パーツにするとか。)
ハイドライドもどきの画面構成は、22文字 x 22文字になっています。
Y軸1ラインだと、22文字となります。
(例えば、草を表す文字 # を22文字を、1パーツにすると、
草原を1ライン分表現できます。)
すべて草のパーツ
MC$(0)="######################"
草原とブロックと川のパーツ
MC$(7)="####l%%l##############"
こういったパーツを縦22列分並べてやれば、マップ表示完成です!
1画面表示するのに、
例えば、
1列目は、MC$(0)
2列目は、MC$(0)
3列目は、MC$(0)
4列目は、MC$(3)
5列目は、MC$(0)
6列目は、MC$(8)
7列目は、MC$(3)
~~~
22列目は、MC$(0)
というように設定します^^
配列のMC$( )に22文字いれて、1パーツとしているので、
MC$(0)とかMC$(3)とかの0、3などをDATAとして持たせてやります。
0
0
0
0
3
0
8
3
~~
0
(最初はDATA文でやっていたのですが、うまくいかなかったので
配列MP$( ) に入れてやりました。)
1画面のマップを表示するには、
MP$の順に表示されます。
MP$(0)="00" (Y座標 0)
MP$(1)="00" (Y座標 1)
MP$(2)="00" (Y座標 2)
MP$(3)="00" (Y座標 3)
MP$(4)="03" (Y座標 4)
~~
MP$(21)="00" (Y座標 21)
となります。
これを210個作ってやれば、縦に10画面のマップデータが出来ます。
横に増やすのは、
MP$(0)="000000"
MP$(1)="000001"
MP$(2)="000000"
MP$(3)="000300"
MP$(4)="030000"
~~
MP$(210)="000000"
これで、横3画面分 縦10画面分のマップデータとなります!
ちょっと工夫を。
MP$( ) を210個も持つのもデータ量が大きすぎので、
Y軸2ラインで1データにします。
(Y軸の0と、Y軸の1をひとまとめに!)
ちょっと画面が単調になりかねませんが、
Y軸16ドットを1まとめくらいならOKかなぁ(*´ω`*)
1画面は、
MP$(0)
~~
MP$(10)
で表せるようになります。
肝心のプログラムの表示部分です。
2310 K=0
2350 FOR I=SY*11 TO SY*11+10
2390 LOCATE 1,K*2+1:PRINT MC$(VAL(MID$(MP$(I),SX*2+1,2)))
2400 LOCATE 1,K*2+2:PRINT MC$(VAL(MID$(MP$(I),SX*2+1,2))+1)
2420 K=K+1
2430 NEXT
SX , SYは画面の位置。
10 x 10画面のマップですと、SX=0 ~ SX=9
SY=0 ~ SY=9
となります。
そのあたりは、以前と同じ方法です。
2390 LOCATE 1,K*2+1:PRINT MC$(VAL(MID$(MP$(I),SX*2+1,2)))
2400 LOCATE 1,K*2+2:PRINT MC$(VAL(MID$(MP$(I),SX*2+1,2))+1)
これでY軸2段を一気に表示です。
MP$(0) ="000305"
だと、
Y軸の1段目は、MC$(0)で、
2段目は、MC$(1)となります。
(この2つがワンセットで表示される方法にしました)
00なら、MC$(0)とMC$(1)が、
03なら、MC$(3)とMC$(4)が
といった具合です。
この方法でデータ量を減らしてみました^^
2390 LOCATE 1,K*2+1:PRINT MC$(VAL(MID$(MP$(I),SX*2+1,2)))
の、
MID$(MP$(I),SX*2+1,2)は、
MP$(横1列のマップデータ) 横画面が10あるとすると、全部で20文字入っています。
その中で、画面のSX座標(2画面目とか、3画面目とか)に対応しているデータを
抜き出します。
MID$(文字列 , 開始文字 , 文字数 )は、文字列から文字を抜き出す命令です。
マップデータのMP$(Y座標になります) からSXに対応した
データ(パターンデータが入っています)を抜き出し、
パターンデータであるMC$( )を表示します。
スポンサーリンク
まとめ
こんな感じになります。
パターンデータをいくつか設定しておいて、
そのパターンデータをマップデータとして並べておきます。
マップを表示するときは、
マップ画面位置SX,SYに合わせて、マップデータを読み込み、
そのパターンデータをPRINTするということをします。
データはもっと圧縮できますねぇ。
パターンデータの番号は、2文字ですが、
それをアスキーコードに対応させて、数字の代わりにabzとかに
してやればデータ量は半分です(*´艸`*)
パターンが単純すぎるという問題は、
パターンを表示するときに反転させるとか、
パターンデータ文字を何文字かずらせるようにするとかしたら、って思います。
または、木、岩などは個別にX座標のデータと並べて持たせてやるなど。
いずれそういうのもやってみたいと思います。
それから、000000とデータが並んでいたら、#80などする圧縮方法も
あります。
#を連続する数として設定して、#80なら8回、0が続くみたいな方法です^^
パターンデータの方に入れてやれば、さらなる圧縮が!
(スピードは落ちますが^^;)
最後に
今回のデータ圧縮がどのくらいになっているか計算してみます。
以前の方法だと、1画面あたり22x22=484文字 (484バイト)
それが100画面なら、48400文字 (48.4kバイト)
なんと48.4Kバイトーーーー!
今回の方法ですと、1画面あたり2x11=22文字 (22バイト)
それが100画面ですと、2200文字 (2.2Kバイト)
それにパターンデータが、仮に100個ですと、
22x100で2200文字 (2.2Kバイト)
合計して 4.4Kバイト(゚∀゚)
1 / 11です!
まぁそんな単純ではないのですけど...
(マップが単調になりますし)
でも4.4Kバイトならゲームに組み込めそうです。
このような方法をあれこれ工夫して、ご自分のゲームに最適化された
圧縮方法を模索してみてください(*´ω`*)
掘り出し物があるかも^^