【问题标题】:Some collision detection advice一些碰撞检测建议
【发布时间】:2013-12-06 00:35:06
【问题描述】:
我正在开发一个基于图块的平台游戏,该游戏当前使用边界框和重叠检查来进行碰撞检测。我觉得这种方法不灵活。我希望根据瓷砖的类型有不同的碰撞响应。
我的新想法是使用围绕我的播放器对象的 9 个点,并检查其中哪些点在图块的范围内。每个角落一个点,每边一个点,中心一个点。每种瓷砖类型将使用一组不同的碰撞处理规则。
但是,每种瓷砖类型都必须使用一组复杂的条件语句来进行碰撞测试——也许过于复杂。有什么指导吗?
【问题讨论】:
标签:
java
collision-detection
game-engine
tile
【解决方案1】:
这听起来像是策略模式的一个案例:http://en.wikipedia.org/wiki/Strategy_pattern
定义一个“进程冲突”的接口,然后为不同的冲突规则定义该接口的多个实现。
对于每个图块,您只需 setCollisionStrategy(MyRuleHere)。
要检查碰撞,您只需识别瓷砖然后
if (tile.getCollisionStrategy.collide(player)) {
// Collision
}
collide 方法甚至可以返回不同类型碰撞的枚举 - 或者返回更复杂的对象 - 甚至处理碰撞本身并在播放器中进行更改。那里的正确方法取决于您的整体架构。
【解决方案2】:
准确的碰撞检测通常会对性能产生巨大影响,因此仅仅提高准确度对游戏来说是行不通的。
一个非常好的方法是为每个图块链式碰撞检测策略。
诸如边界框检查之类的粗略策略可以非常快速地执行,并且已经可以排除肯定没有碰撞的情况(无论如何这是最常见的情况)。
策略越精细,涉及的计算就越多,但目标还是要快速检测某些碰撞/非碰撞情况并避免计算时间。
这个例子展示了一些常见的策略,你可以链接来获得快速准确的碰撞检测:
- 边界框(最快)
- 形状(多边形、圆形、贝塞尔曲线...)
- Alpha 通道(最慢、最准确)