love2d教程18--物理引擎2
2013-01-31 15:27
441 查看
这几天在折腾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
代码下载(已clone的直接git pull)
git clone git://gitcafe.com/dwdcth/love2d-tutor.git
或git clone https://github.com/dwdcth/mylove2d-tutor-in-chinese.git
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
相关文章推荐
- love2d教程17--物理引擎1
- 幻世(OurDream)2D图形引擎使用教程18——易语言编写幻世程序系列(2)
- Ycnd 2D教程1---初始化引擎的方法
- Android 2d物理引擎Box2d的使用示例
- Android 2d物理引擎Box2d介绍
- love2d教程34--thread模块
- lua & love2d 简单入门教程
- 制作简单的2D物理引擎(一)——动力学基础
- 幻世(OurDream)2D图形引擎使用教程2——第一个幻世程序
- APE 2D引擎教程
- 【技术讨论】从弹弹堂说起,如何用2D物理引擎编写一个游戏<一>
- 幻世(OurDream)2D图形引擎使用教程7——处理操作输入(1)
- Phaserjs基础教程第六节:Physics.ARCHDE物理引擎
- AS3物理引擎教程。
- Cocos2d-x教程(30)-3.x版本物理引擎的使用
- love2d教程1--最小的love2d程序
- Love2d新手入门教程之贪吃蛇(附源码)
- 在DirectX3D中使用Havok物理引擎的教程
- Android下2d物理引擎Box2d用法简单实例
- love2d教程24--碰撞跳跃