【发布时间】:2016-10-02 03:10:50
【问题描述】:
所以我正在使用 Corona(在 lua 中)构建一个游戏,其中有多个包含物理属性的对象,并且目前正在尝试以一种可以使碰撞处理更容易的方式存储和操作它们... 这个想法是3个物体中没有2个碰撞.. 对象是 1/ 一个球(可以出现在屏幕上的许多球) 2/ 表(具有一些物理属性) 和 3/ 口袋(最终只是一些不可见的矩形)
经过 2 周的处理,我得出了这个结论
- 球击中其他球
- 球击出球台
- 表格不符合 Pocket(静态主体)
- 口袋不击球(静态身体)
- 球打出口袋
代码结构示例 创建 100 个球
balls = {}
local i = 1
function createBalls ()
for i = 1,100,1 do -- create the 100 and hide them?
ball = display.newImage("ball.png")
ball.isVisible = false
ball.id = tostring( "ball " ..i )
balls[#ball+1] = ball
sceneGroup:insert(ball[#ball])
end
end
声明6个口袋(使用id作为碰撞处理的标志)
local Pocket1 = display.newRect( screenWidth * .28, screenHeight * .5, 15, 18) --Left Pocket 60pts
physics.addBody( Pocket1, "kinematic", {isSensor = true})
Pocket1:addEventListener( "collision", Pocket1 ) Pocket1.isVisible = true Pocket1.alpha = 0.5
Pocket1.id ="Left Pocket 60pts"
local Pocket2 = display.newRect( screenWidth * .3945, screenHeight * .556, 15, 18) -- Left Pocket 30pts
physics.addBody( Pocket2, "kinematic", {isSensor = true} )
Pocket2:addEventListener( "collision", Pocket2 ) Pocket2.isVisible = false
Pocket2.id ="Left Pocket 30pts"
local Pocket3 = display.newRect( screenWidth * .512, screenHeight * .490, 15, 18) -- Center Pocket 10 pts
physics.addBody( Pocket3, "kinematic", {isSensor = true} )
Pocket3:addEventListener( "collision", Pocket3 ) Pocket3.isVisible = false
Pocket3.id ="Center Pocket 10pts"
local Pocket4 = display.newRect( screenWidth * .613, screenHeight * .556, 15, 18) -- Right Pocket 30 pts
physics.addBody( Pocket4, "kinematic", {isSensor = true} )
Pocket4:addEventListener( "collision", Pocket4 ) Pocket4.isVisible = false
Pocket4.id ="Right Pocket 30pts"
local Pocket5 = display.newRect( screenWidth * .736, screenHeight * .5, 15, 18) -- Far Right Pocket 60pts
physics.addBody( Pocket5, "kinematic", {isSensor = true} )
Pocket5:addEventListener( "collision", Pocket5 ) Pocket5.isVisible = false
Pocket5.id ="Right Pocket 60pts"
local Pocket6 = display.newRect( screenWidth * .512, screenHeight * .638, 50, 10) -- Kill-z Pocketphysics.addBody( Pocket6, "kinematic", {isSensor = true} )
Pocket6:addEventListener( "collision", Pocket6 ) Pocket6.isVisible = false
Pocket6.id ="Kill Pocket"
我的问题,碰撞检测仅适用于最后一个加载的球,
(如果有人要求加载器功能)
--handle loader
function shootBall()
createBalls() --obviously this will now spawn 100 balls
if ballLoaded == true then
r1 = -687.5 r2 = -668
r3 = 595 r4 = 645
ball[k].x = screenWidth * .378 ball[k].y = screenHeight * .638
ball[k]:scale(0.16,0.16)
ball[k].isVisible = true
physics.addBody( ball[k], "dynamic", {radius = 5.5, density=15.0, friction=0.8, bounce=0.0 } )
ball[k]:setLinearVelocity( math.random(r1,r2), math.random(r3,r4))
--and here it will have done nothing productive other than fill the screen with balls
end
回滚编辑这最初是被调用的,但正如你所见,它根本没有组织好,因为最近的代码是一团糟..
local i = 1
local balls = {}
local function spawnBall()
if i > 0 or i < 100 then
balls[i] = display.newImage("ball.png")
balls[i].id = "ball "..i
balls[i].x = screenWidth * .378
balls[i].y = screenHeight * .638
balls[i]:scale(0.16,0.16)
balls[i].isVisible = true
physics.addBody( balls[i], "dynamic", {radius = 5.5, density=15.0, friction=0.8, bounce=0.0 } )
balls[i]:setLinearVelocity(math.random(-687.5,-668), math.random(595,645))
sceneGroup:insert(balls[i])
print(balls[i].id.. " shot")
i = i + 1
end
end`
【问题讨论】:
-
你的代码中有一些奇怪的(和有味道的)东西。 createBall 函数绝对是错误的。你确定你知道你在这里做什么?您在每个循环中创建一个球表,在其中存储一些东西,然后在表 本身中存储对该表的引用,但在开始时(
#ball + 1将评估为 1,k更大大于 1)。在您的加载程序函数中,k 是什么?如果它是全局变量,请不要这样做。相信我,你不想这样做。此外,您应该小心缩进,它也有助于发现错误。
标签: lua box2d collision-detection coronasdk physics