ニャオニャオ21世紀

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

MSX べーしっくぷろぐらむ で ゲーム作り 第六弾。 よりゲームらしく。横ブロック当たり判定を入れる(URLクリックで実行できます)

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

WebMSXでMSX BASICの自作ゲーム作成!第6弾。

今回はブロックに横からぶつかったら進まない、

下からぶつかったらそこで止まるというのをやりたいと思います。

ここができると魔城伝説2 ガリウスの迷宮のような

2Dアクションゲームの基礎ができます。

 

URLをクリックすると出来ます。

http://webmsx.org/?DISKA_URL=http://goods.heteml.jp/msx/movemove (8).dsk

f:id:nyaonyaokun:20180227074956p:plain

うーん、遅い。

ブロックとの当たり判定を追加するだけでここまで遅くなるとは;

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座標を移動前に戻してやります。

f:id:nyaonyaokun:20180227073903p:plain

 

 

430 キャラの右下の判定

f:id:nyaonyaokun:20180227073920p:plain

 

440 キャラの左上の判定

f:id:nyaonyaokun:20180227073936p:plain

 

 

450 キャラの左下の判定

です。

f:id:nyaonyaokun:20180227073952p:plain

 

 

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 キャラの中の左上の判定

f:id:nyaonyaokun:20180227074010p:plain

 

490キャラの中の右上の判定

f:id:nyaonyaokun:20180227074023p:plain

 

 

500 キャラの外の左下の判定(足元。前回と変わらず)

f:id:nyaonyaokun:20180227074036p:plain

 

 

500 キャラの外の右下の判定(足元)

f:id:nyaonyaokun:20180227074047p:plain

 

 

最後に、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ドットカクカクスクロールです!

でも、やっぱりスマホはすごい性能ですね!

 

8bit run run go

8bit run run go

  • nao21
  • ゲーム
  • 無料

 

 

play.google.com

 

www.nyaonyao21.com

 

 こちらもよろしく、です。

次のページ

www.nyaonyao21.com

 

 

 


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください