[英]C# Monogame: “floating” sprite after jumping
我目前正在使用Monogame進行2d平台游戲。 我可以畫一個精靈,我可以繪制一個角色和等級,我可以移動角色並跳躍,但是當我跳躍時,我的角色“浮動”在等級塊上方而不是降落在它上面。 左右碰撞工作正常,角色在應該停止時停止,但跳躍時它不能正確着陸。 我有以下代碼:
要檢查玩家是否想跳,請執行檢查以查看是否按下了向上箭頭。
if(state.IsKeyDown(Keys.Up) && hasJumped == false)
{
jumping = true;
}
在完成按鍵檢查后,檢查jumping
變量是否為真
if (jumping == true)
{
jump();
} else if (falling == true && topOfBlock == false)
{
fall();
}
else
{
hasJumped = false;
verticalMovement = 14;
}
基本上jumping
檢查是否要跳躍, falling
檢查字符是否下降, topOfBlock
檢查字符是否在塊頂部, hasJumped
檢查當前是否正在進行跳轉(因此不能進行雙跳)並且verticalMovement
是每個刻度字符跳躍/下降的像素數量。
jump()
和fall()
方法如下所示:
private void jump()
{
if (verticalMovement >= 0)
{
position.Y -= verticalMovement;
verticalMovement--;
} else
{
jumping = false;
hasJumped = true;
falling = true;
}
}
public void fall()
{
position.Y += verticalMovement;
verticalMovement++;
}
我認為代碼說明了一切。 基本上,如果該字符不再被向上移動, falling
被設置為true
,這會觸發fall()
方法,只要該字符不是上的塊的頂部。
最后,角色的碰撞矩形將更新為角色的新位置。
colRect = new Rectangle((int)position.X, (int)position.Y, 64, 48);
其中position.X
和position.Y
是角色的X和Y位置,而64
和48
是精靈的寬度和高度。
要檢查碰撞矩形是否與塊的碰撞矩形相交,我有以下代碼
private void checkCollision()
{
bool topCol = false;
for (int x = 0; x < blockTileArray.GetLength(0); x++)
{
for (int y = 0; y < blockTileArray.GetLength(1); y++)
{
if (blockTileArray[x, y] != null)
{
if (hero.colRect.Intersects(blockTileArray[x, y].topWall))
{
topCol = true;
}
}
}
}
if(topCol == true)
{
hero.topOfBlock = true;
} else
{
hero.topOfBlock = false;
}
}
topCol
是一個bool,用於檢查是否與塊頂部發生沖突。 循環檢查數組中的每個塊,無論字符是否與topWall
相交。 如果是這樣,它將topCol
設置為true。 在循環之后,它檢查topCol
是否為真。 如果是,則將hero.topOfBlock
表示為true
,這意味着角色不應該掉落。 如果它是false
,它將hero.topOfBlock
設置為false
,這將觸發Hero類中的fall()
方法,只要jumping
也是假的。
最后, topWall
碰撞矩形創建如下:
topWall = new Rectangle((int)position.X, (int)position.Y - size, size, 1);
position.X
和position.Y
是X和Y位置, size
是塊的寬度和高度(兩者都是30,因為它是一個正方形),1是使它只有1個像素高。
正如我所說,問題是角色在跳躍后浮動。 起始y位置是402像素(第一個區塊的topWall.Y
是420,意味着當游戲加載時角色站在塊的頂部),跳躍之后它應該回到402.然而; 跳一次之后,它會變為374,然后是373,然后是387,386,......,374,373,再次返回387,依此類推。 我不知道是什么導致了這個問題。 我嘗試了很多東西,比如修補塊和角色的碰撞矩形,但似乎沒有任何效果。 當我從(int)position.Y - size
刪除- size
(int)position.Y - size
topWall = new Rectangle()
(我認為這將是問題)時,字符會通過塊,因此也不會修復它。
為了讓我的意思更清楚一點,這里有兩張圖片:
你說
“在循環之后,它會檢查topCol是否為真。如果是,則表示hero.topOfBlock為true,這意味着角色不應該掉落。”
這對應於你在頂部的if-then條件; 你沒有提到將角色的Y坐標設置到拼貼的頂部。 我不確定這是否會導致您的問題,這取決於您何時調用checkCollision,但這可能是問題的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.