【发布时间】:2014-06-23 00:00:34
【问题描述】:
所以我正在尝试用 box2d 测试 cocos2d-x 中的碰撞。在我的游戏循环中,我正在移动精灵而不是使用 box2d 物理。我确实在 box2d 中设置了一个主体,以便我可以正确设置矩形,但是当它发生碰撞时,它会与另一个对象重叠。我希望它在碰撞的地方停下来。我知道它为什么这样做(这是因为它被告知移动 8 点并且碰撞发生在 4 点),但我不确定如何让它在碰撞的确切位置停止。如果我这样做:
float x = a->getPosition().x + (a->getContentSize().width / 2) + (b->getContentSize().width / 2);
b->setPositionX(x);
它可以工作,但你可以看到它在完成移动 8 点并向后移动 4 点后跳跃。我不确定我这样做是完全错误的还是什么,但我似乎无法让它在不跳跃的情况下停下来。也只是让您知道更新的样子:
Vec2 pos = _enemy->getPosition();
pos.x -= _scrollSpeed;
_enemy->setPosition(pos);
_scrollSpeed = 8 btw
非常感谢任何帮助。
【问题讨论】:
-
你没有问问题。老实说,我不明白基于描述和代码片段的问题,特别是如何不使用但仍在使用物理 - 何时、何地、如何以及为什么?
-
问题是如何让精灵在碰撞点与另一个精灵发生碰撞时停止。由于我在图层更新功能中移动精灵,它被设置为移动 8 点,但是碰撞发生在移动 4 点之后。所以当游戏停止时,精灵实际上是相互重叠的,但我希望它们停在它们碰撞的实际点。在第一个 sn-p 中,我在碰撞 BeginContact 函数中有它,它将它设置在碰撞点,但它从最初重叠的位置跳回来。我是不是走错路了?
-
我可以发布完整的代码以供查看,如果这样会更容易。我只是在学习如何做所有事情,所以无论如何它都不是真正的游戏。
-
“你可以看到它跳跃” - 在物体回到碰撞位置之前不渲染场景怎么样。
-
@iforce2d 是的,这基本上就是我想要做的,但我不确定该怎么做。我只是在学习游戏编程和 cocos2d 并且不确定如何去做。我在“tick”函数中移动对象,但来自 box2d 的碰撞在 BeginContact 方法上,因此它在碰撞时已经从 tick 函数更新。有没有办法告诉它停止渲染?