如何在有限的区域内编码随机运动

时间:2011-07-30 10:33:21

标签: objective-c algorithm collision-detection game-physics

我有一个有限区域(屏幕),里面装满了一些移动物体(3-20个,所以它不像10.000 :)。那些物体应该以恒定的速度移动并进入随机方向。但是,它有一些限制:

  • 对象不应该离开该区域 - 所以如果它靠近边缘,它应该远离它
  • 物体不应该相互撞击 - 所以当一个物体靠近另一个物体时它应该移开(但不要太靠近不同物体)。

在下图中,我已经标记了在这种情况下允许的移动 - 例如,对象D不应该直接向上移动,因为它会将其带到“墙”。

allowed movement

我想要的是一种移动它们的方法(一个接一个)。有没有简单的方法来实现它,没有太多的计算?

该地区的物体密度相当低。

2 个答案:

答案 0 :(得分:2)

如果您拥有如此少量的对象,可以通过多种方式以编程方式强制执行所需的行为。但是,我会提出一些略有不同的建议。

如果你将整个事物作为物理模拟运行怎么办?例如,你可以建立一个没有重力,没有摩擦和完全弹性碰撞的Box2D世界。您可以对封闭区域进行建模,并使用比屏幕上对应区域大的对象填充它,这样屏幕上的版本就不会彼此太靠近(因为物理模拟中的基础对象会在之前发生碰撞并改变方向这可能发生),并为每个对象分配一个随机的初始位置和速度。

然后,您所要做的就是完成物理模拟,并将其当前状态映射到您的UI中。所有棘手的东西都是为你处理的,结果可能比你试图想出你自己的运动算法得到的结果更可信/更真实(或者如果你想让它看起来更随机,更不可信,你可以也只是定期对随机物体施加随机脉冲,以防止事情发生不可预测的变化。)

答案 1 :(得分:0)

您可以使用UIView的 hitTest:方法

UIView * touchingView = [self.superview hitTest:currentOrigin withEvent:nil];

在此方法中,您必须传递球的当前原点,在第二个参数中,您可以传递nil。

该方法将返回击球的视图。

如果有任何击球视图,你只需改变球的方向。

对于边框,如果球离开边界,只需改变球的方向,就可以设置球框的条件。