(C#XNA)字符仅在一个方向上穿过对象

时间:2017-09-04 15:53:36

标签: c# xna

我用瓷砖和玩家创建了一个小游戏,我正试图在碰撞检测中编程。所以,当角色向左('A')工作时我设法发生碰撞,但是当它向右('D')时它不起作用。这是我的代码:

public bool ColX(Texture2D sprite, Vector2 pos, float speed)
    {
        float PosLeftX = pos.X;
        float PosUpY = pos.Y;
        float PosRightX = pos.X + sprite.Width;
        float PosDownY = pos.Y + sprite.Height;
        float DestX = pos.X + speed;
        Vector2 tileTopLeft = GetTile(PosLeftX, PosUpY); //using PosLeftX and PosLeftY to set top left tile to a variable
        Vector2 tileBotLeft = GetTile(PosLeftX, PosDownY);
        Vector2 tileTopRight = GetTile(PosRightX, PosUpY);
        Vector2 tileBotRight = GetTile(PosRightX, PosDownY);
        Vector2 tileDestUp = GetTile(DestX, PosUpY);
        Vector2 tileDestDown = GetTile(DestX, PosDownY);

        if(tileTopRight.X < tileDestUp.X)
        {
            float startX = tileTopRight.X;
            float finishX = tileDestUp.X;
            float startY = tileTopRight.Y;
            float finishY = tileBotRight.Y;

            for (int l = (int)startX; l <= finishX; l++)
            {
                for (int i = (int)startY; i <= finishY; i++)
                {
                    if (tileList[l, i] != null)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        else if (tileTopLeft.X > tileDestDown.X)
        {
            float startX = tileDestUp.X;
            float finishX = tileTopLeft.X;
            float startY = tileDestUp.Y;
            float finishY = tileDestDown.Y;

            for (int l = (int)startX; l <= finishX; l++)
            {
                for (int i = (int)startY; i <= finishY; i++)
                {
                    if (tileList[l, i] != null)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
        else
        {
            return false;
        }
    }

在按下'A'时,速度将是一个负参数,使目标图块位于播放器的左侧,并且它将检查从目标图块到玩家左下图块区域的矩形中的每个图块。如果有一个图块,则移动被取消,并且它可以工作。然而,同样的事情不适用于'D'键,尽管我认为'A'的相同代码适用于'D',只需稍加修改。

1 个答案:

答案 0 :(得分:0)

我知道我已经整整一个月了,但这个家伙在游戏编程方面给了我太多的帮助。 Click here打开一个链接,在那里他解释了在2D平台游戏中进行碰撞的“正确”方法。他从另一个角度解释了碰撞。我不会发布任何代码只是因为我觉得你会发现自己做的更有趣。

它的主旨是,如果你在物体撞到墙壁时检查碰撞,那么做任何事都为时已晚。对象很可能是在墙内绘制的。您需要检查对象的下一个位置(通过将其X和Y速度添加到其位置),如果对象正在撞击墙壁,则将对象移动到它旁边。通过这种方式,您将永远不会遇到墙内物体。此外,您首先计算X / Y移动,速度,加速度和碰撞,然后对另一个轴执行相同操作。

这是一种答案。我没有给你代码,但我告诉你在哪里可以找到你的答案。再说一遍,我没有提供代码,因为我认为你自己编写一些有趣的编码。我认为,如果情况并非如此,那么你现在就在Unity论坛上,而不是XNA。