OOP中的物理碰撞检测,具有一个对象的两次迭代

时间:2015-05-09 01:00:42

标签: oop lua corona

我在试图找出游戏机制时遇到了理论上的写作障碍。基本上,我希望有两个圆圈一直长到它们碰撞,当它们碰撞时它们开始收缩,直到它们的半径为0,它们再次开始生长,碰撞等等。

我理解物理碰撞是如何工作的,我理解如何使用圆形边界框来检测碰撞。我不明白的是我如何创建对象“circle”的两次迭代,并检测同一对象的两次迭代之间的碰撞。如何在函数中引用或检测两个不同的圆?我也希望这个可扩展,所以我可以有3,4或更多的圈子互相交互。

如果这没有意义,这里有一些我正在使用的代码:

local function screenTap(event)
    circle = display.newCircle( event.x, event.y, 3)
end

display.currentStage:addEventListener( "tap", screenTap )

当点击屏幕时,会出现一个半径为3的圆圈。我还没有弄清楚如何随着时间的推移增加半径,但这是我可以研究的。

这是在Lua,但我真的不需要Lua中的代码答案。任何指针(嘿)或帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

为什么用物理学来拍摄?

你有(至少)两个圆圈,这意味着(对于你看到的每对圆圈)你有两个点p 1 ,p 2 和半径r 1 ,r 2

取两点的差异(p v = p 2 -p 1 )并确定该向量的长度(或“点差”):dist =(p v .x 2 + p v .y 2 )< SUP> 1/2 。如果r 1 + r 2 ≥dist,则两个圆重叠 - 即发生碰撞。

  

当点击屏幕时,会出现一个半径为3的圆圈。我还没有弄清楚如何随着时间的推移增加半径,但这是我可以研究的。

看来你目前正在做什么,你没有任何积分或可用的圆圈表示,只是画在屏幕上的东西?或者你可能有一个存储最新圈子的变量(你“忘记”所有其他圈子?)

如果是这种情况,那么做你想做的事是不可能的。您需要在某处存储圆圈的坐标,半径和当前状态(增长或缩小),例如:在数组中。

  

创建一个对象的两次迭代

是完全没有意义的事情。迭代与循环有关。您可能正在混淆图层:您所谓的“对象”可能是,您称之为“迭代”的是对象实例的

  

如何在函数中引用或检测两个不同的圆?

您需要对圆圈的信息进行一些表示。 (看起来你没有那个。)如果你有,那么你只需要查看存储内容的变量(或将信息传递给该函数)。

因为我之前已经构建了这个,所以这里有一些你可以适应的代码:

SPEED = 40
circles = { }

-- called once per frame (dt is the time since the last frame)
function love.update( dt )
    -- grow/shrink
    for i, circle in ipairs( circles ) do
        local dir = circle.direction == "grow" and 1 or -1 
        circle.r = circle.r + SPEED*dir*dt
        if circle.r <= 0 then
            circle.r, circle.direction = -circle.r, "grow"
        end
    end
    -- collide
    for i, c1 in ipairs( circles ) do
        for j, c2 in ipairs( circles ) do
            if i ~= j then 
                if c1.r + c2.r > ((c2.x-c1.x)^2 + (c2.y-c1.y)^2)^(1/2) then
                    c1.direction, c2.direction = "shrink", "shrink"
                end
            end
        end
    end
end

-- called once per frame, draws the circles
function love.draw( )
    for i, circle in ipairs( circles ) do
        love.graphics.circle( "fill", circle.x, circle.y, circle.r )
    end
end

-- add new circles on click
function love.mousepressed( x, y, btn ) 
    circles[#circles+1] = { x = x, y = y, r = 0, direction = "grow" }
end

-- you can press escape to quit
keys = {
    escape = love.event.quit,
}
function love.keypressed( k )
    local action = keys[k]
    if action then  return action( k )  end
end

(如果您想按原样运行:您需要love2d,然后将上述内容粘贴到文件main.lua中并在该目录中运行love . ,或等效地将包含的文件夹拖到love2d可执行文件或类似的东西上。)