1

在下面提到的代码中, 和 之间到底有sprite什么body区别groundcreateBody为什么声明时没有参数传递groundedgeshape.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
4

1 回答 1

2

Sprite 是一个空对象,用于对其他 Sprite 继承的对象进行分组,就像在您的情况下快乐和悲伤的位图一样。

Body 是 box2d 中物理身体的表示,它没有任何视觉表示,只有数字作为尺寸(宽度和高度)、位置、旋转和不同的力。通常在 ENTER_FRAME 事件中,您将此值作为位置和旋转并将它们应用于 Sprite 继承的对象,因此它会像 box2d 模拟世界中的身体一样移动。

Ground 是一个空的虚拟 box2d 对象。如果您不向 createBody 提供参数,则意味着使用默认值,这基本上意味着您不关心它具有什么值。这种身体使用最常见的例子是关节。

要创建一个关节,您通常需要两个主体,但是如果您想通过关节将主体附加到空中的某个随机位置,或者作为鼠标光标的动态位置,您可以通过创建虚拟物理对象来做到这一点这是一个示例:http://appcodingeasy.com/Gideros-Mobile/Dragging-Box2d-object-in-Gideros-Mobile

在您的示例中,此主体用于 EdgeShape,它通常是用于创建世界边界的任意形状,或者在这种情况下只是地面,因此动态对象不会落在屏幕之外

于 2014-05-14T08:30:46.993 回答