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)
里更新世界。
通过更改炸弹的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
作者:半山
出处:http://www.cnblogs.com/xdao/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。