2

コロナのカスタムシェイプで困っています。

ここに私のコードがあり、それが何をするかというと、いくつかの球をシーンに追加して、バスケットの中に収まるようにします。このバスケットは、newBasket() 関数で定義したカスタム形状オブジェクトです。問題は、バスケットは地面の物体と衝突しますが、球体とは衝突しません。理由がわかりません。誰か助けてください。他の場所で解決策が見つかりません。よろしくお願いします。

_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)
4

1 に答える 1

3

マニュアルによると:

形状が指定されている場合、ボディの境界は形状によって提供される多角形に従います。形状ごとの辺の最大数は 8 であり、すべての角度は凸面でなければならないことに注意してください。[...] 形状座標は時計回りの順序で定義する必要があり、結果の形状は凸型のみでなければなりません。

したがって、あなたには2つの問題があります。まず、以下の例で行ったように、形状を時計回りに定義する必要があります。第二に、すべての形状は (複雑なボディ形状であっても) 凸状でなければならないため、三日月やバスケットのようにそれ自体が反転するようなことはできません。

残念ながら、これはバスケットを 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()
于 2012-04-16T16:55:20.840 に答える