love2d教程18--物理引擎2


這幾天在折騰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)

里更新世界。

tutor18

通過更改炸彈的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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM