Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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#XNA碰撞检测_C#_Xna_Collision Detection - Fatal编程技术网

C#XNA碰撞检测

C#XNA碰撞检测,c#,xna,collision-detection,C#,Xna,Collision Detection,我很难让我的碰撞检测算法正常工作。我正在从一个包含0和1的.txt文件中读取数据(0是空白,1无法遍历)。我的算法有时会捕捉到,但有时不会,最终也不起作用。我当前的算法发布在下面,sep是一个分隔值,以防止我的精神重叠 private void collisionDetect() { float diffxleft, diffxright, diffytop, diffybottom; float diffx, diffy; hit = false; forea

我很难让我的碰撞检测算法正常工作。我正在从一个包含0和1的.txt文件中读取数据(0是空白,1无法遍历)。我的算法有时会捕捉到,但有时不会,最终也不起作用。我当前的算法发布在下面,sep是一个分隔值,以防止我的精神重叠

private void collisionDetect()
{
    float diffxleft, diffxright, diffytop, diffybottom;
    float diffx, diffy;

    hit = false;
    foreach (Block b in blocks)
    {
        if (hit)
            break;
        if (inside(charPos, sep, b))
        {
            hit = true;
            diffxleft = Math.Abs(charPos.X + sep - b.pos.X);
            diffxright = Math.Abs(charPos.X - sep - (b.pos.X + b.rect.Width));
            diffytop = Math.Abs(charPos.Y + sep - b.pos.Y);
            diffybottom = Math.Abs(charPos.Y - sep - (b.pos.Y + b.rect.Height));
            diffx = Math.Min(diffxleft, diffxright);
            diffy = Math.Min(diffytop, diffybottom);
            if (diffx < diffy)
            {
                charVel.X = 0;
                if (diffxleft < diffxright)
                    charPos.X = b.pos.X - sep;
                else
                    charPos.X = b.pos.X + b.rect.Width + sep;
            }
            else
            {
                charVel.Y = 0;
                if (diffytop < diffybottom)
                    charPos.Y = b.pos.Y - sep;
                else
                    charPos.Y = b.pos.Y + b.rect.Height + sep;
            }
        }
    }

    foreach (Block b in blocks)
    {
        b.disp.X = b.pos.X + 10 - bkgdisplay.X;
        b.disp.Y = 470 - b.pos.Y;
    }
    charPosDisp.X = charPos.X - bkgdisplay.X;
    charPosDisp.Y = 480 - charPos.Y;
}
private void collisionDetect()
{
浮动diffxleft、diffxright、diffytop、diffybottom;
浮动扩散,扩散;
命中=错误;
foreach(块中的块b)
{
如果(命中)
打破
if(内部(charPos、sep、b))
{
命中=真;
diffxleft=数学绝对值(charPos.X+sep-b.pos.X);
diffxright=数学绝对值(charPos.X-sep-(b.pos.X+b.rect.Width));
diffytop=数学绝对值(charPos.Y+sep-b.pos.Y);
diffybottom=数学绝对值(charPos.Y-sep-(b.pos.Y+b.rect.Height));
diffx=数学最小值(diffxleft,diffxright);
diffy=Math.Min(diffytop,diffybottom);
if(diffx

救命啊

我会稍微改变处理冲突的方式,使其更易于阅读和实现

假设对于每个块(或平铺),0或1值表示该块是否可碰撞。然后,可以在块位置和精灵位置之间使用“相交”方法,以查看它们当前是否相交。如果它们相交,且平铺的布尔值设置为1,则会发生碰撞,然后您可以处理碰撞,即停止精灵移动,将其反弹等。如果值为0,则精灵可以移动到当前块位置上

这很容易使用以下伪代码实现

步骤1:读入块的值,并在 类来说明它是否可碰撞,即从字符串解析值,如果值为 0则bool=false,否则bool=true

步骤2:在block类中创建一个方法以返回可碰撞的成员变量 这会像
bool is_collidable()const{return collide;}

步骤3:使用
矩形。在精灵矩形和块之间相交

矩形

第4步:在查看块和精灵之间是否有交点后,然后进行测试 块成员变量,以查看其是否为真


步骤5:如果该值为true,则我们不能跳过该磁贴,否则我们可以。

您能否更清楚地了解哪些不起作用?它只是有时检测不到X碰撞,还是检测不到Y碰撞,或者两者兼而有之?或者它检测到了碰撞,但没有阻止玩家在“空间”中移动?从最好的情况来看,它有时也检测不到碰撞,而其他时候,它会在没有碰撞的地方创建墙。我的玩家可以穿过一些他们不应该穿过的墙,还有一些他被没有画出来的墙挡住了。我还建议使用矩形。相交,因为它使碰撞处理更容易。