2017-09-04 88 views
0

我用瓷磚和玩家創建了一個小型遊戲,我試圖在碰撞檢測中編程。所以,當角色向左('A')工作時,我設法發生了碰撞,但在向右('D')時它不起作用。這是我的代碼:(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; 
     } 
    } 

在按「A」,速度將是一個負的參數,使得目標平鋪到播放器的左邊,它會檢查是否從目的地的矩形每瓦平鋪到玩家的左下方瓷磚區域。如果有瓷磚,則移動被取消,並且工作。然而,同樣的事情對'D'鍵不起作用,儘管我認爲'A'的相同代碼對'D'有效,稍作修改。

回答

0

我知道我遲了整整一個月,但這個人在遊戲編程中給了我很多。 Click here打開一個鏈接,他解釋了在2D平臺上進行碰撞的「正確」方式。他從另一個角度解釋了碰撞。我不會發布任何代碼,因爲我覺得你會發現自己做這件事更有趣。

它的主要特點是,如果您在物體撞到牆壁時檢查碰撞,那麼做任何事情都爲時已晚。對象很可能會在牆內繪製。您需要檢查對象的下一個位置(通過將X和Y速度添加到其位置),並且如果對象正在撞擊牆,則將對象移動到其旁邊。這樣,你永遠不會有一個對象在牆的情況。此外,您首先計算X/Y移動,速度,加速度和碰撞,然後對另一個軸執行相同的操作。

這是一種回答。我沒有給你代碼,但我告訴過你在哪裏可以找到你的答案。再一次,我沒有提供代碼,因爲我認爲你會對自己的一切編碼感到興奮。我承認,如果情況並非如此,那麼你現在應該在Unity論壇上,而不是XNA。

+1

謝謝你,但我知道我做錯了什麼。當我按下'A'鍵時,速度會保持爲正值,並且速度* -1會改變位置。這意味着,在這裏,它只會檢查右側的瓷磚,而不是左側。不過,我的確將角色速度添加到了角色身上,並在角色穿過時製作了一盒瓷磚,檢查是否存在衝突,並採用了不同的方法,如果角色在此框中發生碰撞,則以減少的方式循環速度加1,然後用新的速度重新包裝盒子,直到沒有碰撞發生,並移動角色。 – SentriCast

+0

其實,從我寫的內容來看,我不確定我做錯了什麼(就像我說的是正確的碰撞不是工作,而不是左邊的)。但是,我之前弄清楚了,所以我必須忽略任何代碼破壞它。 – SentriCast