前言
LÖVE 內建的物理引擎是基於 Box2D 的,且在 API 的設計上是盡可能與 Box2D 本身的 API 一致的。
範例檔案下載
情境說明
上下左右各建造了 100 公分厚的牆壁,在有重力的環境下,用彈力線懸吊了一塊板子;有顆中心點與滑鼠用彈力線連在一起的球,會隨著滑鼠座標移動…
Screenshot
程式碼(都在範例檔案內)
main.lua
function love.load()
-- 定義物理世界的範圍(左上x, 左上y, 右下x, 右下y)world = love.physics.newWorld(-2000, -2000, 2000, 2000)
-- 700 往下的重力world:setGravity(0, 700)
-- 四面牆壁 start -- 質量宣告為 0 = 無限大 (牆壁)borderTop = love.physics.newBody(world, 400, 50, 0)
top = love.physics.newRectangleShape(borderTop, 0, 0, 800, 100) -- default 質量為 0borderBottom = love.physics.newBody(world, 400, 550)
bottom = love.physics.newRectangleShape(borderBottom, 0, 0, 800, 100)
borderLeft = love.physics.newBody(world, 50, 300)
left = love.physics.newRectangleShape(borderLeft, 0, 0, 100, 400)borderRight = love.physics.newBody(world, 750, 300)
right = love.physics.newRectangleShape(borderRight, 0, 0, 100, 400) -- 四面牆壁 end -- 球 startcircleBody = love.physics.newBody(world, 200, 200)
-- 主體中心點有個半徑 25 的球circle = love.physics.newCircleShape(circleBody, 0, 0, 25)
-- 使用內建質量系統(自動依照 Shape 形狀與大小來計算)circleBody:setMassFromShapes()
-- 球 end -- 板子 startrectangleBody = love.physics.newBody(world, 400, 300)
rectangle = love.physics.newRectangleShape(rectangleBody, 0, 0, 100, 10)
rectangleBody:setMassFromShapes()
-- 板子 end -- 彈力線末端釘在(400, 100),與板子中心點連接在一起(400, 300)love.physics.newMouseJoint(rectangleBody, 400, 100)
-- 彈力線末端釘在(200, 200),與球中心點連接在一起(200, 200)circleJoint = love.physics.newMouseJoint(circleBody, 200, 200)
endfunction love.draw() -- 畫出球 love.graphics.circle("line", circleBody:getX(), circleBody:getY(), circle:getRadius(), 50) -- 畫出板子 love.graphics.polygon("fill", rectangle:getPoints()) -- 畫出四面牆壁 start love.graphics.polygon("fill", top:getBoundingBox()) love.graphics.polygon("fill", bottom:getBoundingBox()) love.graphics.polygon("fill", left:getBoundingBox()) love.graphics.polygon("fill", right:getBoundingBox()) -- 畫出四面牆壁 end -- 畫出彈力線末端與板子中心點的連接線love.graphics.line(400, 100, rectangleBody:getX(), rectangleBody:getY())
endfunction love.update(dt)
-- 物理世界也是要更新訊息的 world:update(dt) -- 根據滑鼠座標更改球彈力線的末端(球會跟著滑鼠跑)circleJoint:setTarget(love.mouse.getPosition())
end
沒有留言:
張貼留言