我在试图找出游戏机制时遇到了理论上的写作障碍。基本上,我希望有两个圆圈一直长到它们碰撞,当它们碰撞时它们开始收缩,直到它们的半径为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中的代码答案。任何指针(嘿)或帮助表示赞赏。
答案 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可执行文件或类似的东西上。)