Lua 自定义物理体
我在corona的自定义形状方面遇到了一些问题 这是我的代码,我在场景中添加了一些球体,使它们落在一个篮子里,这个篮子是我在newBasket()函数中定义的自定义形状对象,问题是篮子确实与地面对象碰撞,但它没有与球体碰撞,我不知道为什么,请有人帮帮我,我在别处找不到解决方案,提前谢谢Lua 自定义物理体,lua,coronasdk,Lua,Coronasdk,我在corona的自定义形状方面遇到了一些问题 这是我的代码,我在场景中添加了一些球体,使它们落在一个篮子里,这个篮子是我在newBasket()函数中定义的自定义形状对象,问题是篮子确实与地面对象碰撞,但它没有与球体碰撞,我不知道为什么,请有人帮帮我,我在别处找不到解决方案,提前谢谢 _W = display.contentWidth _H = display.contentHeight --Physics local physics = require("physics") physics
_W = display.contentWidth
_H = display.contentHeight
--Physics
local physics = require("physics")
physics.start()
physics.setDrawMode("debug")
-- iOS
display.setStatusBar(display.HiddenStatusBar)
-- screen boundaries
local ground = display.newRect(0, _H, _W, 5)
local leftWall = display.newRect(0,0,1,_H)
local rightWall = display.newRect(_W,0,1,_H)
physics.addBody(ground, "static", {friction = .2, bounce = .1})
physics.addBody(leftWall, "static", {friction = .2, bounce = .1})
physics.addBody(rightWall, "static", {friction = .2, bounce = .1})
local function newBasket()
local body = display.newImage("assets/basket.png")
body.x = 0 body.y = 0
local physics_body = {}
physics_body["basket"] = {
{
--LeftArm
density = 10, friction = 10, bounce = 0.15,
shape = {-126, 40, -110, 40, -140, -64, -156, -64}
},
{
--Bottom
density = 10, friction = 1, bounce = 0,
shape = {-121, 60, 125, 60, 128, 40, -126, 40}
},
{
--RightArm
density = 10, friction = 10, bounce = 0.15,
shape = {113, 40, 129, 40, 158, -64, 143, -64}
}
}
physics.addBody(body, unpack(physics_body["basket"]) )
return body
end
local basket = newBasket()
basket.x = _W * .5 basket.y = _H - 100
local function newPlanet()
local planets = {
{img = "bigBall.png", radius = 45},
{img = "mediumBall.png", radius = 30},
{img = "smallBall.png", radius = 20}
}
local n = math.random(1,3)
local img = "assets/" .. planets[n].img
local ball = display.newImage(img)
ball.x = math.random((_W * 0.5) -100, (_W * 0.5) + 100) ball.y = 0
physics.addBody(ball, {bounce = 0.3, radius = planets[n].radius})
end
local function spawnPlanets(number)
local function spawn(e)
newPlanet()
if(e.count == number) then
timer.cancel(tmr)
tmr = nil
end
end
tmr = timer.performWithDelay(500, spawn, number)
end
spawnPlanets(20)
根据报告:
如果指定了形状,则实体边界将跟随该形状提供的多边形。请注意,每个形状的最大边数为8个,所有角度都必须是凸的。[…]形状坐标必须按顺时针顺序定义,并且生成的形状必须仅为凸面
所以有两个问题对你不利。首先,形状必须按顺时针顺序定义,正如我在下面的示例中所做的那样。其次,所有的形状都必须是凸面的(甚至是复杂的身体形状),所以你不能做任何像新月或篮子一样的事情
不幸的是,这意味着你必须把你的篮子做成3个不同的形状。此外,由于它们现在是独立的形状,它们在下落时不会粘在一起(除非使用)。我刚刚制作了3个静态物体,并将其放置在正确的位置开始:
local function newBasket()
local physics_body = {}
physics_body["basket"] = {
{
--LeftArm
density = 10, friction = 10, bounce = 0.15,
shape = {-126, 40, -156, -64, -140, -64, -110, 40 }
},
{
--Bottom
density = 10, friction = 1, bounce = 0,
shape = {-121, 60,-126, 40, 128, 40, 125, 60 }
},
{
--RightArm
density = 10, friction = 10, bounce = 0.15,
shape = {113, 40, 143, -64, 158, -64, 129, 40 }
}
}
for k,shape in pairs(physics_body["basket"]) do
local body = display.newRect(0, 0, 200, 100)
body.x = display.contentCenterX
body.y = display.contentHeight - 60
physics.addBody(body, 'static', shape )
end
end
newBasket()
先生,你真棒!,是的,我在学习一个关于复杂物理对象的老教程,那个家伙按逆时针顺序定义了形状,我阅读了文档,但不明白为什么这个家伙工作得很好,我甚至试着按顺时针顺序使用形状,但不起作用。。。我仍然需要很好地理解你在那里说的“for”的句子中发生了什么,你宣布了一个newRect?。。。嗯,内容中心和高度是物理体的局部中心,我想,那你为什么要声明一个新的矩形呢?我用了一个矩形,因为我没有你的图像,在Corona,你的物理体必须连接到某种显示对象上。您只需将newRect替换为您选择的图像即可。display.contentCenterX是屏幕的中心。