2011年5月3日 星期二

LÖVE 物理引擎實例

前言

LÖVE 內建的物理引擎是基於 Box2D 的,且在 API 的設計上是盡可能與 Box2D 本身的 API 一致的。

 

範例檔案下載

physics.love

 

情境說明

上下左右各建造了 100 公分厚的牆壁,在有重力的環境下,用彈力線懸吊了一塊板子;有顆中心點與滑鼠用彈力線連在一起的球,會隨著滑鼠座標移動…

 

Screenshot

SNAGHTML1dadaae

SNAGHTML1db3607

 

程式碼(都在範例檔案內)

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

沒有留言:

張貼留言