当前位置: 首页 > 知识库问答 >
问题:

2D C++碰撞检测几乎完美,但还不完全?

高山
2023-03-14

作为这个问题的前言,请注意,我不是问“修复我的代码”,而是问我将使用什么技术来修复这个问题。如果我的拼写不是很好,我也要道歉。

好吧,我有一个2D平台游戏,比较玩家的位置和所有的瓷砖(在一个循环中),解决了相应的冲突。这是主要游戏循环的结构:

  1. 检查所有碰撞(如果玩家发生碰撞,则启用跳跃)
  2. 获取输入并相应更改播放器速度
  3. 将重力添加到Y速度
  4. 对球员位置施加速度和摩擦力
  5. 绘制游戏
  6. 重复

问题1。当玩家在游戏中左右移动时,偶尔会失去所获得的所有速度,然后不得不重新积累速度。我想这是因为我的碰撞检测功能有时不能正常返回。下面是一个图像:

我希望这是清楚的,只有当移动到许多平地时,问题才真正变得明显。

这是我的碰撞检测函数,它应该接收两个“对象”,然后返回碰撞发生的第一个对象的方向,我认为当涉及到确定方向时会引起问题,因为这会引起问题,如上图所示:

//Find the collision vectors
        float vectorX = (a.Position.x + (a.Scale.x / 2)) - (b.Position.x + (b.Scale.x / 2));
        float vectorY = (a.Position.y + (a.Scale.y / 2)) - (b.Position.y + (b.Scale.y / 2));

        //Find the distance between the two objects
        float deltaWidth = (a.Scale.x / 2) + (b.Scale.x / 2);
        float deltaHeight = (a.Scale.y / 2) + (b.Scale.y / 2);

        //Stores the direction of collision
        Direction collisionDir = Direction::None;

        //Check if the two objects are intersecting on the x and y axis
        if (fabs(vectorX) < deltaWidth && fabs(vectorY) < deltaHeight)
        {
            //The direction of collision
            float directionX = deltaWidth - fabs(vectorX);
            float directionY = deltaHeight - fabs(vectorY);

            //Check for vertical collision
            if (directionX >= directionY)
            {
                //Check for collisions from the top
                if (vectorY > 0) 
                {
                    a.Velocity.y = 0;
                    a.Position.y += directionY;
                    collisionDir = Direction::Up;
                }

                //Collisions form the botttom
                else
                {
                    a.Velocity.y = 0;
                    a.Position.y -= directionY;
                    collisionDir = Direction::Down;
                }
            }

            else if (directionX < directionY / 2)
            {
                //Check for collisions from the left
                if (vectorX > 0 )
                {
                    a.Velocity.x = 0;
                    a.Position.x += directionX;
                    collisionDir = Direction::Left;
                }

                //Collisions form the right side
                else
                {
                    a.Velocity.x = 0;
                    a.Position.x -= directionX;
                    collisionDir = Direction::Right;
                }
            }
        }

        //Return the direction.
        return collisionDir;

谢谢你的帮助。我正在为Ludum Dare练习,因为我计划(可能)制作一个平台,如果我不能搞清楚碰撞检测,我不知道我的游戏会有多好。

不管怎样,谢谢-编码器卡梅隆

共有1个答案

茅华灿
2023-03-14

我建议的第一件事是让你自己成为一个Vector2D类,它保存你的x和y坐标,并重载一些操作符,允许两个Vector2D的加减法,以及乘除整数、浮点数和double。相信我,它会让你的生活变得更容易,因为他们可以掌握你所有的力量和碰撞点。

接下来,当我使用你当前使用的碰撞样式时,我总是发现它是:

A)更难调试。

建议将左上角和右下角作为矩形中心的向量,这使得缩放和碰撞检测更加容易,这也意味着您可以导出其他角,而不需要直接存储它们。

下面的代码示例可能有助于我试图解释的内容:

bool Intersects(Rectangle2D other)
{
    //Checks the right, left, bottom then top of the rectangle
    //against the other.
    if(other.topLeftCorner.x >= bottomRightCorner.x       //Checks the right
        || other.bottomRightCorner.x <= topLeftCorner.x   //Checks the left
        || other.topLeftCorner.y >= bottomRightCorner.y   //Checks the bottom
        || other.bottomRightCorner.y <= topLeftCorner.y)  //Checks the top
        return false;
    else
        return true;
}

您可以很容易地操纵这段代码来给出碰撞的方向。希望这有帮助。

 类似资料:
  • 问题内容: 好的,我正在研究Android上的游戏。我需要实现像素完美碰撞检测。我已经在每个图像周围设置了边界框,每个边界框都进行了转换以匹配图像的当前旋转。一切都很好。我还将每个位图的像素数据存储在数组中。有人可以帮我找出检测像素是否重叠的最有效方法吗?在此先感谢您的帮助! 问题答案: 基本思想是为每个对象创建一个位掩码,您可以在每个像素中指示该对象是否实际存在。然后,比较两个对象的位掩码的每个

  • 我试图在Cocos2d-x中移植像素完美冲突检测,原始版本是为Cocos2D制作的,可以在这里找到:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/ 这是我的Cocos2d-x版本代码 如果我将“pp”参数发送为false,则我的代码工作正常。也就是说

  • 我需要在iPad精灵游戏中生成8个随机精灵对象。这些对象相当大,并且大小不同。它们不应该叠加。如果场景中生成的对象叠加,它将被删除(可选地,它会删除底层对象)。我一直在为Sprite Kit寻找一个像素完美的冲突检测框架或帮助类。到目前为止,我还没有找到教程或类似的东西。大多数人使用普通的冲突检测,这没有任何帮助,因为我的对象很大。我测试了标准方法,但它创建了矩形,使我的情况下的精灵区域更大。这是

  • 问题内容: 我找到了像素完美碰撞检查的代码,并在我的代码中使用了它: 它运行完美,从来没有任何问题。直到我使用以下代码将图像设置为Config_Alpha_8为止(由于ram问题): 为什么什么都不会发生,它确实被CollisioDetected装入了,我已经检查了日志!但是它不会检测到冲突。有人可以使用config_alpha_8提供工作功能来检查位图的像素完美冲突吗? 问题答案: 在具有ALP

  • 我试图让我的游戏中的碰撞完全完美。我测试的是,如果你和玩家撞墙,你就会停下来。我只实现了当玩家撞墙左侧时(当墙在玩家右侧时)的碰撞代码。这是代码。 注意:如果我走得很慢,它会在我想要停止的地方停止玩家,但是走得很快,它不会按照我想要的方式进行碰撞 本质上,代码指出如果墙在右边,它将检查玩家矩形的右下角,减去墙的左下角,并检查两者之间的距离是否0.001. 0.001几乎是一个不明显的距离,因此我使

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect