作为这个问题的前言,请注意,我不是问“修复我的代码”,而是问我将使用什么技术来修复这个问题。如果我的拼写不是很好,我也要道歉。
好吧,我有一个2D平台游戏,比较玩家的位置和所有的瓷砖(在一个循环中),解决了相应的冲突。这是主要游戏循环的结构:
问题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练习,因为我计划(可能)制作一个平台,如果我不能搞清楚碰撞检测,我不知道我的游戏会有多好。
不管怎样,谢谢-编码器卡梅隆
我建议的第一件事是让你自己成为一个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