0

我正在尝试在我正在开发的应用程序中从物理引擎(addBody() 和 removeBody())中添加/删除对象。我正在开发的应用程序是模块化的,因此问题出在两个文件之一中。

对象文件 (TransmitterObject) 或主文件 (main):

这是两者的相关代码:

主程序.lua

local physics = require("physics")
physics.start()
physics.setGravity(0,0)
physics.setDrawMode( "debug" ) 


local TransmitterObject = require("TransmitterObject")

function updateGame(event)

    if(ITERATIONS % 100 == 0) then
        tran1:activate()    --create new physics object here    
    end

    ITERATIONS = ITERATIONS + 1
    --print(ITERATIONS)
end

Runtime:addEventListener("enterFrame", updateGame)

TransmitterObject.lua

function transmitter.new(props) --constructor
    Transmitter = 
    {
        x = props.x,
        y = props.y,
        receivers = props.receivers
    }

    return setmetatable( Transmitter, transmitter_mt )      
end

function transmitter:activate() 
    local group = math.random(1, #self.receivers)
    local receiver = math.random(1,#self.receivers[group])
    local x , y = self.receivers[group][receiver][1], self.receivers[group][receiver][2]
    local d = math.sqrt(math.pow((self.x-x),2) + math.pow((self.y-y),2))
    local dx = math.abs(self.x - x)
    local angle = math.deg(math.acos(dx/d))


    local beam = display.newRect(self.x,self.y, d, 10)
    beam:setReferencePoint(display.TopLeftReferencePoint)
    beam.rotation = 180 + angle
    beam:setFillColor(0,255,0)
    beam.alpha = 0

    local function add(event)
        physics.addBody(beam, "static")
    end

    local function delete(event)
        physics.removeBody(beam)
    end 

    transition.to( beam, { time=1000, alpha=1.0, onComplete=add } )
    transition.to( beam, { time=1000, delay=2500, alpha=0, onComplete=delete})  
end

现在让我试着更好地描述这个问题。基本上每 100 次 'enterFrame' 触发,我都会告诉发射器对象 (tran1) 调用它的函数 'activate',然后执行一些基本的数学运算来获取坐标。然后它使用计算的信息创建一个矩形(梁)并设置一些属性。这都是基本的东西。接下来,我告诉它在 1 秒内从不可见 (alpha = 0) 过渡到可见。何时调用将对象添加到物理引擎的函数“add”。下一行删除对象也是如此。

话虽如此,当我设置 Physics.setDrawMode("debug") 时,光束对象显示为静态物体,但不接受碰撞。有谁知道为什么上面的代码不接受光束对象的碰撞?

请记住,我还有其他可以在物理引擎中正常工作的对象。

4

1 回答 1

0

哇,我回复太晚了!
碰撞时,不支持修改实体。
我建议你创建一个新功能,

local function addBody ( event )
physics.addBody(ball, "static")
end

在你的碰撞事件中你必须添加这个,

timer.performWithDelay(500, addBody)

唯一可能导致一些问题的是延迟,但由于碰撞不会花费太多时间,所以应该没问题。
很抱歉发布这个 necroposting,
这只是为了帮助其他可能有这个问题的人,
Fannick

于 2014-01-24T15:03:06.240 回答