Lua 快速查找数组中的对象

Lua 快速查找数组中的对象,lua,Lua,对于碰撞检测游戏,我考虑将环境中的对象在不同的块之间分割,以减少只需要检查相同(和相邻)块中的对象的数量。但是,我的一些对象(项目符号)将快速通过不同的块,因此我需要将这些对象从一个数组快速移动到另一个数组 我在考虑使用字典而不是数组,这样我就可以使用一个唯一的键作为索引来快速找到子弹并移动它,但我决定看看这里是否有人知道更好的方法 我计划在我的游戏中有几千个对象(包括子弹),这些对象本身只会是圆形和矩形,子弹被表示为线段。我假设“块”指的是游戏世界中的不同区域,它们或多或少相互独立地操作,以减

对于碰撞检测游戏,我考虑将环境中的对象在不同的块之间分割,以减少只需要检查相同(和相邻)块中的对象的数量。但是,我的一些对象(项目符号)将快速通过不同的块,因此我需要将这些对象从一个数组快速移动到另一个数组

我在考虑使用字典而不是数组,这样我就可以使用一个唯一的键作为索引来快速找到子弹并移动它,但我决定看看这里是否有人知道更好的方法

我计划在我的游戏中有几千个对象(包括子弹),这些对象本身只会是圆形和矩形,子弹被表示为线段。

我假设“块”指的是游戏世界中的不同区域,它们或多或少相互独立地操作,以减少开销。如果我错了,请纠正我

至于子弹在“块”之间的轨迹问题,我建议记录子弹的原点——也就是发射点——以及与物体碰撞的点。这可以通过某种依赖于游戏世界坐标系的碰撞检测来实现,不管发生什么。我建议创建一个
Bullet
类。这是我提出的概念的一个快速证明,它可以作为一个带有
require
的模块加载:

local Bullet = {__type = "Bullet"}

-- This function could take bullet information as parameters, such as its point of origin
-- and calibre.
function Bullet.new(start_pos_in, calibre_in)
    -- Record start and ending positions in this table, probably represented by some 
    -- (x, y) coordinate pairs, assuming your game is 2D. I just used a generic 
    -- placeholder here called 'Point'.
    local self = {
        calibre = calbibre_in,
        start_pos = start_pos_in
        end_pos = Point.new(0, 0)
    }
    local mt = {
        __metatable = "metatable",
        __newindex = function(t, k, v)
            local e = string.format("type Bullet has no member '%s'", k)
            return error(e, 2)
        end,
        __index = self
    }
    return setmetatable(self, mt)
end

return Bullet
使用上面的示例,可以像下面这样实例化
Bullet
对象:

-- Using .50 calibre as an example.
-- 'x' and 'y' represent the bullet's point of origin in the game world.
local bullet = Bullet.new(Point.new(x, y), ".50")
一旦
子弹
物体与游戏世界中的某物发生碰撞,您可以使用内部变量
end_pos
记录其碰撞点,计算其移动距离,等等。根据“块”系统的工作方式,您还可以记录项目符号的源“块”


作为旁注,我建议尝试为子弹粒子实现对象池,以节省开销。(如果您感兴趣,请参见以供参考。)

计算快速项目符号和对象之间的碰撞时,将项目符号表示为从其前一帧位置到其当前位置的线段。所以,你会发现碰撞与子弹速度无关。为了澄清,我想我理解你所说的“块”是什么意思,但在谈论Lua时要小心,因为它有一个特殊的含义。(看看你是否感兴趣。)