【问题标题】:C# Monogame: "floating" sprite after jumpingC# Monogame:跳跃后的“浮动”精灵
【发布时间】:2016-12-08 13:30:50
【问题描述】:

我目前正在使用 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 是一个布尔值,用于检查是否与块的顶部发生碰撞。循环检查数组中的每个块,字符是否与其topWall 相交。如果是这样,它将topCol 设置为true。在循环之后,它检查topCol 是否为真。如果是,它会显示hero.topOfBlocktrue,这意味着角色不应该跌倒。如果是false,则将hero.topOfBlock 设置为false,这将触发Hero 类中的fall() 方法,只要jumping 也是false。

最后,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,以此类推。我不知道是什么导致了这个问题。我尝试了多种方法,例如修补块和角色的碰撞矩形,但似乎没有任何效果。当我从topWall = new Rectangle() 中的(int)position.Y - size 中删除- size 时(我认为这会是问题所在),角色会从块中掉下来,所以这也不能解决它。

为了让我的意思更清楚一点,这里有两张图片:

When the game loads

After jumping once

【问题讨论】:

  • 你有position.Y -= verticalMovement; 用于跳跃?不应该是跳的时候加,跌的时候减吗?另外,你的verticalMovement 初始化的值是多少?
  • 不,Y值越高,精灵放置的越低。所以如果你想跳跃,你必须减小 Y 值,因此用-= 代替+=
  • @AsheraH 位置 0,0 在编程中大多数情况下位于左上角,对于 XNA 以及 winforms、html 等。

标签: c# 2d sprite monogame


【解决方案1】:

你说

“在循环之后,它会检查 topCol 是否为真。如果是,它会将 hero.topOfBlock 设置为 true,这意味着角色不应该跌倒。”

它对应于顶部的 if-then 条件;您没有提到将角色的 Y 坐标设置为图块的顶部。我不确定这是否会导致您的问题,这取决于您何时调用 checkCollision,但这可能是问题的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多