Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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#与SFML博弈交叉_C#_Sfml_2d Games_Sfml.net - Fatal编程技术网

C#与SFML博弈交叉

C#与SFML博弈交叉,c#,sfml,2d-games,sfml.net,C#,Sfml,2d Games,Sfml.net,在2D platformer游戏(如PacMan)中,我的MoveEntity()方法有问题。当玩家在我想要的交叉点路径上时: e.IsAtIntersection = true; 然后调用UpdateDirection() 但他并没有停下来,而是穿过小径,不管是有墙还是空小径。程序从未到达上述行。成员保持为false。也许有可能用一种更简单的方式写,或者我犯了一个简单的错误。以下是完整的方法: private void MoveEntity(Entity e) { int angle

在2D platformer游戏(如PacMan)中,我的
MoveEntity()
方法有问题。当玩家在我想要的交叉点路径上时:

e.IsAtIntersection = true;
然后调用
UpdateDirection()

但他并没有停下来,而是穿过小径,不管是有墙还是空小径。程序从未到达上述行。成员保持为
false
。也许有可能用一种更简单的方式写,或者我犯了一个简单的错误。以下是完整的方法:

private void MoveEntity(Entity e)
{
    int angle = 0;

    if (e.currentDirection == Direction.RIGHT) angle = 0;
    else if (e.currentDirection == Direction.DOWN) angle = 90;
    else if (e.currentDirection == Direction.LEFT) angle = 180;
    else if (e.currentDirection == Direction.UP) angle = 270;

    var scalex = Math.Round(Math.Cos(angle * (Math.PI / 180.0)));
    var scaley = Math.Round(Math.Sin(angle * (Math.PI / 180.0)));

    var velocityx = (float)(e.Speed * scalex);
    var velocityy = (float)(e.Speed * scaley);

    Sprite sp = sprites[e.Name];
    Vector2f v = new Vector2f(sp.Position.X + velocityx, sp.Position.Y + velocityy);
    sp.Position = v;

    var eCenterX = sp.Position.X + sp.TextureRect.Width / 2;
    var eCenterY = sp.Position.Y + sp.TextureRect.Height / 2;

    var tileY = Math.Floor((eCenterY) / TILEHEIGHT);
    var tileX = Math.Floor((eCenterX) / TILEWIDTH);

    var tileXpos = TILEWIDTH * Math.Floor(tileX + 1);
    var tileYpos = TILEHEIGHT * Math.Floor(tileY + 1);

    e.X = (int)tileY;
    e.Y = (int)tileX;

    if (eCenterX == tileXpos && eCenterY == tileYpos)
        e.IsAtIntersection = true;
    else
        e.IsAtIntersection = false;
}

e.X
e.Y
的浮点加法不太可能完全达到目标值。您应该检查实体是否跨相应的行移动:

例如,对于向右运动,类似这样的情况:

if(e.currentDirection == Direction.RIGHT 
   && eCenterX - velocityx< tileXpos && eCenterX >= eCenterX)
    e.IsAtIntersection = true;

您还可以沿y坐标移动它,以补偿沿x坐标的向后移动。

带有浮点的==运算符检查是否完全相等。通常,即使是经过非常相似操作的浮动也仍然不相等。在比较浮动上的相等时,最佳做法是执行以下操作:

if(Math.Abs(floatA-floatB) <= someSmallFloat)

if(Math.Abs(floatA floatB)这是我编辑的工作代码:

        private void MoveEntity(Entity e)
    {
        int angle = 0;

        if (e.currentDirection == Direction.RIGHT) angle = 0;
        else if (e.currentDirection == Direction.DOWN) angle = 90;
        else if (e.currentDirection == Direction.LEFT) angle = 180;
        else if (e.currentDirection == Direction.UP) angle = 270;

        var scalex = Math.Round(Math.Cos(angle * (Math.PI / 180.0)));
        var scaley = Math.Round(Math.Sin(angle * (Math.PI / 180.0)));

        var velocityx = (float)(e.Speed * scalex);
        var velocityy = (float)(e.Speed * scaley);

        Sprite sp = sprites[e.Name];
        Vector2f v = new Vector2f(sp.Position.X + velocityx, sp.Position.Y + velocityy);
        sp.Position = v;

        var tileY = (int)sp.Position.Y / 60;
        var tileX = (int)sp.Position.X / 60;

        var tileXpos = tileX * 60;
        var tileYpos = tileY * 60;

        e.X = (int)tileY;
        e.Y = (int)tileX;

        if (sp.Position.X == tileXpos && sp.Position.Y == tileYpos)
            e.IsAtIntersection = true;
        else
            e.IsAtIntersection = false;
    }
        private void MoveEntity(Entity e)
    {
        int angle = 0;

        if (e.currentDirection == Direction.RIGHT) angle = 0;
        else if (e.currentDirection == Direction.DOWN) angle = 90;
        else if (e.currentDirection == Direction.LEFT) angle = 180;
        else if (e.currentDirection == Direction.UP) angle = 270;

        var scalex = Math.Round(Math.Cos(angle * (Math.PI / 180.0)));
        var scaley = Math.Round(Math.Sin(angle * (Math.PI / 180.0)));

        var velocityx = (float)(e.Speed * scalex);
        var velocityy = (float)(e.Speed * scaley);

        Sprite sp = sprites[e.Name];
        Vector2f v = new Vector2f(sp.Position.X + velocityx, sp.Position.Y + velocityy);
        sp.Position = v;

        var tileY = (int)sp.Position.Y / 60;
        var tileX = (int)sp.Position.X / 60;

        var tileXpos = tileX * 60;
        var tileYpos = tileY * 60;

        e.X = (int)tileY;
        e.Y = (int)tileX;

        if (sp.Position.X == tileXpos && sp.Position.Y == tileYpos)
            e.IsAtIntersection = true;
        else
            e.IsAtIntersection = false;
    }