(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",速度将是一个负参数,将目的地瓷砖放在玩家的左侧,它将检查从目标瓷砖到播放器底部左瓷砖区域的A矩形中的每个瓷砖是否。如果有瓷砖,则该动作将被取消,并且可以正常工作。但是,同一件事对" D"密钥不起作用,尽管我假设" A"的代码适用于" D",并进行较小的修改。

我知道我整整一个月迟到了,但是这个家伙在游戏编程中给我带来了很多帮助。单击此处打开一个链接,他在其中解释了在2D平台器中进行碰撞的"正确"方法。他从另一个角度解释了碰撞。我不会发布任何代码,因为我认为您会发现自己更有趣。

它的JIST是,如果您在物体撞到墙壁时检查碰撞,那么做任何事情就为时已晚。物体很可能会在墙内画。您需要检查对象的下一个位置(通过将其X和Y速度添加到其位置),如果对象撞到墙壁,则将对象移到其旁边。这样,您将永远不会有对象的情况。另外,您首先计算X/Y运动,速度,加速度和碰撞,然后对其他轴进行相同的操作。

这是一种答案。我没有给您代码,但是我告诉过您在哪里可以找到答案。同样,我没有提供代码,因为我认为您会自己编码所有内容。我认为,如果不是这样,您现在将在Unity论坛上,而不是XNA。

最新更新