在下面提到的代码中,sprite、body和ground到底有什么区别?为什么在声明createBody时没有传递给ground的参数?edgeshape.new()和polygonshape.new()有什么区别?
require "box2d"
b2.setScale(20)
-- this function creates a box sprite with 2 happy and sad children
local function createBoxSprite(sx, sy)
local happy = Bitmap.new(Texture.new("happy-box.png", true))
happy:setAnchorPoint(0.5, 0.5)
local sad = Bitmap.new(Texture.new("sad-box.png", true))
sad:setAnchorPoint(0.5, 0.5)
local sprite = Sprite.new()
sprite:addChild(happy)
sprite:addChild(sad)
sprite:setScale(sx, sy)
return sprite
end
-- this table holds the dynamic bodies and their sprites
local actors = {}
-- create world
local world = b2.World.new(0, 9.8)
-- create a ground body and attach an edge shape
local ground = world:createBody({})
local shape = b2.EdgeShape.new(-200,480,520,480)
ground:createFixture({shape = shape, density = 0})
-- every 3 seconds, we create a random box
local function onTimer()
local sx = math.random(70, 100) / 100
local sy = math.random(70, 100) / 100
local body = world:createBody{type = b2.DYNAMIC_BODY, position = {x = math.random(0, 320), y = -35}}
local shape = b2.PolygonShape.new()
-- box images are 70x70 pixels. we create bodies 1 pixel smaller than that.
shape:setAsBox(34.5 * sx, 34.5 * sy)
body:createFixture{shape = shape, density = 1, restitution = 0.1, friction = 0.3}
local sprite = createBoxSprite(sx, sy)
stage:addChild(sprite)
actors[body] = sprite
end发布于 2014-05-14 08:30:46
Sprite是一个空对象,用于对其他Sprite继承的对象进行分组,就像在您的例子中,愉快和悲伤的位图一样。
体是box2d中物理体的表示,它没有任何视觉表示,只有尺寸(宽度和高度)、位置、旋转和不同力的数字。通常在ENTER_FRAME事件中,您将这些值作为位置和旋转,并将它们应用于Sprite继承的对象,因此它的移动将与box2d模拟世界中的主体完全相同。
地面是一个空的虚拟box2d对象。如果不向createBody提供参数,就意味着使用了默认值,这基本上意味着您不关心它有哪些值。这种身体使用的最常见的例子是关节。
要创建一个关节,你通常需要两个身体,但是如果你想把身体通过关节附加到空气中的某个随机位置,或者是鼠标光标的动态位置,那么你可以通过创建虚拟物理对象来完成,这就是一个例子:http://appcodingeasy.com/Gideros-Mobile/Dragging-Box2d-object-in-Gideros-Mobile。
在您的示例中,这个主体用于EdgeShape,它通常是用于创建世界边界的任意形状,或者在本例中是简单的接地,因此动态对象不会掉在屏幕之外。
https://stackoverflow.com/questions/23530298
复制相似问题