【问题标题】:Android 2d game collision detectionAndroid 2d 游戏碰撞检测
【发布时间】:2017-07-23 08:23:11
【问题描述】:

我在 android studio 中使用SurfaceView 开发了一个 2d 游戏, 它在碰撞的情况下并不复杂,只需要检查一个移动点和一些静态圆之间的碰撞,为了检测一个圆的碰撞,我只需检查if X of the point is between circle minX and maxX && point Y is between minY and maxY of circle

所以为了检查整个游戏中的碰撞,我重复检查每一帧中所有圆圈的上述代码。

例如,当我有 10 个圆圈时,游戏运行良好,但如果我添加 30 个圆圈,它的 FPS 会下降很多,我会面临很多延迟!

这个问题我该怎么办?我应该使用 Box 2d 物理吗?它对碰撞检测有什么作用,即使有这么多物体碰撞在一起,游戏也不会面临延迟问题?

请帮我提供更多细节,因为我想知道游戏引擎是如何工作的,并决定制作一个简单的引擎,而不仅仅是想制作和发布游戏(否则我可以使用现成的游戏引擎)。

提前致谢

【问题讨论】:

  • 所以你有圆形物体,但它们的碰撞框是矩形?
  • 是的,因为我检查了 if(circle.minX 时我得到了滞后
  • 你有什么样的地图?或者是什么类型的游戏?是横向卷轴还是类似的东西?
  • 不,它是一个简单的游戏,具有恒定的表面(地图),没有可用的滚动。你认为我的算法没有问题,我应该检查我游戏的其他部分吗?不是消耗在每帧中检查上述代码 30 圈吗? @AppPhil
  • @MehDi 您需要创建一个由圆点组成的二进制地图,其中 1 和其他点为零,然后很容易找到一个对象在圆的内部或外部。但是,我实际上并没有理解你的问题,你是想防止物体进入圆圈还是别的什么?

标签: java android collision-detection game-physics physics-engine


【解决方案1】:

至于游戏引擎是如何做到的,直接看他们的源代码可能是最简单的,因为至少有一个版本的Unity可以做到——你可以找到Unity的源代码here

在您的情况下,您可能会权衡应用程序增加的内存消耗,以使碰撞检测基本上保持恒定时间,而不管圆圈的数量是多少,正如 @SagarGautam 在他的评论中所建议的那样。

你可以做的是存储一个二维数组booleans 指示所有地图像素,如果每个元素在一个圆圈内(根据你之前的代码)设置为true,否则设置为false .在关卡/地图的加载阶段执行此操作应该没问题,因为现在在渲染期间,您只需查看数组中的像素坐标,看看它是否在一个圆圈内。

【讨论】:

  • 你知道你是完美的吗?!!:D 非常感谢!!你关于使用布尔映射的想法太完美了!!我稍后会实施它并查看结果并接受这个答案:) 感谢 Unity 引擎源的链接,但我似乎很难理解代码和工作流程(Idk 为什么!你喜欢我吗?)!我一直认为其他人使用一些代码库技巧来解决这些问题,这是我对编程一无所知的东西(我是真的吗?),这让我忘记了使用创造性的方式来解决像你这样的问题:)跨度>
  • 在这里你要感谢的不是我——@SagarGautam 的评论首先给了我这个想法。无论如何,在计算机科学中进行涉及时空权衡的事情是一种常见的技术,例如(朴素的)归并排序和动态规划。至于 Unity 的代码库,只需查找您需要的部分 - Ctrl+F 是您的朋友!
【解决方案2】:

在 3d 游戏中我使用碰撞器,所以检查是否有碰撞器(网格、盒子等) 给该对象打上标签。并通过标签识别它们 示例:

using UnityEngine;

using System.Collections;

public class ExampleClass : MonoBehaviour {

    void OnCollisionEnter2D(Collision2D coll) {
        if (coll.gameObject.tag == "Enemy")
            coll.gameObject.SendMessage("collided", 10);

    }
}

【讨论】:

  • 感谢您的回答,但请再次阅读我的问题,这不是我问的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多