博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
love2d教程18--物理引擎2
阅读量:7240 次
发布时间:2019-06-29

本文共 2767 字,大约阅读时间需要 9 分钟。

这几天在折腾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.graphicsfunction 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=falseendfunction love.update(dt)    world:update(dt)    endfunction 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)endfunction beginContact(a, b, coll)    collided=true    love.audio.play(sound)    text=text.."\n".."beginContact"endfunction endContact(a, b, coll)text=text.."\n".."endContact"endfunction preSolve(a, b, coll)text=text.."\n".."preSolve"endfunction 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://yyybm.baihongyu.com/

你可能感兴趣的文章
Football
查看>>
java中文件上传下载将file转为MultipartFile
查看>>
冲刺第三天
查看>>
测试oracle数据库连接
查看>>
PhoneGap打Android包报错
查看>>
nginx添加ssl证书
查看>>
Hadoop问题汇总
查看>>
P1042 乒乓球
查看>>
CODEVS 1047 邮票面值设计
查看>>
谈工程师的价值和发展
查看>>
1、查找字符位置函数
查看>>
去掉标题栏/ActionBar后点击menu键时应用崩溃
查看>>
求1+2+3+...+n
查看>>
bzoj 1854: [Scoi2010]游戏
查看>>
bzoj 1432: [ZJOI2009]Function
查看>>
HashMap泛型使用
查看>>
MTK Sensor越界导致的系统重启问题分析报告
查看>>
Swift-JSON Encode && Decode
查看>>
(效果五)js获取客户端ip地址及浏览器信息
查看>>
XAML中的空格、换行、Tab
查看>>