Ram*_*ama 4 java 2d collision-detection memory-efficient
我正在按照教程编写一个用Java 编写的炸弹人(这是我的第一个游戏).本教程建议使用以下代码检测冲突.
for (int p=0; p<entities.size(); p++) {
for (int s=p+1; s<entities.size(); s++) {
Entity me = (Entity) entities.get(p);
Entity him = (Entity) entities.get(s);
if (me.collidesWith(him)) {
me.collidedWith(him);
him.collidedWith(me);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,实体是一个包含敌人和玩家的数组列表.因为我还想检测玩家与墙壁发生碰撞,我是否应该将每个墙壁或砖块放入实体arraylist中?如果是这样,这个算法效率不高吗?这些瓷砖不会与其他瓷砖碰撞,所以我想在不同的列表中管理游戏实体.你有什么建议?有没有更有效的算法呢?
注意:我已经阅读了与2D游戏中的碰撞有关的其他问题.非常感谢.
aro*_*oth 10
我建议阅读这篇关于幽灵运动和碰撞检测如何在PacMan中起作用的优秀文章.
然后我建议将你的炸弹人水平逻辑建模为一组瓷砖.每个图块代表您关卡中的一个离散位置,并且逻辑上不可能永远是"之间"图块或同时占据两个图块.每个磁贴都可以跟踪当前在其上的地形特征类型,以及它是否是玩家的有效目标磁贴(以及敌人,如果允许敌人穿越通常无法通过的地形,则可能对每个玩家都有不同的规则为了球员).
那么你不需要为世界上的每个对象都有一个碰撞检测算法.当敌人移动时,或者当用户试图移动他们的角色时,您所要做的就是检查与当前图块相邻的所有图块(如果允许对角线移动,则为4或8 max),查看每个图块是否表示有效的移动方向,如果不在有效方向,则阻止移动.
并回答你的问题,是的,在每个位置更新迭代世界上的每个对象将是非常低效的.
| 归档时间: |
|
| 查看次数: |
6418 次 |
| 最近记录: |