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

posted @ 2013-01-31 15:27  半山th  阅读(1801)  评论(9编辑  收藏  举报