2017-09-04 4 views
0

タイルとプレーヤーで小さなゲームを作成しましたが、私は衝突検出でプログラムしようとしています。だから、私はキャラクターが仕事に残っているとき( 'A')は衝突するように管理しましたが、それが正しければ動作しません( 'D')。これは私のコードです:「A」を押すことで(C#XNA)オブジェクトが一方向にだけ通過する文字

public bool ColX(Texture2D sprite, Vector2 pos, float speed) 
    { 
     float PosLeftX = pos.X; 
     float PosUpY = pos.Y; 
     float PosRightX = pos.X + sprite.Width; 
     float PosDownY = pos.Y + sprite.Height; 
     float DestX = pos.X + speed; 
     Vector2 tileTopLeft = GetTile(PosLeftX, PosUpY); //using PosLeftX and PosLeftY to set top left tile to a variable 
     Vector2 tileBotLeft = GetTile(PosLeftX, PosDownY); 
     Vector2 tileTopRight = GetTile(PosRightX, PosUpY); 
     Vector2 tileBotRight = GetTile(PosRightX, PosDownY); 
     Vector2 tileDestUp = GetTile(DestX, PosUpY); 
     Vector2 tileDestDown = GetTile(DestX, PosDownY); 

     if(tileTopRight.X < tileDestUp.X) 
     { 
      float startX = tileTopRight.X; 
      float finishX = tileDestUp.X; 
      float startY = tileTopRight.Y; 
      float finishY = tileBotRight.Y; 

      for (int l = (int)startX; l <= finishX; l++) 
      { 
       for (int i = (int)startY; i <= finishY; i++) 
       { 
        if (tileList[l, i] != null) 
        { 
         return true; 
        } 
       } 
      } 
      return false; 
     } 
     else if (tileTopLeft.X > tileDestDown.X) 
     { 
      float startX = tileDestUp.X; 
      float finishX = tileTopLeft.X; 
      float startY = tileDestUp.Y; 
      float finishY = tileDestDown.Y; 

      for (int l = (int)startX; l <= finishX; l++) 
      { 
       for (int i = (int)startY; i <= finishY; i++) 
       { 
        if (tileList[l, i] != null) 
        { 
         return true; 
        } 
       } 
      } 
      return false; 
     } 
     else 
     { 
      return false; 
     } 
    } 

、速度はプレイヤーの左側に目的地タイルを作り、負のパラメータとなり、それが先から長方形に各タイルかどうかをチェックしますタイルをプレーヤーの左下のタイル領域にタイルします。タイルがある場合、移動はキャンセルされ、動作します。しかし、同じことが 'D'キーのために働いていませんが、私は 'A'のための同じコードが少しの変更で 'D'のために働くと仮定しました。

答えて

0

私は1ヶ月遅れていることは知っていますが、この男はゲームプログラミングで多くのことを聞きました。 Click hereリンクを開き、2Dプラットフォームで衝突を行うための「正しい」方法について説明します。彼は別の観点から衝突を説明します。私はコードを投稿することはありません。なぜなら、自分でやるのは面白いと思うからです。

あなたのオブジェクトが壁に当たったときに衝突を確認すると、何かをするのが遅すぎるということです。オブジェクトはおそらく壁の中にドローイングされます。オブジェクトの次の位置を確認する必要があります(XとYの速度をその位置に加えます)。オブジェクトが壁に当たっている場合は、オブジェクトをその隣に移動します。このようにして、あなたは壁の中にオブジェクトの状態を持つことは決してありません。また、最初にX/Yの動き、速度、加速度、およびCOLLISIONを計算し、次に他の軸についても同じことを行います。

これは一種の答えです。私はあなたにコードを教えてくれませんでしたが、あなたの答えを見つける場所を教えました。繰り返しますが、私はコードを提供しませんでした。なぜなら、あなた自身がすべてを自分でコーディングしていると思うからです。もしそうでなければ、あなたはXNAではなくUnityフォーラムに参加することをお勧めします。

+1

ありがとうございますが、私が間違ったことを理解しました。 「A」キーを押すと、速度は正のままで、位置は速度* -1で変化します。これは、ここでは、左ではなく右にあるタイルだけをチェックすることを意味します。キャラクターが通過するタイルの箱を作って衝突をチェックし、別の方法ではキャラクターがこのボックスで衝突した場合は減速してループします速度を1倍にしてから、衝突が発生しなくなるまで新しい速度でボックスを再読み込みし、文字を移動します。 – SentriCast

+0

実際、私が書いたことから、私は何が間違っていたのか分かりません(私はそれが左ではなく、うまく動作しないと言ったので)。しかし、私は前にそれを把握していたので、コードを壊したものはすべて削除しておかなければならない。 – SentriCast

関連する問題