使用面向对象编程的物理碰撞检测,使用一个对象的两个迭代。

我在尝试为游戏设计力学时遇到了理论写作障碍。基本上,我想要有两个圆形,它们会不断增长直到碰撞在一起,然后开始缩小,直到半径为0,然后重新开始增长,碰撞,以此类推。

我了解物理碰撞的工作原理,我了解如何使用圆形边界框来检测碰撞。但我不明白如何创建一个对象“circle”的两个迭代,并检测它们之间的碰撞。如何在函数中引用或检测两个不同的圆?我还希望建立可扩展性,以便可以让3、4或更多的圆相互作用。

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

当屏幕被敲击时
    circle = display.newCircle( event.x, event.y, 3)
end

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

当屏幕被敲击时,将在那里出现一个半径为3的圆。我还没有完全弄清楚如何随着时间的推移增加半径,但这是我可以研究的东西。

这是Lua中的代码,但我不一定需要Lua代码答案。非常感谢您的任何指引或帮助。

点赞
用户805875
用户805875

为什么要使用物理学来射击呢?

你至少有两个圆,这意味着(对于你查看的每一对圆),你有两个点 p1、p2和半径 r1、r2。

取这两个点的差异(pv = p2-p1)并计算这个向量(或“点差”)的长度:dist =(pv.x2+pv.y2)1/2。如果 r1 + r2 ≥ dist,则两个圆重叠,即发生碰撞。


屏幕被点击时,一个半径为 3 的圆会出现。我还没有完全弄清如何随时间增长半径,但这是我可以研究的事情。

现在看起来,你并没有可用的点或圆形表示,只有绘制在屏幕上的东西?或者你只有一个变量来存储最近的圆(并且忘记所有其他圆)?

如果是这样的话,那么你想做的事情是不可能实现的。你需要在某个地方存储坐标、半径和当前状态(增长还是缩小)的圆的信息,例如在一个数组中。

创建一个对象的两个迭代

是完全没有意义的事情。迭代与循环有关。你可能混淆了层:你所谓的“对象”可能是一个类,你所谓的“迭代”可能是一个对象或一个类的实例?

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

你需要有圆的信息的某种表示(似乎你没有这个)。如果你有了这个,那么你只需查看存储信息的变量(或将你的信息传递给那个函数)。


因为我之前已经建立了这个功能,所以这里提供一些你可以根据自己的需求进行改编的代码:

SPEED = 40
circles = { }

-- 每帧调用一次(dt 是自上一帧以来的时间)
function love.update( dt )
    -- 增长/缩小
    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
    -- 碰撞
    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

-- 每帧调用一次,绘制圆
function love.draw( )
    for i, circle in ipairs( circles ) do
        love.graphics.circle( "fill", circle.x, circle.y, circle.r )
    end
end

-- 在点击时添加新圆
function love.mousepressed( x, y, btn )
    circles[#circles+1] = { x = x, y = y, r = 0, direction = "grow" }
end

-- 按 ESC 键退出
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 的可执行程序上,等等。)

2015-05-09 02:59:01