Cocos2d:计算子弹与方块碰撞时的弹跳

发布于 2024-12-02 01:31:43 字数 257 浏览 2 评论 0原文

我有一颗子弹可以撞到木块上弹跳。我想知道子弹是在x方向还是y方向弹跳。正如您在图像中看到的那样,只有几个像素的差异就可以让子弹向另一个方向弹跳。 (仅供参考:是的,子弹在我的游戏中可以弹跳;-))

https://i.sstatic.net/5EmGz.png

有谁知道这个问题的简单而可靠的解决方案吗?

非常感谢你的帮助

菲利克斯

I have a bullet that can bounce against a block. I want to find out whether the bullet bounces in x or y direction. Like you can see on the image, only a few pixels difference let the bullet bounce it the other direction. (FYI: yes, bullets can bounce in my game ;-))

https://i.sstatic.net/5EmGz.png

Does anyone know a simple and solid solution for this problem?

Thanks a lot for your help

Felix

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

弥枳 2024-12-09 01:31:43

为了实现弹跳,您需要做两件事:

  1. 碰撞检测
  2. 更新位置和碰撞检测。子弹速度

第1步:

如果你想正确检测碰撞,你必须计算矩形边框与连接当前子弹位置和计算出的下一个子弹位置的线的交点(就像有没有障碍)。如果有多个交点,则取第一个碰到边界的交点。在 Box2D 中,您可以使用 raycast 来获取交集。

这里的答案将帮助您确定是否存在交叉点: 检测线线段与正方形相交

现在您需要知道碰撞发生在矩形的哪一侧。
以下方法假设您已经知道存在碰撞,但不知道碰撞位置:

碰撞检测

当子弹的位置为在区域 B、D、E 或 G 中,哪个边界将被击中是显而易见的。

在任何其他情况下都不太清楚。让我解释一下区域 H:

  1. 计算向量 h(从子弹的位置到矩形的右下角)
  2. 计算速度向量 v 的角度 a(使用切线)
  3. 计算 h 的角度 b(使用切线)
  4. 比较 a和b:如果a<; b 碰撞发生在右侧,如果 a > b 碰撞位于底侧

对于区域 A、C 或 F,请进行类似操作。

步骤 2:

如果有交点,请将子弹的新位置设置为交点(如果您无法获取交点,就好像没有障碍物一样更新位置,但这会有点不准确)。
如果碰撞发生在底部或顶部,则反转速度的 y 分量。
如果碰撞发生在右侧或左侧,则反转速度的 x 分量。

祝你好运!

In order to achieve the bouncing you need to make two things:

  1. Collision detection
  2. update position & velocity of bullet

Step 1:

If you want to detect collisions correctly you have to calculate the intersection of the rectangle border with a line that connects the current bullet position with the calculated next bullet position (as if there were no obstacle). If there are multiple intersection points, take the first one that hits the border. In Box2D you would use a raycast to get the intersection.

That answer here will help you to determine if there are intersections: Detect if line segment intersects square

Now you need to know at which side of the rectangle the collision occured.
The following approach assumes you already know there is a collision, but don't know where:

Collision detection

When the bullet's position is in region B, D, E or G its obvious which border will be hit.

In any other case it's not so clear. Let me explain it for region H:

  1. compute the vector h (from bullet's position to lower right corner of rectangle)
  2. compute the angle a out of the velocity vector v (using tangens)
  3. compute the angle b out of h (using tangens)
  4. compare a and b: if a < b collision is at the right side, if a > b collision is at the bottom side

Proceed similarly in case of region A, C or F.

Step 2:

If you have the intersection point, set the new position of the bullet to the intersection point (if you were not able to get the intersection point, update the position as if there were no obstacle, but that would be a bit inaccurate).
If the collision occured on the bottom or top, invert the y-component of the velocity.
If the collision occured on the right or left, invert the x-component of the velocity.

Good luck!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文