WebMSXでMSX BASICの自作ゲーム作成!第6弾。
今回はブロックに横からぶつかったら進まない、
下からぶつかったらそこで止まるというのをやりたいと思います。
ここができると魔城伝説2 ガリウスの迷宮のような
2Dアクションゲームの基礎ができます。
URLをクリックすると出来ます。
http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/movemove (8).dsk
うーん、遅い。
ブロックとの当たり判定を追加するだけでここまで遅くなるとは;
MSX FANなどのプログラム投稿で、
スプライト移動が8ドットのキャラクター単位だったのはこのためか!
どうも4ドット移動は諦めなければいけないようです。
このページの最後に8ドット移動のをアップしておきますね。
それでは解説を。
5 COLOR 15,1,1
10 SCREEN2:SCREEN1,2,0:DEFINTA-Z:KEYOFF:WIDTH32
15 DEFUSR=&H7E:A=USR(0)
20 H2 = 1:X=112:Y=160:XX=4:YY=4
30 FOR J=0 TO 7:S$="":FOR I=1 TO32:READD$:S$=S$+CHR$(VAL("&H"+D$
)):NEXT:SPRITE$(J)=S$:NEXT
40 A1=ASC("A"):D$=" ":RESTORE 1000
50 FOR I=0 TO 7
60 READ D$,C$
70 VPOKE A1*8+I,VAL("&b"+D$)
72 VPOKE &H800+A1*8+I,VAL("&b"+D$)
74 VPOKE &H1000+A1*8+I,VAL("&b"+D$)
90 VPOKE &H2000+A1*8+I,VAL("&h"+C$)
92 VPOKE &H2800+A1*8+I,VAL("&h"+C$)
94 VPOKE &H3000+A1*8+I,VAL("&h"+C$)
96 NEXT
100 LOCATE 16,8:PRINT "AAA"
108 LOCATE 16,16:PRINT "AAA"
109 LOCATE 16,17:PRINT "AAA"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "AAA AAA"
135 LOCATE 10,19:PRINT "AAA AAA"
136 LOCATE 10,20:PRINT "AAA AAA"
137 LOCATE 10,21:PRINT "AAA AAA"
140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX,A1
160 NEXT
170 S=STICK(0):TG=STRIG(0)
180 XX=0
190 IF S=3 THEN XX=4
200 IF S=7 THEN XX=-4
210 X=X+XX
220 'IF S=1 THEN Y=Y-YY
230 'IF S=5 THEN Y=Y+YY
240 H2=-H2:IF JF=1 THEN H2=-1
250 IF S=3 AND H2=1 THEN H=0
260 IF S=3 AND H2=-1 THEN H=4
270 IF S=7 AND H2=1 THEN H=1
280 IF S=7 AND H2=-1 THEN H=5
290 IF X<0 THEN X=0
300 IF X>240 THEN X=240
310 IF JF=1 THEN 340
320 IF TG=0 THEN 390
330 JF=1:JY=-8:JC=6
340 IF JC=0 THEN 370
350 IF TG=0 THEN JC=0:GOTO 370
360 JC=JC-1
370 IF JC=0 AND JY<8 THEN JY=JY+2
380 Y=Y+JY
390 X2=(X-XX)¥8:Y2=Y\8:Y3=(Y-JY)¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+(Y¥8)*32
410 AE=&H1800+((X+15)¥8)+(Y¥8)*32
420 IF XX>0 AND VPEEK(AE)=A1 THEN X=X2*8
430 IF XX>0 AND VPEEK(AE+32)=A1 THEN X=X2*8
440 IF XX<0 AND VPEEK(AD)=A1 THEN X=X2*8
450 IF XX<0 AND VPEEK(AD+32)=A1 THEN X=X2*8
460 AD = &H1800+(X¥8)+(Y¥8)*32
470 AE=&H1800+((X+15)¥8)+(Y¥8)*32
480 IF JY<0 AND VPEEK(AD)=A1 THEN Y=Y3*8:JF=0:JY=0
490 IF JY<0 AND VPEEK(AE)=A1 THEN Y=Y3*8:JF=0:JY=0
500 IF JY>=0 AND VPEEK(AD+64)=A1 THEN Y=Y2*8:JF=0:GOTO 530
510 IF JY>=0 AND VPEEK(AE+64)=A1 THEN Y=Y2*8:JF=0:GOTO 530
520 IF JF=0 THEN JF=1:JC=0:JY=0
530 PUTSPRITE 0,(X,Y),7,H
540 PUTSPRITE 1,(X,Y),11,H+2
550 GOTO 170
800 DATA 2E,2D,67,7E,78,7C,38,06
,16,17,0F,14,1D,07,0F,0F,F0,F8,8
0,00,00,00,00,00,E0,70,70,20,50,
80,80,E0
810 DATA 0F,1F,01,00,00,00,00,00
,07,0E,0E,04,0A,01,01,07,74,B4,E
6,7E,1E,3E,1C,60,68,E8,F0,28,B8,
E0,F0,F0
820 DATA 10,10,18,00,01,01,01,00
,00,00,00,03,00,00,00,00,00,00,1
0,50,D8,F0,E0,00,00,00,00,00,00,
00,00,00
830 DATA 00,00,08,0A,1B,0F,07,00
,00,00,00,00,00,00,00,00,08,08,1
8,00,80,80,80,00,00,00,00,C0,00,
00,00,00
840 DATA 00,1E,5D,4B,7E,78,7C,38
,06,0D,1D,0D,16,2B,38,1E,00,E0,F
8,80,00,00,00,00,00,E0,F0,30,20,
D4,3C,38
850 DATA 00,07,1F,01,00,00,00,00
,00,07,0F,0C,04,2B,3C,1C,00,78,B
A,D2,7E,1E,3E,1C,60,B0,B8,B0,68,
D4,1C,78
860 DATA 00,20,20,30,00,01,01,01
,00,00,00,00,00,00,00,00,00,00,0
0,10,50,D8,F0,E0,00,00,00,C0,C0,
00,00,00
870 DATA 00,00,00,08,0A,1B,0F,07
,00,00,00,03,03,00,00,00,00,04,0
4,0C,00,80,80,80,00,00,00,00,00,
00,00,00
Ok850 DATA 00,07,1F,01,00,00,00,00
,00,07,0F,0C,04,2B,3C,1C,00,78,B
A,D2,7E,1E,3E,1C,60,B0,B8,B0,68,
D4,1C,78
860 DATA 00,20,20,30,00,01,01,01
,00,00,00,00,00,00,00,00,00,00,0
0,10,50,D8,F0,E0,00,00,00,C0,C0,
00,00,00
870 DATA 00,00,00,08,0A,1B,0F,07
,00,00,00,03,03,00,00,00,00,04,0
4,0C,00,80,80,80,00,00,00,00,00,
00,00,00
1000 DATA 00000100,1f
1010 DATA 00000100,15
1020 DATA 00000100,15
1030 DATA 11111111,15
1040 DATA 00100000,15
1050 DATA 00100000,15
1060 DATA 00100000,14
1070 DATA 11111111,15
今回追加したのは、
390 X2=(X-XX)¥8:Y2=Y\8:Y3=(Y-JY)¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+(Y¥8)*32
410 AE=&H1800+((X+15)¥8)+(Y¥8)*32
420 IF XX>0 AND VPEEK(AE)=A1 THEN X=X2*8
430 IF XX>0 AND VPEEK(AE+32)=A1 THEN X=X2*8
440 IF XX<0 AND VPEEK(AD)=A1 THEN X=X2*8
450 IF XX<0 AND VPEEK(AD+32)=A1 THEN X=X2*8
460 AD = &H1800+(X¥8)+(Y¥8)*32
470 AE=&H1800+((X+15)¥8)+(Y¥8)*32
480 IF JY<0 AND VPEEK(AD)=A1 THEN Y=Y3*8:JF=0:JY=0
490 IF JY<0 AND VPEEK(AE)=A1 THEN Y=Y3*8:JF=0:JY=0
500 IF JY>=0 AND VPEEK(AD+64)=A1 THEN Y=Y2*8:JF=0:GOTO 530
510 IF JY>=0 AND VPEEK(AE+64)=A1 THEN Y=Y2*8:JF=0:GOTO 530
この部分です。
そんなに難しいことはしていません。
しかし、当たり判定は座標のことを考えないといけないので、
煩わしいですね。
まず、基本的には、
移動して、ブロックに当たった場合、移動を戻して、ブロックの隣の位置に
しっかりスプライトを表示してやります。
390 X2=(X-XX)\8:Y2=Y\8:Y3=(Y-JY)\8:IF JF=0 THEN JY=0
この行ですが、
X2=(X-XX)¥8
X座標の移動先にブロックがあった場合に、
移動前の座標へ戻してやるために、移動量XXを引いています。
210 X=X+XX
でやったのと逆をしてやれば、移動を打ち消せます。
なぜ8で割って商だけとっているかというと、
(のちに8を掛けて、スプライトのX座標にしています)
戻したときに、ブロックの隣に隙間なく
キャラを表示してやるために、です。
400 AD = &H1800+(X¥8)+(Y¥8)*32
410 AE=&H1800+((X+15)¥8)+(Y¥8)*32
画面上になんの文字があるか知るためには、
VRAMのアドレスが必要でした。
これは、スプライトキャラの中の、ADが左上、AEが右上を
表しています。
420 IF XX>0 AND VPEEK(AE)=A1 THEN X=X2*8
430 IF XX>0 AND VPEEK(AE+32)=A1 THEN X=X2*8
440 IF XX<0 AND VPEEK(AD)=A1 THEN X=X2*8
450 IF XX<0 AND VPEEK(AD+32)=A1 THEN X=X2*8
420 移動先で、キャラの右上が文字"A"(ブロックに変わっている)だったときは、
X座標を移動前に戻してやります。
430 キャラの右下の判定
440 キャラの左上の判定
450 キャラの左下の判定
です。
460 AD = &H1800+(X¥8)+(Y¥8)*32
470 AE=&H1800+((X+15)¥8)+(Y¥8)*32
ふたたび、位置のアドレスをとっているのは、
X座標をブロックに当たっていない位置に戻したときに、
Y座標の当たり判定をするためです。
これをやらずにY座標の当たり判定をやりことはできません。
もし460、470行をやらない場合、
X座標がブロックにめり込んだ状態で、Y座標を判定してやれば、
当然めりこんだ判定になってしまいます。
一度、X座標(キャラの横のブロック)においては、
ブロックにめりこんでいない状態にしてから
Y座標(キャラの上とか、下の位置のブロック)において、判定すべきです。
480 IF JY<0 AND VPEEK(AD)=A1 THEN Y=Y3*8:JF=0:JY=0
490 IF JY<0 AND VPEEK(AE)=A1 THEN Y=Y3*8:JF=0:JY=0
500 IF JY>=0 AND VPEEK(AD+64)=A1 THEN Y=Y2*8:JF=0:GOTO 530
510 IF JY>=0 AND VPEEK(AE+64)=A1 THEN Y=Y2*8:JF=0:GOTO 530
480 キャラの中の左上の判定
490キャラの中の右上の判定
500 キャラの外の左下の判定(足元。前回と変わらず)
500 キャラの外の右下の判定(足元)
最後に、8ドット移動を。
URLクリックで出来ます。
http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/movemove (9).dsk
速い、でもカクカク〜 !
こうまでカクカクとはw
プログラム投稿で、BASICではあまりアクションがないのは、このせい
かもしれないですね。
アクションだと、もう少し滑らかでないと厳しいかなぁ〜。
そうなってくると、もうマシン語でないとダメですね。
WebMSXの場合は、
右下の歯車の中の、Quick Options -> CPU Turboを
オンにしてやると、高速で動きます。
お好みでターボモードをご使用ください。
でも、まぁ本当は実機でやりたいところなので、
マシン語で作らないといけませんねぇ。
BASICの中からマシン語を使用するなんてことも、少し勉強しています。
でもそれは画像表示とかについてなので、
今回の普通に移動させるだけで遅い場合は、ちょっとわからないです;
もっと勉強せねば!
最後に、
iphoneとandroidでアプリを作っております。
MSXっぽいアプリで、横スクロールランアクションゲームです。
8ドットカクカクスクロールです!
でも、やっぱりスマホはすごい性能ですね!
こちらもよろしく、です。
次のページ