前言
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 質量為 0
borderBottom = 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
-- 球 start
circleBody = love.physics.newBody(world, 200, 200)
-- 主體中心點有個半徑 25 的球
circle = love.physics.newCircleShape(circleBody, 0, 0, 25)
-- 使用內建質量系統(自動依照 Shape 形狀與大小來計算)
circleBody:setMassFromShapes()
-- 球 end
-- 板子 start
rectangleBody = 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)
end
function 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())
end
function love.update(dt)
-- 物理世界也是要更新訊息的
world:update(dt)
-- 根據滑鼠座標更改球彈力線的末端(球會跟著滑鼠跑)
circleJoint:setTarget(love.mouse.getPosition())
end
沒有留言:
張貼留言