2016-05-24 4 views
1

これは私が現在取り組んでいるゲームであり、仕事と移動の衝突がありますが、 (壁のリストから)壁のそれは私のプレーヤーを動かす停止しますが、私は、キーを押し続ける場合、プレイヤーはC#衝突、ブーリアンが右に動くことができないと言うと、プレーヤーが動かないようにする方法

を完全に貫通して移動しますこれは、移動すると、衝突のためのコードです:

bool left = false; 
    bool up = false; 
    bool right = false; 
    bool down = false; 

    private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     #region Movement 
     if (e.KeyCode == Keys.D && !right) 
     { 
      right = true; 
     } 

     if (e.KeyCode == Keys.A && !left) 
     { 
      left = true; 
     } 

     if (e.KeyCode == Keys.W) 
     { 
      up = true; 
     } 

     if (e.KeyCode == Keys.S) 
     { 
      down = true; 
     } 
     #endregion 
    } 

    public void Collision() 
    { 
     for (int x = 0; x < walls.Count; x++) 
     { 
      if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && right) 
      { 
       right = false; 
      } 

      if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && left) 
      { 
       left = false; 
      } 

      if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && up) 
      { 
       up = false; 
      } 

      if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && down) 
      { 
       down = false; 
      } 
     } 
    } 

    private void Form1_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.D) 
     { 
      right = false; 
     } 

     if (e.KeyCode == Keys.A) 
     { 
      left = false; 
     } 

     if (e.KeyCode == Keys.W) 
     { 
      up = false; 
     } 

     if (e.KeyCode == Keys.S) 
     { 
      down = false; 
     } 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     #region True 
     if (right) 
     { 
      Point loc = player.obj.Location; 
      loc.X = loc.X + 4; 
      player.obj.Location = loc; 
     } 

     if (left) 
     { 
      Point loc = player.obj.Location; 
      loc.X = loc.X - 4; 
      player.obj.Location = loc; 
     } 

     if (up) 
     { 
      Point loc = player.obj.Location; 
      loc.Y = loc.Y - 4; 
      player.obj.Location = loc; 
     } 

     if (down) 
     { 
      Point loc = player.obj.Location; 
      loc.Y = loc.Y + 4; 
      player.obj.Location = loc; 
     } 
     #endregion 

     #region NotTrue 
     if (!right) 
     { 
      Point loc = player.obj.Location; 
      loc.X = loc.X + 0; 
      player.obj.Location = loc; 
     } 

     if (!left) 
     { 
      Point loc = player.obj.Location; 
      loc.X = loc.X - 0; 
      player.obj.Location = loc; 
     } 

     if (!up) 
     { 
      Point loc = player.obj.Location; 
      loc.Y = loc.Y - 0; 
      player.obj.Location = loc; 
     } 

     if (!down) 
     { 
      Point loc = player.obj.Location; 
      loc.Y = loc.Y + 0; 
      player.obj.Location = loc; 
     } 
     #endregion 

     Collision(); 
    } 
} 
} 

注意:すべてが機能しますが、プレイヤーはオブジェクトに衝突して数秒間停止した後、壁を通って移動します。

答えて

0

あなたは例えば、彼らは壁にぶつかるとき、右に移動プレーヤーを防ぐためにcantMoveRightのような別のブール値が必要になるだろう:

if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && right) 
{ 
    right = false; 
    cantMoveRight = true; 
    cantMoveLeft = false; //Assuming when they cant move right they must move left, perhaps check this in situations when the player can only move forward or backward 
} 

if (player.obj.Bounds.IntersectsWith(walls[x].Bounds) && left) 
{ 
    left = false; 
    cantMoveRight = false; 
    cantMoveLeft = true; 
} 

そして、KeyUpイベントでのことを確認してください。

if (e.KeyCode == Keys.D && !cantMoveRight) 
{ 
    right = false; 
} 

if (e.KeyCode == Keys.A && !cantMoveLeft) 
{ 
    left = false; 
} 

このようにして、timer1_Tickイベントが発生したとき、プレイヤーは壁を移動しません。

+0

私が目を覚ましたとき、朝にこのメソッドを試してみます。 –

関連する問題