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
Немає коментарів:
Дописати коментар