我正在尝试创建用于在Love2d框架中的简单游戏中管理对象和冲突的基础架构。所有对象都存储在表(objects:activeObjects
)中,然后objects:calculateCollisions()
函数中的循环遍历所有对象。每次迭代时,另一个嵌套循环检查该对象是否与同一个表中的任何其他对象重叠。在objects:calculateCollisions()
的末尾,理想情况下,每个对象都有一个表,其中包含对当前时间点重叠的所有对象的引用。但是,对象总是有空的碰撞表。
现在有两个测试对象:一个用鼠标移动,另一个一直停留在右上角。对于用户,两个对象在重叠时应同时消失,但如前所述,collidingObjects
表始终为空。
我有三个源文件:
main.lua
:
http://pastebin.com/xuGBSv2j
objects.lua
(编写大部分重要内容,可能出现问题):http://pastebin.com/sahB6GF6
customObjects.lua
(定义了两个测试对象的构造函数):
function objects:newCollidingObject(x, y)
local result = self:newActiveObject(x, y, 50, 50)
result.id = "collidingObject"
function result:collide(other)
if other.id == "collidingObject" then self.remove = true end
end
return result
end
function objects:newMovingObject(x, y)
local result = self:newCollidingObject(x, y)
function result:act()
self.x = love.mouse.getX()
self.y = love.mouse.getY()
end
return result
end
抱歉,我无法发布超过两个超链接。
编辑:经过一些调试后,我已将问题缩小到collidesWith(obj)
功能。它似乎总是返回假。
这是代码:
function result:collidesWith(obj)
if self.bottom < obj.top then return false end
if self.top > obj.bottom then return false end
if self.right < obj.left then return false end
if self.left > obj.right then return false end
return true
end
答案 0 :(得分:2)
通过一些不同的测试输入来查看纸上的逻辑。你会很快发现你的逻辑是荒谬的。你错过了一半的测试,你的一些比较是“指出错误的方式”等等。所以:
function result:collidesWith(obj)
if self.bottom <= obj.top and self.bottom >= obj.bottom then return true end
if self.top >= obj.bottom and self.top <= obj.top then return true end
if self.right >= obj.left and self.right <= obj.right then return false end
if self.left <= obj.right and self.left >= obj.left then return false end
return false
end
应该做的伎俩。