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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《LÖVE for Lua Game Programming》 开源游戏引擎love2d综合教程love2d 是一款备受欢迎的开源2D视频游戏引擎框架,其可以让你借助简便的 Lua 脚本语言在游戏原型开发中变得又快又简单。Love2d 拥有强大和活跃的社区来使其成为一个有效的游戏开发框架。Love2d 成就了世界上许多不同年龄段的独立游戏开发者,让他们有机会接触到商业视频游戏的机会。 Love2d的简单和“write less build more”的特点使得它在经验丰富的老人和刚入行的新人都很容易上手。 本书是一本展示 Love2D 大部分综合功能的教程。它将带领你通过创建一个原型来快速用Love2d快速打包。 本书所涵盖的内容 第一章:开始Love2d。下载,安装,Lua框架,运行 Love2d 游戏 第二章:Love2d 走起!带领你学会绘制2D对象,移动游戏对象,并赋予一个游戏角色生命。 第三章:创建游戏之前。带你了解开发一个游戏所必备的游戏知识。 第四章:创建你的第一个游戏。这章带领你设计和加载游戏关卡,并设置管理你的游戏角色和资源。 第五章:更多游戏制作。介绍你一些游戏物理如碰撞,重力对游戏对象的影响,来帮助你更好的创建角色动画。 第六章:遇见坏蛋。描述怎么创建敌人角色。 第七章:存档,UI和声音。 第八章:打包和部署你的游戏,描述怎么打包和部署你的游戏到各个平台上,现在你的游戏已经面世了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值