ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、セガサターン)と、MSXぽいアプリ開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハックほか雑記を綴っています

スポンサーリンク

WebMSXでMSX BASICの自作ゲーム作成!第四弾。地面の当たり判定を入れる(URLクリックで実行できます)

スポンサーリンク

WebMSXでMSX BASICのゲームを作ろう!第四弾。

地面の当たり判定をいれます。

今まではY>160以上はY=160などと簡易なものでした。

それを自分のキャラの下にブロックがあるかどうか判定して、

あればその上に表示するというのをやります。

今日は地面だけです。横移動とジャンプで頭がぶつかるというのは

また今度にします。 

 

こちらのURLをクリックして頂ければ実行できます。

 

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

 

f:id:nyaonyaokun:20180223090942p:plain

ちょっとゲームらしくなってきました!

それではソースコードを。

 

10 SCREEN1,2,0:DEFINTA-Z:KEYOFF:
WIDTH32: COLOR15,1,1
20 H2 = 1:X=128: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$
70 VPOKE A1*8+I,VAL("&h"+D$)
80 NEXT
90 VPOKE &H2000+A1¥8,&H41
100 LOCATE 15,15:PRINT "AAA"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "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 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 Y2=Y¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+Y2*32
410 IF VPEEK(AD+64)=A1 THEN Y=Y2
*8:JF=0:GOTO 440
420 IF VPEEK(AD+1+64)=A1 THEN Y=
Y2*8:JF=0:GOTO 440
430 IF JF=0 THEN JF=1:JC=0:JY=0
440 PUTSPRITE 0,(X,Y),7,H
450 PUTSPRITE 1,(X,Y),11,H+2
460 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
1000 DATA 7E,7E,00,00,E7,E7,00,00

 

 

前回と違うのは、

100 LOCATE 15,15:PRINT "AAA"
110 LOCATE 8,12:PRINT "AAA"
120 LOCATE 5,10:PRINT "AAA"
130 LOCATE 10,18:PRINT "AAA"
140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX, A1

160 NEXT

 

の追加と、

180 XX=0
190 IF S=3 THEN XX=4
200 IF S=7 THEN XX=-4
210 X=X+XX

の変更と、

 

390 Y2=Y¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+Y2*32
410 IF VPEEK(AD+64)=A1 THEN Y=Y2
*8:JF=0:GOTO 440
420 IF VPEEK(AD+1+64)=A1 THEN Y=
Y2*8:JF=0:GOTO 440
430 IF JF=0 THEN JF=1:JC=0:JY=0

の追加です。

 

行番号は変わっています。(BASICは行番号が面倒臭いですね;)

 

100~160行はステージを書いています。

新しいところは、140行以下ですね。

 

140 BY=22:FOR BX=0 TO 31
150 VPOKE &H1800 + 32*BY + BX, A1

160 NEXT

実行画面の一番下の横一列のブロックを表示しています。

VPOKEというのはVRAMに書き込む命令文でした。

VRAMには、表示画面のどこそこに、どんな文字が表示されているか

入っている場所があります。

&H1800以降に画面情報が入っています。

150行のA1は文字A(ブロックの絵に変更済み)のアスキーコードが入って

います。

 

画面というのは、X、Y座標であらわせるのはご存知だと思うのですが、

x,y=(10,15)

とかいうのですね。

それをひとつの数字で表すこともできます。

それが

VPOKE &H1800 + 32*BY + BXの、

+ 32*BY + BX

の部分です。

 

32*Y+X

ですね。

どういう仕組みかといいますと、

MSXの横に表示できる文字数は32文字です。

LOCATEのX座標では0~31で表されます。

x,y = (0,0)  ~   x,y=(31,0)

一つの数字で表すには、Y座標が0ならば、そのままX座標の数字を書いてやります。

問題は

Y座標が1,2,3,4,5~となった時ですね。

先に回答を書くと、

x,y = (0,1)は、32となります。

右端までいったら、そのまま数字を足していきます。

(y=0)    0,1,2,3  ~ 28,29,30,31ときたら下の列は、

(y=1) 32,33,34,35,~60,62,63ときます。さらにその下

(y=2)    64,65,66,67 ~ 93,94,95となり、その下

(y=3)    96,97,98,99~

と表します。

式 :32*Y+X

座標をこんな風にあらわしたことがなかったので、これを知ったときは

なるほどな〜考えてあるなぁと思いました。

私がiOSのカメラアプリを作った時に知りました。

メモリに入っている画像の色データを取得するものだったので同じものです。

MSXのBASICだけでなく、最新のアプリ開発にも使える考えです。すごい!

 

画面にどんな文字が表示されているか知るのも似ています。

それがわからないと、地面判定できないので。

 

 

390行からは、地面の判定になります。

 

390 Y2=Y¥8:IF JF=0 THEN JY=0
400 AD = &H1800+(X¥8)+Y2*32

 

X¥8とかY¥8とかありますが、

X,Yはスプライトの座標なので、(0,0) ~ (255,191)で表します。

それを文字の座標になおします。

文字は8x8ドットなので、8で割った商を取得すればOKです。

スプライト座標x,y=(160,85)なら、

文字の座標に直すとx,y=(20,10)になります。

 

400行のADには、あとで使うVRAMのアドレス部分だけを変数ADに

入れておきます。

のちのち計算の量が減ればいいなぁと思ってのことです。

 

スプライトは左上が座標になっています。

それと今回使っているのが、16x16ドットのスプライトです。

そうなると左下の地面(文字)と右下の地面(文字)を取得しないといけません。

410 IF VPEEK(AD+64)=A1 THEN Y=Y2
*8:JF=0:GOTO 440

420 IF VPEEK(AD+1+64)=A1 THEN Y=
Y2*8:JF=0:GOTO 440

410行が左下、420行が右下です。

 

マイキャラの足元の文字が"A"であるか調べています。

VPEEKはそのアドレスに何が入っているか取得する命令です。

 

画面上の文字を知るためには

&H1800+(文字単位のY座標)*32+(文字単位のX座標)

のアドレスを見ればいいです。

 

本来の書き方(アドレスの)をしますと、

IF VPEEK(&H1800+(X¥8)+(Y¥8+2)*32)=A1 THEN Y=Y2*8:JF=0:GOTO 440

となります。

VPEEK(&H1800+(X¥8)+(Y¥8+2)*32)=A1

(Y¥8+2)は2文字文下が足元になりますので、Y座標 +2してやるわけです。

 

(IF) THEN以降ですが、

地面がブロックだった場合、その地面の上の座標にスプライトを表示して

やればいいので

Y=Y2*8となります。

(文字単位の座標に掛ける8をしてやることで、地面との隙間なく表示できます)

(文字が8ドット、スプライトが16ドットなのでできる技ですね。)

 

430 IF JF=0 THEN JF=1:JC=0:JY=0

は下に地面がない時です。

ジャンプ時ではなく、

ブロックに乗っていて、横に歩いて端から落ちるところですね。

自由落下です。

 

自由落下も、ジャンプ処理のプログラムを使います。

もちろんジャンプフラグはオン。

それだけでは上に飛んでしまうので、ジャンプ時の頂点を意味する、

ジャンプカウンタ JC=0

ジャンプ時移動量 JY=0

に設定します。

この初期値を設定してやれば、あとは落ちていくだけです。

 

今日はこれぐらいにしておきます。

あとは横にブロックがある時に止まるとか、上にブロックがあるときですね。

ちょっとやってみたんですけど、動きがまったりしてしまうんですよねぇ。

遅いんです。

8ドット移動にすると速いのですが、ジャンプの軌道が気に入らないので、そこを

どうするかで悩んでいます。^^

 

 

最後に、

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