2017-11-07 2 views
1

私は楽しくゲームをプログラミングしていますし、CとGBAモード3についてよく知っています。でも、私は問題にぶつかりました。2つの2Dオブジェクトの衝突ごとに1つのライフを削除するにはどうすればよいですか?

私はこれら2つのブロックを画面に表示しています.1人は良い人、もう1人は悪い人です。良い男が悪い男と衝突して、人生を取り除くはずだ。問題の出番つまり

私はゲームを実行whileループ内にこれを持っている:。

if (plyr_row < enemy_row + enemy_size && plyr_ row 
    + plyr_size > enemy_row && plyr_col < enemy_col + enemy_size 
    && plyr_size + plyr_col > enemy_col) 
    { 
     lives--; 
    } 

命がダウンして行くのですが、プレイヤーが作っている間の生活の多くを奪われ敵との接触。言い換えれば、接触中に、人生は本当に速く落ち、衝突するたびに人生を取り除きたいのですが、どうすれば達成できますか?

+2

質問に答えが暗黙のうちではありませんか?あなたは1回の衝突につき1人の命を控除したいだけです。したがって、衝突の開始と終了を検出します。つまり、プレイヤーが敵のヒットボックスに入ったときと終了したときを検出し、1回の衝突当たりのライフを1回だけ差し引くようにします。それによると、ほとんどのゲームでは、プレイヤーは衝突サイトから離れて再発動し、これは問題ではありません。 –

+0

標準的な解決策は、損傷を受けた後に脆弱な期間を持つことです(しばしばスプライトが点滅する)。 –

+0

のように見えるコードは、プレイヤーごとに1回以上のチェックを行っているようです。 – user3629249

答えて

2

現在、衝突が発生している場合は、フラグを使用して覚えておく必要があります。ような何か:別の人生は、次の衝突に削除される前に、今

int in_collision = 0; // global flag, initialized to 0 once at start 

... 

if (plyr_row < enemy_row + enemy_size && 
    plyr_row + plyr_size > enemy_row && 
    plyr_col < enemy_col + enemy_size && 
    plyr_size + plyr_col > enemy_col) { 
    if (!in_collision) { 
     in_collision = 1; 
     lives--; 
    } 
} else { 
    in_collision = 0; 
} 

は、実行中の衝突が停止する必要があります。

+0

魅力的なように働いた!どうもありがとうございました! :D – DevAllanPer

2

最も簡単な解決策は、フラグを維持することです。IN_COLLISION衝突があってIN_COLLISIONが偽である場合、人生を削除したいとします。

最初の衝突検出ではtrueに、それ以上衝突しない場合はfalseに切り替えます。

+0

ありがとう!私はその応答に感謝します。 – DevAllanPer

関連する問題