【发布时间】:2017-08-07 00:35:28
【问题描述】:
我正在用 clojurescript 编写游戏。
- 它有一个 2D 游戏区域,例如在 x 和 y 轴上从 0 到 10000。
- 在这个区域可以有不同大小的点。
- 如果玩家触摸了一个点,它将被删除。
- 最多可以有 2500 个点,甚至更多。
由于玩家可以移动每一帧,我必须每秒检查大约 2500 个点 60 次。
如果在哪里有这个数据结构:
(defonce state (atom {:food [{:center {:x 19 :y 51} :radius 1.78 :area 10}
{:center {:x 12 :y 34} :radius 1.78 :area 10}]}))
我想它会很慢而且效率很低。
在 C/C++ 中,我可能会创建一个 10000 x 10000 的数组,并将索引用作指向我的对象的指针的 x 和 y 值/键。这样我只需要弄清楚球员目前有多大,以及他的身体覆盖了比赛区域的哪些点。那么我只需要检查这些指标。
dot dots[10000][10000];
// if player where a square of 5 at the moment at x=123 y=456
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
isDot(dots[123+i][456+j]);
}
}
clojure 和它的数据结构有类似的方法吗?
我尝试了一个“点键”并尝试像这样检索它的值:
(def state (atom {:food { {:x 123 :y 456}{:radius 1.783 :area 9.9}
{:x 321 :y 654}{:radius 1.784 :area 10}}}))
(println (get-in @state [:food {:x 123 :y 456}]))
这样的事情可能吗? (这只会给我 nil 打印)
【问题讨论】:
-
当我需要加速碰撞检测时,我创建了一个空间网格。大约一天就实现了;他们很简单。当然,简单的答案是使用库。 Phaser 是一个非常棒的 JS 游戏引擎。
-
是的,我会尝试使用 answear 和空间网格。
标签: c++ performance data-structures clojurescript