【问题标题】:Collision detection by color按颜色进行碰撞检测
【发布时间】:2011-05-13 00:52:35
【问题描述】:

我目前正在用 Java 实现一个小游戏,允许玩家在赛道上驾驶汽车。

如果汽车偏离轨道,我希望它减速。但是,由于轨道是圆形的,使用矩形似乎不是最好的主意。

我突然想到的一个想法是使用汽车所在像素的颜色。如果汽车的所有像素碰巧在地图为绿色的位置,而不是在赛道上为黑色的位置,那么我会减慢汽车的速度。

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

【问题讨论】:

标签: java 2d


【解决方案1】:

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

【讨论】:

  • 您能否介绍一下 contains() 方法的实现方式?
  • @Dhaivat Pandya:这是最好的部分——所有实现类都已经有了具体的方法。这是使用Polygonexample
  • @Dhaivat Pandya:谢谢!我对其他两个答案投了赞成票,因为它们代表了在某些情况下有用的方法。
  • 好的,所以我的程序的规范发生了一些变化。汽车必须避开矩形障碍物。我以为我可以测试障碍物和汽车之间的交叉点,但由于汽车使用 AffineTransformation 转弯,它不再继承自形状类。我将如何测试与 AffineTransformation 的交集?
  • 使用createTransformedShape(),如引用的三个示例中的每一个所示。
【解决方案2】:

您可以进行类似于位块传输的碰撞检测。为汽车制作“蒙版”,1 代表前景,0 代表透明或外部像素。将蒙版与汽车所在的背景进行“与”运算,得到汽车所在的背景像素。当然,这个“与”操作不是对位进行操作,而是对背景的像素值进行操作。搜索 Raster-Ops 或 PixBlt 可能会找到一些解决方案。

【讨论】:

  • 这可以用getRaster() 完成,但它的扩展性很差。
  • 这是有道理的。我该如何制作这个面具?我应该使用什么数据结构?
  • 将整个屏幕作为一个多维数组对我来说似乎是个坏主意,因为在高分辨率下每个操作都会非常慢。
【解决方案3】:

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

【讨论】:

  • 这不是一个好主意。这就像试图通过制作机械臂来让程序写入文件一样。你可以在后端做。
  • 您自己的后端?你会如何在 Java 中做到这一点?我没有看到类比;低级访问是低级访问。不过,我并不是说该算法是个好主意。
【解决方案4】:

我最喜欢垃圾上帝的回答,但是,如果您不使用 Shape 类,那么您可能会遇到问题。

所以,这是我的答案。

首先,您可以在屏幕上绘制的任何内容都有一定的粒度,因此请充分利用这一点。您没有提供很多关于如何在屏幕上显示的详细信息,但是,这就是我的建议。

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

如果您出于某种原因不喜欢数学,我建议您跟踪一个变量,该变量包含最近的泥土距离有多近,当它变为零时,您可以让汽车减速。

或者(最坏的解决方案),您可以比较屏幕上显示的两个部分(汽车和泥土),然后检查汽车是否在泥土上。这就是 Shape.contains() 方法的作用,但是,它是由专业人士编写的,您的版本可能会慢得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多