2016-08-29 11 views
0

私は単純なゲームを作っています。私は私のキャラクターを矢印キーと火で動かすことができました。私はマップにピクチャボックスであるいくつかの壁を追加しました。私はこのような衝突を検出することができた:衝突の検出と停止の動き

private void timer6_Tick(object sender, EventArgs e){ 
    foreach (PictureBox pic in brick){ 
     if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)){ 
      Console.WriteLine("Colision!"); 
      switch (rotation){ 
       case "up": 
        canup = false; 
        candown = true; 
        canleft = true; 
        canright = true; 
        break; 
       case "down": 
        canup = true; 
        candown = false; 
        canleft = true; 
        canright = true; 
        break; 
       case "left": 
        candown = true; 
        canup = true; 
        canleft = false; 
        canright = true; 
        break; 
       case "right": 
        candown = true; 
        canup = true; 
        canleft = true; 
        canright = false; 
        break; 
      } 
     } 
     else 
     { 
      Console.WriteLine("No colision?!"); 
     } 
    } 
} 

これは期待どおりに動作するが、すぐに私はオブジェクト(壁)に当たって "Colision"を得る。エコーはOKですが、これはまた、衝突が発生したときにキャラクターが向いていた方向への移動を停止します。事は、私がこれらのboolのうちの1つを偽のままにして、私のキャラクターが同じ方向に再び動くのを妨げる衝突を終了するときです。私は他のブランチではtrueに設定しようとしましたが、衝突があっても5つの壁があるので他のブランチは5から4回実行されます。一瞬に襲われる

+0

あなたは、あなたの 'Timer'内部ではなく、ワン持っていて、衝突を検出した場合、あなたは-assumingあなた' movement'機能上の衝突を確認することができますその動きを許さない。 – uTeisT

+2

別のアプローチを考えてみましょう。ユーザーが*コマンド*を入力します。ゲーム*の文脈でコマンドを評価すると、コマンドは* approved *または* denied *のいずれかになります。承認された場合、文字は示された方向に移動します。拒否された場合、何も起こりません。私はあなたがこのパターンを使ってあなたのゲームを構造化すれば、あなたの問題の多くはなくなると思います。 –

答えて

1

私はあなたがになっているものは100%確実ではないが、私はこれが役立つかもしれないと思う:

canup = true; 
candown = true; 
canleft = true; 
canright = true; 
foreach (PictureBox pic in brick) 
{ 
    if (pic.Bounds.IntersectsWith(pb_sprite.Bounds)) 
    { 
     Console.WriteLine("Colision!"); 
     switch (rotation) 
     { 
      case "up": 
       canup = false; 
       break; 
      case "down": 
       candown = false; 
       break; 
      case "left": 
       canleft = false; 
       break; 
      case "right": 
       canright = false; 
       break; 
     } 
    } 
    else 
    { 
     Console.WriteLine("No colision?!"); 
    } 
    ... 

これは、開始時にtrueにすべてのboolsを設定し、唯一の偽のように、個々のboolsを設定しますループ内。

+2

また、 'rotation'の文字列の代わりにenumを使用すると役立ちます –

0

キャラクターを止めるだけですが、コリジョンを解決しない可能性はありますか?レンガとキャラクターはお互いの中にあり、結局衝突を引き起こします。彼らは再び衝突のないように互いに外に移動する必要があります。

一般的な方法は、キャラクターの位置をフレームで戻すことです。より正確にするには、キャラクターがどれだけ深くレンガを突き抜けて方向に沿って戻すかを調べますそれはその金額から生じたものです。