Шукати в цьому блозі

Фізична бібліотека box2d в gideros




require "box2d"  -- Підключаємо бібліотеку

----------------------------------------------------------------
--Створюємо світ box2d 
----------------------------------------------------------------
--b2.World.new(gravityx, gravityy, doSleep)
local VSESVIT = b2.World.new(0, 9.8)-- Гравітація по осі Y 9,8
b2.setScale(20)-- масштаб к реальному миру 1 метр == 20 пикселей

-----------------------------------
--       Промальовка контуру
-----------------------------------
--Для налагодження створюємо контури фізичних тіл
local KONTUR = b2.DebugDraw.new()
stage:addChild(KONTUR)-- Додаємо в рівень
VSESVIT:setDebugDraw(KONTUR)-- Призначаємо контур налагодження нашого світу
-----------------------------------
--       СТВОРЮЄМО статичні ОБ'ЄКТИ
-----------------------------------
-- Створюємо підлогу
local ZEMLYA = VSESVIT:createBody({})
ZEMLYA.name = "ground"

local shape = b2.EdgeShape.new(-200, 400, 520, 400)
ZEMLYA:createFixture({shape = shape, density = 0})

-----------------------------------
--       СТВОРЮЄМО динамічне тіло 
-----------------------------------
-- Створюємо таблицю для спрайтів картинок об'єктів
local actors = {}

--Розміщуємо об'єкт
local TELO = VSESVIT:createBody{type = b2.DYNAMIC_BODY, position = {x=140, y=-30}}
          TELO.name = "box1"

        local FIGURA = b2.PolygonShape.new() --Малюємо КУБіК 40*40
        FIGURA:setAsBox(40, 40)
       
        --Призначаємо тілу форму FIGURA, Пплотность 1 в кг / м2., еластичність 0,2 в діапазоні [0-1], тертя 0,3 в діапазоні [0-1]
        TELO:createFixture{shape = FIGURA, density = 1, restitution = 0.2, friction = 0.3}


--спрайт об’єкта
        local KARTINKA = Bitmap.new(Texture.new("box.png"))
        KARTINKA:setAnchorPoint(0.5, 0.5)
        stage:addChild(KARTINKA)
       
        actors[TELO] = KARTINKA
-----------------------------------
--      Події
-----------------------------------
local function onBeginContact(event)
        -- Зіткнення об'єктів
        local fixtureA = event.fixtureA
        local fixtureB = event.fixtureB
        local bodyA = fixtureA:getBody()
        local bodyB = fixtureB:getBody()
       
        print("begin contact: "..bodyA.name.."<->"..bodyB.name)
end

local function onEndContact(event)
        -- Кінець зіткнення
        local fixtureA = event.fixtureA
        local fixtureB = event.fixtureB
        local bodyA = fixtureA:getBody()
        local bodyB = fixtureB:getBody()

        print("end contact: "..bodyA.name.."<->"..bodyB.name)
end

-- Події нашого світу
VSESVIT:addEventListener(Event.BEGIN_CONTACT, onBeginContact)
VSESVIT:addEventListener(Event.END_CONTACT, onEndContact)

-- Оновлюємо наш світ кожен фрейм - позицію і поворот об'єктів
local function onEnterFrame()
        VSESVIT:step(1/60, 8, 3) --Оновити фізичні тіла
       
        for body,sprite in pairs(actors) do  -- Оновити спрайт фіз тіл
                sprite:setPosition(body:getPosition())
                sprite:setRotation(body:getAngle() * 180 / math.pi)
        end
end

stage:addEventListener(Event.ENTER_FRAME, onEnterFrame)

-- З'єднати 2 об'єкта шарнірним осьовим сполученням
--b2.createRevoluteJointDef(bodyA, bodyB, anchorx, anchory)
        local jointDef = b2.createRevoluteJointDef(body1, body2, Xpos, Ypos)
        world:createJoint(jointDef)

-- З'єднання гумкою
--b2.createDistanceJointDef(bodyA, bodyB, anchorAx, anchorAy, anchorBx, anchorBy)
local jointDef = b2.createDistanceJointDef(ground, body, 160, 110, 160, 110)
jointDef.frequencyHz = 2.0;
jointDef.dampingRatio = 0;
world:createJoint(jointDef)

Пуля

-- Створити і запустити кулю (Увага до bullet=true)
local function launchBullet()
        local bodyDef = {type = b2.DYNAMIC_BODY, bullet = true, position = {x=-50, y=250}}
        local bullet = world:createBody(bodyDef)
       
        local shape = b2.CircleShape.new(0, 0, 20)
        local fixtureDef = {shape = shape, density = 20, restitution = 0.05}
        bullet:createFixture(fixtureDef)
       
        bullet:setLinearVelocity(400, 0)
end































3

Немає коментарів:

Дописати коментар