现在我正在用c ++制作一个乒乓球游戏,现在我已经制作了一个paddle
和ball
,它们都来自entity
,其中包含coordinates
以及实体的bounding box
(可以是圆形或多边形),我也实现了一个函数entity.isColliding(entity)
,它可以轻松地告知实体是否与任何两个实体发生冲突。
现在我想让球移动,当它与实体碰撞时,它将反转右速度坐标(x或y)。我想要制作一个函数canMove()
,它会移动并检查碰撞,如果有移回,但我不知道如何检查我是否需要反转x或y速度坐标我所知道的就是那里曾经或将要发生碰撞。
有什么建议吗?
答案 0 :(得分:0)
如果你有一个复杂的形状和一个碰撞你需要做什么,你必须找到碰撞点的切线。这有助于您计算反射角度。例如。如果你有矩形,你的切线是垂直的或水平的,并且反射角很容易计算:你已经如你所说的那样否定了你的一个速度坐标。如果你有圈子,它会变得复杂:) I.e.你需要一些sin
和cos
..你真的需要吗?
答案 1 :(得分:0)
我不知道你的canMove()
功能的速度有多快,但如果速度足够快,也许可以这样试试:
- 反转x坐标,如果有效,那就是那个
- 如果不起作用,则反转y坐标
- 如果这两个都不起作用,那么你处于特殊情况(例如角落) - 反向:D
答案 2 :(得分:0)
如果它是Pong克隆,当你碰撞桨时,总是反转水平速度,当你碰撞墙时,总是反转垂直。
要确定在球和桨碰撞时是否反转垂直速度,请查看球击中的半球。
你需要一种方法来找出碰撞点。
我建议你从方形球和矩形桨开始,就像原来一样,因为它使得碰撞计算更加容易。
我还建议您在开始使用更逼真的碰撞模型让自己陷入困境之前,先得到一些可以正常运行的东西。
改进有效的东西比改善未来可能有效的东西更有趣。
答案 3 :(得分:-1)
首先计算球击中球拍或击球时的速度。然后使用三角学,球的方向及其x和y坐标(yay trig!)计算出球将反弹的角度。根据该角度重新调整球速(提示:严重的触发量......可能)。值得注意的是它的所有三角函数,以及速度也适用(不是速度)。
我猜你试图像其他乒乓球游戏一样增加或减少球的速度?首先做以上事项然后担心根据碰撞角度改变速度。
如果您告诉我您使用的图形库,可能会有更简单的方法吗?
对于多边形,它会变得更难。最好用圆圈或方框开始简单然后重构你的代码。在寻找具有不同形状的碰撞检测时,有很多理论和方法。你需要更具体地了解你的"多边形"装置
希望这有帮助