Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“单局游戏”:;浮动;跳跃后的精灵_C#_2d_Sprite_Monogame - Fatal编程技术网

C# C“单局游戏”:;浮动;跳跃后的精灵

C# C“单局游戏”:;浮动;跳跃后的精灵,c#,2d,sprite,monogame,C#,2d,Sprite,Monogame,我目前正在使用Monogame开发2d平台。我可以画一个精灵,我可以画一个角色和关卡,我可以移动角色并跳跃,但是当我跳跃时,我的角色“漂浮”在关卡上方而不是降落在上面。左右碰撞工作正常,角色在应该停止时停止,但在跳跃时无法正确落地。我有以下代码: 要检查玩家是否想要跳跃,需要执行检查以查看是否按下了向上箭头 if(state.IsKeyDown(Keys.Up) && hasJumped == false) { jumping = true; } 完成按键检查后,将检查

我目前正在使用Monogame开发2d平台。我可以画一个精灵,我可以画一个角色和关卡,我可以移动角色并跳跃,但是当我跳跃时,我的角色“漂浮”在关卡上方而不是降落在上面。左右碰撞工作正常,角色在应该停止时停止,但在跳跃时无法正确落地。我有以下代码:

要检查玩家是否想要跳跃,需要执行检查以查看是否按下了向上箭头

if(state.IsKeyDown(Keys.Up) && hasJumped == false)
{
    jumping = true;
}
完成按键检查后,将检查
跳跃
变量是否为真

if (jumping == true)
{
    jump();
} else if (falling == true && topOfBlock == false)
{
    fall();
}
else
{
    hasJumped = false;
    verticalMovement = 14;
}
基本上,
jumping
检查是否要跳转,
falling
检查角色是否正在跳转,
topOfBlock
检查角色是否在块的顶部,
hasshopped
检查当前是否正在跳转(因此不可能进行双跳转)而
垂直移动
是字符每勾选跳/落的像素量

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++;
}
topWall = new Rectangle((int)position.X, (int)position.Y - size, size, 1);
我认为,代码本身就说明了问题。基本上,如果角色不再向上移动,
fall
设置为
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;
    }       
}
position.X
position.Y
是X和Y位置,
size
是块的宽度和高度(都是30,因为它是正方形),1是使其仅高1像素

正如我所说,问题是角色在跳跃后会浮动。起始y位置为402像素(第一个块的
topWall.y
为420,意味着游戏加载时角色站在块的顶部),跳跃后应返回402。然而;跳一次后,它会跳到374,然后是373,然后是387386,…,374373,再跳回到387,依此类推。我不知道是什么引起了这个问题。我尝试过多种方法,比如修补块和角色的碰撞矩形,但似乎没有任何效果。当我从
topWall=new Rectangle()
中的
-size
位置.Y-size中删除
-size
(我认为这是问题所在)时,字符会穿过块,因此也无法修复它

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

你说

“循环结束后,它会检查topCol是否为真。如果为真,它会将hero.topOfBlock显示为真,这意味着角色不应该摔倒。”

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

你说呢

“循环结束后,它会检查topCol是否为真。如果为真,它会将hero.topOfBlock显示为真,这意味着角色不应该摔倒。”


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

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