質問: 質問です! BGをスクロールさせるときは、 どうやったら当たり判定をすることがで できるのでしょうか。 教えてください!お願い致します!!!
回答: ■リスト ――――――――――――――――――――――――――― ACLS '地面描写 -------------------- BGFILL 1,35,18,40,19,778,2,0,0 BGFILL 1,45,19,46,20,778,2,0,0 BGFILL 1,20,20,30,21,778,2,0,0 BGFILL 1, 5,22,50,22,778,2,0,0 BGFILL 1, 0,23,64,23,778,2,0,0 BGPUT 1,12,22,0 '穴を開ける 'キャラ指定 ------------------ X=16*8:Y=12*8 SPSET 0,64,2,0,0,1 SPANIM 0,4,5 '歩行アニメーション設定 'キャラ視覚化 ---------------- SPSET 1,64,2,0,0,1 SPANIM 1,4,5 SPOFS 1,20*8,0 GFILL 20*8,2*8,22*8,3*8,&HA GFILL 22*8,0*8,23*8,2*8,&HA @LOOP FOR SX=0 TO 511 SPOFS 0,X,Y 'スプライトを移動 BX=FLOOR(X/8)+SX/8 'スプライト座標をBG座標に変換 BY=FLOOR(Y/8) BGREAD(1,BX ,BY+2),CHR1,PAL,H,V '足下確認 BGREAD(1,BX+1,BY+2),CHR2,PAL,H,V BGREAD(1,BX+2,BY ),CHR3,PAL,H,V '前方確認 BGREAD(1,BX+2,BY+1),CHR4,PAL,H,V IF CHR1+CHR2==0 THEN Y=Y+4 '足下空白なら落ちる IF CHR3+CHR4!=0 THEN Y=Y-64:BEEP 8 '前方壁ならジャンプ BGOFS 1,SX,0 'BG画面スクロール 'BG状態 視覚化 --------------- CLS LOCATE 20,2 IF CHR1==778 THEN ?"■" ELSE ?"1" LOCATE 21,2 IF CHR2==778 THEN ?"■" ELSE ?"2" LOCATE 22,0 IF CHR3==778 THEN ?"■" ELSE ?"3" LOCATE 22,1 IF CHR4==778 THEN ?"■" ELSE ?"4" 'スローモーション確認 -------- B=BUTTON() IF B!=0 THEN WAIT 10 '何かキーを押すと遅くなる WAIT 1 NEXT GOTO @LOOP ――――――――――――――――――――――――――― ■簡単な説明 スプライト同士の衝突は SPCOL で簡単に判定できるが、 BGにはその様な便利な命令がないので計算で求めるしかない。 基本的には足下に壁がない場合降下して 前方に壁がある場合ジャンプして 一連の確認が終わったらBGをスクロールしているだけです。 但し、スプライトとBGは座標系が違うので変換する必要があります。 スプライトは 0~255 BGは 0~31 なので丁度1/8で一対一になる 足下のBGキャラを調べるのは BGREAD で取得できます。 ここまでは前回の回答と同じです。(詳しくは参照) 今回の問題点はBGをスクロールさせた場合の壁の当たり判定です。 別に難しくは無くって BGOFS で移動した距離を加算するだけです。 たった、コ・レ・ダ・ケ です。(*^▽^*)/ 今回は当たり判定を4カ所に増やしています。 これにより穴が1個の場合落ちないようになっています。 詳しくは図とプログラムをにらめっこして下さい。 このプログラムの要所はたった9行なので難しくは無いはずです。 (似た計算を箇所が4行追加したので実質5行です) 難しい処理は一切行っていません。 詳しく学びたい場合、このサンプルの少しずつ改造するのが 一番の勉強になると思います。 CHR3だけ当たると後ろに飛ばされるとか 判定箇所を増やして天井に当たった場合落ちるとか 地面に大きい穴を開けて落ちたら上から登場するとか ・・・と、言いたいが『BGのスクロール判定説明』のため 必要最低限度の処理しか行っていないので少し工夫が必要です。 知恵ノートに見易くまとめたので参照して下さい。