這幾天在折騰linux,幾乎把我折騰怕了,不過終於搞定了。下面繼續love2d物理引擎的回調處理。
1、創建世界 world
2、使用world:setCallbacks(beginContact, endContact, preSolve, postSolve),這四個參數即回調
函數的名字(名字任意),分別在兩個物體開始接觸,結束接觸,碰撞發生前,碰撞結束后調用。
3、回調函數的參數為(fixure1,fixture2,contact) (參數名字任意)即碰撞兩物體的形狀,碰撞產生的contact。
之后發生碰撞后物理引擎會自動調用我們的回調函數,並傳給回調函數(fixure1,fixture2,contact) ,可以
通過這些參數得到一些我們需要的信息,也可以不用。
關於box2d碰撞過程的解析可以閱讀此文,及其系列博客。
下面我們制作一個汽車與炸彈相撞發生爆炸的效果。
先創建世界設置水平加速度為3,讓汽車自動向右運動
love.physics.setMeter(40)
world = love.physics.newWorld(40*3, 0, true)
之后創建汽車物體,根據汽車圖片的大小創建矩形的shape,並通過fixture綁定。
炸彈與之類似,之后完成回調函數。
最后,在love.draw()里取得汽車、炸彈物體的坐標來繪制,在love.update(dt)
里更新世界。
通過更改炸彈的y坐標,你會發現汽車與其相撞時現象不同,具體的還是看我上面
提到的那篇博客。
完整的代碼如下:
main.lua
local lg=love.graphics function love.load() love.graphics.setMode(800, 640, false, true, 0) --設置窗口800*640,不全屏,開啟垂直同步,全屏抗鋸齒緩存0 love.physics.setMeter(40) --設置40px(像素)為1米,汽車圖片是120px長,這樣就有3m了 --創建一個水平加速度為3的世界,讓接下來的汽車自己運動 world = love.physics.newWorld(40*3, 0, true) --設置世界里的回調函數 world:setCallbacks(beginContact, endContact, preSolve, postSolve) --創建汽車 car = {} car.body = love.physics.newBody(world, 10, 640/2-90/2,"dynamic") --創建汽車,把它放在x=100,圖片中心放在屏幕豎直中心 car.shape = love.physics.newRectangleShape(120, 90) --創建一個矩形大小為汽車圖片的大小 car.fixture = love.physics.newFixture(car.body, car.shape) --把矩形附加到汽車 car.fixture:setUserData("car") --設置一些數據,可以通過getUserData取出以在其它地方使用 --創建一個炸彈 bomb = {} bomb.body = love.physics.newBody(world, 500, 640/2-90/2) --創建炸彈,把它放在x=500,圖片中心放在屏幕豎直中心 bomb.shape = love.physics.newRectangleShape(24,32) --創建一個矩形大小為炸彈圖片的大小 bomb.fixture = love.physics.newFixture(bomb.body, bomb.shape, 1) --把矩形附加到炸彈,密度為1 bomb.fixture:setRestitution(0.3) --反彈系數,即碰撞反彈后速度為原來的0.3倍 bomb.fixture:setUserData("bomb") --加載圖片 imgCar=lg.newImage("assets/car.jpg") imgBomb=lg.newImage("assets/bomb.jpg") imgBlowing=lg.newImage("assets/blowing.png") --爆炸音效 sound = love.audio.newSource("assets/blowing.mp3", "static") --用來輸出碰撞的信息 text="" collided=false end function love.update(dt) world:update(dt) end function love.draw() lg.print(text,10,10) if not collided then lg.draw(imgCar,car.body:getX(),car.body:getY()) lg.draw(imgBomb,bomb.body:getX(),bomb.body:getY()) else --創建爆炸,把圖片中心放在炸彈的x坐標,y屏幕豎直中心 lg.draw(imgBlowing,500-120/2,640/2-120/2) end --用來確定物理引擎的坐標系統是以左頂點還是中心,發現是坐頂點 lg.print("bomb",500,640/2-90/2) end function beginContact(a, b, coll) collided=true love.audio.play(sound) text=text.."\n".."beginContact" end function endContact(a, b, coll) text=text.."\n".."endContact" end function preSolve(a, b, coll) text=text.."\n".."preSolve" end function postSolve(a, b, coll) text=text.."\n".."postSolve" end
代碼下載(已clone的直接git pull)
git clone git://gitcafe.com/dwdcth/love2d-tutor.git
或git clone https://github.com/dwdcth/mylove2d-tutor-in-chinese.git

