Android 2d游戏碰撞检测
Android 2d game collision detection
我在 android 工作室使用 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 physics 吗?即使有这么多物体碰撞在一起,游戏也不会面临延迟问题,这对碰撞检测有什么作用?
请帮助我提供更多细节,因为我想知道游戏引擎是如何工作的,所以决定制作一个简单的游戏,而不仅仅是制作和发布游戏(否则我可以使用现成的游戏引擎)。
提前致谢
在 3d 游戏中我使用 Colliders 所以检查是否有任何碰撞器(网格,盒子等)
给那个标签 objects.and 通过标签识别它们
示例:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
void OnCollisionEnter2D(Collision2D coll) {
if (coll.gameObject.tag == "Enemy")
coll.gameObject.SendMessage("collided", 10);
}
}
至于游戏引擎是如何做的,直接看源代码可能是最简单的,因为至少有一个版本的Unity可以做到——你可以找到Unity的源代码here。
在你的情况下,你可能会权衡你的应用程序增加的内存消耗,使碰撞检测基本上是恒定时间的,而不管圆圈的数量,正如@SagarGautam在他的评论中所建议的那样。
要实现此目的,您可以存储一个 boolean
的二维数组,指示所有地图像素,如果每个元素在圆圈内,则将其设置为 true
(根据您之前的代码) 或 false
否则。在 level/map 的加载阶段执行此操作应该没问题,因为现在在渲染期间您只需查找数组中的像素坐标并查看它是否在圆圈内。
我在 android 工作室使用 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 physics 吗?即使有这么多物体碰撞在一起,游戏也不会面临延迟问题,这对碰撞检测有什么作用?
请帮助我提供更多细节,因为我想知道游戏引擎是如何工作的,所以决定制作一个简单的游戏,而不仅仅是制作和发布游戏(否则我可以使用现成的游戏引擎)。
提前致谢
在 3d 游戏中我使用 Colliders 所以检查是否有任何碰撞器(网格,盒子等) 给那个标签 objects.and 通过标签识别它们 示例:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
void OnCollisionEnter2D(Collision2D coll) {
if (coll.gameObject.tag == "Enemy")
coll.gameObject.SendMessage("collided", 10);
}
}
至于游戏引擎是如何做的,直接看源代码可能是最简单的,因为至少有一个版本的Unity可以做到——你可以找到Unity的源代码here。
在你的情况下,你可能会权衡你的应用程序增加的内存消耗,使碰撞检测基本上是恒定时间的,而不管圆圈的数量,正如@SagarGautam在他的评论中所建议的那样。
要实现此目的,您可以存储一个 boolean
的二维数组,指示所有地图像素,如果每个元素在圆圈内,则将其设置为 true
(根据您之前的代码) 或 false
否则。在 level/map 的加载阶段执行此操作应该没问题,因为现在在渲染期间您只需查找数组中的像素坐标并查看它是否在圆圈内。