不好意思,隔了这么久才发这一篇文章,虽然部分原因是最近因为实习的事情很忙,还有一部分原因是比较懒,废话不多说,现在开始正文。

碰撞

既然学到了这里,想必大家都明白,物理引擎会帮我们做很多事情,省去从零开始码代码的工作量,当然“碰撞”也会由我们的物理引擎做好很多工作。

碰撞检测

什么是碰撞检测?碰撞检测就是当两个及两个以上的物体发生碰撞时,程序能够捕捉到是哪两个物体发生了碰撞。对,没错,我们就只需要设置一个监听器来帮助我们就好了。

public void initContactListener() { //加载碰撞监听器ContactListener cl = new ContactListener() { //内部类@Overridepublic void add(ContactPoint arg0) {//重写的方法//碰撞后的行为doAction(arg0.shape1.getBody(), arg0.shape2.getBody(), bl);}@Overridepublic void persist(ContactPoint arg0) {}    //重写persist方法@Overridepublic void remove(ContactPoint arg0) {} //重写remove方法@Overridepublic void result(ContactResult arg0) {}//重写result方法};world.setContactListener(cl);}

我们用这个函数为游戏添加碰撞检测的监听器,每当有刚体发生碰撞时,ContactPoint类型的参数便能告诉程序是哪两个物体发生了碰撞,我们便可以为碰撞的刚体安排接下来的动作。

碰撞反应

检测到了是哪两个刚体后,我们便需要让刚体们在碰撞后“听我们的话”,让他们“按计划行事”。

public void doAction(Body body1, Body body2, ArrayList<MyBody> bl) {//遍历刚体列表for (MyBody mpi1 : bl) {//匹配刚体if (body1 == mpi1.body) {//判断刚体类型if (mpi1 instanceof MyRectColor) {//类型强制转换MyRectColor mrc = (MyRectColor) mpi1;//判断是否为敌方“战机”if (mrc.isObstacle) {//遍历刚体列表for(MyBody mpi2 : bl){//匹配刚体if(body2 == mpi2.body){//具体的碰撞反应obstacleAction(mpi1, mpi2);}}}} else if(mpi1 instanceof Bullet){for(MyBody mpi2:bl){if(body2 == mpi2.body) {bulletAction(mpi1, mpi2);}}} else if(mpi1 instanceof Prop){for(MyBody mpi2:bl){if(body2 == mpi2.body){propAction(mpi1,mpi2);}}}}else if (body2 == mpi1.body) {if (mpi1 instanceof MyRectColor) {MyRectColor mrc = (MyRectColor) mpi1;if (mrc.isObstacle) {for(MyBody mpi2 : bl){if(body1 == mpi2.body){obstacleAction(mpi1, mpi2);}}}} else if(mpi1 instanceof Bullet){for(MyBody mpi2:bl){if(body1 == mpi2.body) {bulletAction(mpi1, mpi2);}}}else if(mpi1 instanceof Prop){for(MyBody mpi2:bl){if(body1 == mpi2.body){propAction(mpi1,mpi2);}}}}}}

上面我给了部分的注释,其余没给注释的地方和上面类似,相信大家都看得懂。这部分代码只是简单将碰撞的刚体的类型分了个类,具体的碰撞反应在下面,不过在教学中,我就只给出obstacleAction(MyBody myBody1,MyBody myBody2)函数好了,其余的具体函数请看我的源码,这里就不粘上来了。

public void obstacleAction(MyBody myBody1,MyBody myBody2){//强制类型转换MyRectColor mrc = (MyRectColor) myBody1;//判断刚体类型if(myBody2 instanceof PlayerBall){//玩家是否被保护if(!isProtected) {//强制类型转换PlayerBall playerBall = (PlayerBall) myBody2;playerBall.HP = playerBall.HP - mrc.obstacleAD;if(playerBall.bulletPower>0) {playerBall.bulletPower = playerBall.bulletPower - 25;if(playerBall.bulletPower<0){playerBall.bulletPower=0;}}else{if(playerBall.bulletLevel>1){playerBall.bulletLevel--;playerBall.bulletPower=100;}}if(playerBall.playerAD>playerBall.playerStartAD*0.6){playerBall.playerAD = playerBall.playerAD*0.8;if(playerBall.playerAD<playerBall.playerStartAD*0.6){playerBall.playerAD=playerBall.playerStartAD*0.6;}}isProtected = true;//保护玩家1秒new Thread(){@Overridepublic void run(){try{sleep(1000);}catch (Exception e){}isProtected = false;}}.start();}//判断是否是bossif(mrc.level<bossLevel) {//设置刚体isLive属性mrc.isLive = false;}Message msg = new Message();if(mrc.level==1) {msg.what = 2;handler.sendMessage(msg);}else if(mrc.level==3){msg.what = 3;handler.sendMessage(msg);}else if(mrc.level==6){msg.what = 4;handler.sendMessage(msg);}}else if(myBody2 instanceof MyRectColor){MyRectColor myRectColor = (MyRectColor) myBody2;if(myRectColor.isBottom){mrc.isLive = false;}else if(mrc.level==bossLevel&&myRectColor.isLeft){mrc.isGoToRight = true;}else if(mrc.level==bossLevel&&myRectColor.isRight){mrc.isGoToRight = false;}}}

当然啦,具体的动作自己定就好啦~相信大家也明白了物理引擎中的“碰撞”的机制,希望大家能够更加灵活的使用。

基于JBox2D物理引擎开发的“雷电”小游戏(五)——碰撞相关推荐

  1. 基于JBox2d物理引擎和canvas的游戏开发实例

    本文基于JBox2d+canvas,后续提供NDK+openglEs版本:本文的主要目的是给大家介绍如何使用创建一个物理世界. 一.主函数: 主函数包括了Box2D的基本流程 简单来说,一个Box2D ...

  2. 使用Hype物理引擎制作一个网页小游戏(中)

    在上一小节中,相信大家跟着小编的教程都能够顺利完成这款网页小游戏的静态场景制作,在本小节中,小编将带着大家完成网页小游戏的动画录制部分. 第一步:从上一节的游戏预览效果可以看到,游戏过程中,上方的矩形 ...

  3. 基于深度学习的一款五子棋小游戏

    今天分享一个基于深度学习而开发的AI小游戏 简单介绍 这一款基于深度学习的五子棋小游戏的界面是使用Unity开发的,而网络结构是使用keras搭建的. 环境 笔者的环境如下 操作系统 windows ...

  4. 一款非常好玩的小程序游戏推荐给大家,基于cocos creator引擎开发的

    一款非常好玩的小程序游戏推荐给大家,基于cocos creator引擎开发的,排名包含微信好友排行榜,全球榜,快邀请好友,一起来玩吧.

  5. 使用jbox2d物理引擎打造摩拜单车贴纸动画效果

    使用jbox2d物理引擎打造摩拜单车贴纸动画效果 继上一次实现了ofo小黄人斗鸡眼效果(眼珠跟随手机加速器自动滚动),想看效果的朋友,请点击这篇文章 http://blog.csdn.net/qq_2 ...

  6. 白鹭引擎正式支持微信小游戏开发

    12月28日微信迎来更新,正式上线小游戏,并开放了小游戏开发文档和开发者工具.在微信发布新版本后,白鹭引擎立即添加了对于微信小游戏开发的支持,开发者只需要使用白鹭引擎的最新版本,通过使用白鹭引擎完整工 ...

  7. 开发一个Canvas小游戏 实现一个游戏“引擎”

    前言 这个游戏其实在三四年前就写了,中间还重构过好几次,之前都是用简单的面向对象和函数式编程来写,游戏中的元素关系到还是分的挺开,但是游戏的渲染,运算等逻辑分的不够清晰,整个逻辑基本都是自顶向下的流水 ...

  8. node mysql商城开发_NideShop:基于Node.js+MySQL开发的微信小程序商城开源啦

    NideShop:基于Node.js+MySQL开发的微信小程序商城开源啦 发布时间:2020-04-14 04:23:37 来源:51CTO 阅读:2894 作者:ch10mmt 高仿网易严选的微信 ...

  9. 基于Java+Swing实现雷电小游戏

    基于Java+Swing实现雷电小游戏 一.系统介绍 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 基于java的雷电游戏基本功能包括:敌方飞机随机飞行.我方飞机手动控制飞行,射击比拼,游戏 ...

最新文章

  1. 语音助手再次敲响隐私保护警钟
  2. git config配置文件
  3. pytorch的多分类问题
  4. 【Python基础】Python 打基础一定要吃透这 5 个内置函数
  5. BigDecimal类基础
  6. Linux 系统应用编程——多线程经典问题(生产者-消费者)
  7. Spring Security Oauth2 (三) 密码码模式
  8. linux off_t类型的头文件,linux下32位机与64位机基本数据类型长度对比
  9. linux buffer cache 过高_怎么理解内存中的Buffer和Cache?
  10. Python 进阶——重访 list (二)
  11. linux nfs限制连接数,linux – 对NFS有一个有效的稳定性参数吗?
  12. 同花顺python_同花顺有python接口_基于python的炒股软件
  13. 【限流算法】java实现滑动时间窗口算法
  14. (一)Python小甲鱼入门教程——第一个小游戏001-004
  15. linux权限管理的设计,Linux权限管理漫谈之用户切换
  16. 谷歌网盘国内下载API
  17. @mysql数据库面试手册
  18. 2020数学建模国赛(B题)总结
  19. JAVA实现纳税算法
  20. c语言五子棋毕业设计,基于c语言五子棋小游戏--本科生毕业设计.doc

热门文章

  1. Google Chrome 91.0.4472.101 正式版
  2. python绘制3d球体网格散点图
  3. 在微信小程序中,swiper组件(轮播图4)的常用属性
  4. 获取农历节日、节气方法
  5. ORACLE DSG数据同步软件进程导致数据库无法正常关闭
  6. 2022年安全员-A证考试练习题及模拟考试
  7. python复制文件到新文件夹
  8. python教学小说02 猫都让我学python
  9. 【转帖】每一个不懂爱的人都会遇到一个懂爱的人,然后经历一场撕心裂肺的爱情。不懂爱的人慢慢懂了。懂爱的人,却不敢再爱了。。。
  10. Android中出现Can not resolve symble ‘R’问题的解决办法