HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0825
E.Tアクションゲームのあたり判定3解決


E.T

リンク

2013/8/25(Sun) 12:29:09|NO.56636

こんにちは。
今日はちょっと分からないことがあったので質問します。
以下のプログラムを作成してみました。
しかし途中からおかしくなってしまいました。
それは
・左右の壁判定
・ジャンプ中に天井にぶつかったら落下
この二つがわかりません。
スクリプトが長くてすいません。


////////////////////////////////////////プログラム処理 #packopt name "GAME" mes"準備中…" repeat 200 , 0 wait 1 getkey NP,27 if NP=1 : N=1 loop ////////////////////////////////////////変数表 ;PX=プレイヤー横 ;PY=プレイヤー縦 ;F=0未ジャンプ 1=ジャンプ中 ;C=ジャンプカウンター ;r,g,b=カラー取得 ;V=プレイヤー左下壁 ;V2=プレイヤー右下壁 ;K=落下中か ;N=デバックモードか(Escキーを押しながらで) ;NP,KI1,KI2,KI3=キーチェック ; ; ; ////////////////////////////////////////設定 cls screen 0 , 640 , 480 PX=40:PY=0 title "GAME-スペース:ジャンプ 左右:移動" ////////////////////////////////////////基本(プレイヤー移動処理) *KIHONNPY if N=1 : title "デバックモード PX:"+PX+" PY:"+PY+" r:"+r+" g:"+g+" b:"+b+" f:"+f+" k:"+k+" C:"+c cls getkey KI1,37 getkey KI2,39 getkey KI3,32 if KI1=1 : PX=PX-2:gosub *HIDARI if KI2=1 : PX=PX+2:gosub *MIGI if KI3=1 : gosub *ZYANPU if PX<=0 : PX=0 if PX>=625 : PX=625 pos PX,PY color 255,255,0 mes"●" await 20 if F=1 : PY=PY-3:C=C+1 if C=20 : F=0 if F=1 : gosub *UE ////////////////////////////////////////書き込み処理へ gosub *KAKIKOMI ////////////////////////////////////////プレイヤーの真下に壁があるか pget PX+0,PY+17 r = ginfo_r g = ginfo_g b = ginfo_b //壁がなかったら下へ K=0:V=0:V2=0 if r=255 { if g=255 { if b=255 { V=1 } } } pget PX+10,PY+17 r = ginfo_r g = ginfo_g b = ginfo_b if r=255 { if g=255 { if b=255 { V2=1:K=1 } } } if V=1 : if V2=1 : PY=PY+2:K=1 ////////////////////////////////////////下へ落ちたか(ミス) if PY>=480 : dialog "ミス!":stop goto *KIHONNPY //メインループここまで////////////////////////////////////////////////// ////////////////////////////////////////ジャンプ *ZYANPU if F=1 : return if K=1 : return F=1:C=20:K=0 return ////////////////////////////////////////壁横判定 *HIDARI //プレイヤーの左に壁があるか pget PX,PY+10 r = ginfo_r g = ginfo_g b = ginfo_b //壁があったらもどす if r=0 { if g=0 { if b=0 { PX=PX+2 } } } return *MIGI //プレイヤーの右に壁があるか pget PX+15,PY+10 r = ginfo_r g = ginfo_g b = ginfo_b //壁があったらもどす if r=0 { if g=0 { if b=0 { PX=PX-2 } } } return ////////////////////////////////////////ジャンプ中上判定 *UE pget PX+5,PY+0 r = ginfo_r g = ginfo_g b = ginfo_b //壁があったら下へもどす if r=0 { if g=0 { if b=0 { F=0:K=1 } } } return ////////////////////////////////////////書き込み処理 *KAKIKOMI color 0,0,0 boxf 40,200,80,90 boxf 20,200,100,210 boxf 20,164,100,160 return <pre/>



この記事に返信する


E.T

リンク

2013/8/25(Sun) 12:30:51|NO.56637

連続投稿すいません。
最後の<pre/>は/preの間違えです。



暇人

リンク

2013/8/25(Sun) 13:28:08|NO.56639

まずclsは画面クリア(button等のオブジェクトも消える)命令で背景クリア命令じゃ無いので
毎フレーム使用する目的では使わない方が良い(描画命令を使う場合は特に)

clsを

redraw 1//画面更新(描画したのを画面に表示) redraw 0//画面更新無し(描画途中が見えないように) color 255,255,255 boxf
に置き換え


>・左右の壁判定
>・ジャンプ中に天井にぶつかったら落下
判定は間違ってないが
処理の流れに問題がある
背景の色を判定に使ってるのに画面クリア後に左右上の判定をしてる
この方法の場合判定前に背景を完成させる必要がある

普通は判定用と表示用を使って処理するので何時描画するかの問題は出ない
表示用と判定用で同じ画像にする必要は無いので
背景の色を気にする必要は無くなる



E.T

リンク

2013/8/25(Sun) 17:20:58|NO.56640

回答ありがとうございます。
おかげでできるようになりました。
また何かあったらよろしくお願いします。



ONION software Copyright 1997-2023(c) All rights reserved.