簡體   English   中英

C#Monogame:跳躍后“浮動”精靈

[英]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.Xposition.Y是角色的X和Y位置,而6448是精靈的寬度和高度。

要檢查碰撞矩形是否與塊的碰撞矩形相交,我有以下代碼

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.Xposition.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM