通过颜色进行碰撞检测

时间:2011-05-13 00:52:36

标签: java 2d

我目前正在实施一个小游戏,允许玩家在赛道上开车。

如果汽车偏离赛道,我希望赛车减速。但是,由于轨道是圆形的,因此使用矩形似乎不是最佳选择。

突然出现在我脑海中的一个想法是使用汽车所在像素的颜色。如果汽车的所有像素恰好是地图为绿色的地方,而不是轨道的黑色,那么我就会放慢车速。

这是一个好方法吗?如果是这样,我该怎么做呢?搜索刚刚产生了与碰撞检测相同的矩形交叉方法。

4 个答案:

答案 0 :(得分:3)

如果您的汽车和赛道可以使用实现Shape界面的类来绘制,那么其中一种contains()方法可以解决问题。有一个缩放和旋转示例here以及一个更精细的示例here

答案 1 :(得分:1)

你可以做碰撞检测有点像bit-blit'ing。制作汽车的“面具”,前景为1,透明或外部像素为0。 '和'使用汽车所在背景的面具会产生汽车所在的背景像素。当然,这种'AND'操作不是对位进行操作,而是对背景的像素值进行操作。搜索Raster-Ops或PixBlt可能会导致一些解决方案。

答案 2 :(得分:1)

这些都是很好的答案。如果你想更多地了解颜色检测的想法,请查看Java API中的Robot类;它有很多很酷的低级功能,比如获取屏幕上某个点的颜色值(px,px),独立于用户移动光标等等。

答案 3 :(得分:0)

我最喜欢trashgod的回答,但是,如果你没有使用Shape类,那么你可能会遇到问题。

所以,这是我的答案。

首先,您可以在屏幕上绘制的任何内容都具有一定的粒度,因此请充分利用它。你没有提供很多关于你如何对屏幕进行调整的细节,但是,这就是我的建议。

使用Bezier Curves。由于它们是数学定义的(并且绘制非常简单),因此您可以轻松地选择Bezier曲线上的100个点并检查您的汽车边缘是否在Bezier曲线内。这可能是最准确的解决方案。

如果由于某种原因你不喜欢数学,我会建议跟踪一个变量,它包含最近的污垢块的接近程度,当它变为零时,你可以放慢车速。

或者(最糟糕的解决方案),您可以比较屏幕上显示的两个补丁(汽车和污垢),并检查汽车是否在污垢上。这就是Shape.contains()方法所做的,但它是由专业人士编写的,你的版本可能会慢得多。