上次已实现箭矢的飞行效果,但是箭在碰到墙壁时直接反弹回来,像钢棍而不是箭。在Box2d中,可以利用关节(Joint)将箭和靶子连接起来,组成一个整体,实现射击效果。使用关节要在文件开头添加新的变量,方便后面使用:

var b2Joints =  Box2D.Dynamics.Joints;
var b2Contacts =  Box2D.Dynamics.Contacts;
var b2Listener =Box2D.Dynamics.b2ContactListener;

箭与靶子的起始位置并不相同,要检测箭是否射中靶子就要实时进行碰撞检测,幸好Box2d可以自动进行这部分工作,不过检测到碰撞时如何处理需要自己定义。所以有下面的声明,声明一个b2Listener,两个物体碰撞时会调用Listener指定的方法。

var arrowContactListener = new b2Listener;
arrowContactListener.PreSolve = arrowPreSolve;
world.SetContactListener(arrowContactListener);

arrowPreSolve就是检测到碰撞时要执行的方法,具体实现如下:

function arrowPreSolve(contact,oldManifold){var contactPoint = new b2Vec2;var weldJointDef = new b2Joints.b2WeldJointDef;if(contact.IsTouching()){var bodyA =contact.GetFixtureA().GetBody();var bodyB = contact.GetFixtureB().GetBody();var objA = bodyA.GetUserData();var objB = bodyB.GetUserData();if (objA.name=="arrow" &&objB.name=="arrow") {for (var j = bodyA.GetJointList(); j; j=j.next) {bodyA.GetWorld().DestroyJoint(j.joint);}for (j=bodyB.GetJointList(); j; j=j.next) {bodyB.GetWorld().DestroyJoint(j.joint);}}if (objA.name=="arrow" &&objB.name=="target") {if (objA.isflying) {weldJointDef = newb2Joints.b2WeldJointDef;weldJointDef.Initialize(bodyB,bodyA,bodyA.GetWorldCenter());bodyB.GetWorld().CreateJoint(weldJointDef);}console.log("Hit Target!");}if (objB.name=="wall"&&objA.name=="arrow") {if (objA.isflying) {weldJointDef = newb2Joints.b2WeldJointDef;weldJointDef.Initialize(bodyA,bodyB,bodyB.GetWorldCenter());bodyA.GetWorld().CreateJoint(weldJointDef);}}if (objB.name=="arrow") {objB.isflying=false;}if (objA.name=="arrow") {objA.isflying=false;}}
}

几个条件语句分别处理箭与箭碰撞,箭与靶子碰撞和箭与墙壁碰撞这三种情况,最后更新箭的飞行状态。设置箭飞行状态的主要目的就是保证当前世界中只有一支活动的箭。

平时一些小游戏在射箭或者发生炮弹的时候都会有一个能量槽来表示力度的大小,接下来就向这个小游戏中添加一个能量槽,按鼠标时间越长,射箭的力度越大。

首先向arrow.html文件中添加下面的div,表示能量槽,在后面的JS代码中动态更新它的长度。

<divid="power_bar"></div>

然后在JS文件中修改鼠标消息响应方法,并添加一个定时修改能量槽长度的方法calculateStrength:

functiononMouseDown(e){if(arrowGame.state == arrowGame.STATE_PLAY){if(allowCreateArrow()) {arrowGame.chargeTaskID =setInterval(calculateStrength, 25);}}
}functiononMouseUp(e) {if(arrowGame.state == arrowGame.STATE_PLAY){// Only one arrow in gaming.if(allowCreateArrow()) {createArrow(e.clientX-canvasPosition.x,e.clientY-canvasPosition.y,arrowGame.power);clearInterval(arrowGame.chargeTaskID);arrowGame.power = 0;}}
}functioncalculateStrength() {      arrowGame.power++;arrowGame.powerBar.style.width =arrowGame.power*10 + "px";if(arrowGame.powerBar.style.width =="300px"){clearInterval(arrowGame.chargeTaskID);}
}

在鼠标按下时,开启定时器,增加能量槽的长度,当鼠标弹起时,根据当前的鼠标位置和能量槽长度创建一支箭。

效果如下图:

为方便后面编程,对整个JS文件的结构进行了修改,使用一个全局结构存储游戏状态,并修改整个流程,细节部分可以参照源代码。

源代码下载地址

[HTML5]使用Box2dWeb模拟射箭效果并添加能量槽相关推荐

  1. [HTML5]使用Box2dWeb模拟飞行箭矢

    Box2d是一个2D游戏物理引擎,由Erin Catto开发,于2007年发布.很多2D游戏都用过Box2d,其中最有名的自然是愤怒的小鸟.Box2d本身是C++编写,但在不同平台都有它的衍生版本,像 ...

  2. delphi 实现屏幕旋转代码_Cocos Creator模拟射箭效果 | 附代码

    1 获取代码 关注微信公众号,发送[射箭]获取代码 2 效果预览 3 操作方法 点击屏幕,屏幕出现起始位置标志的圆点,不松开手指,滑动屏幕,控制力度和方向,移动距离越大,弓箭拉伸效果越大,松开以后,箭 ...

  3. Cocos Creator下JavaScript模拟射箭效果,附代码

    获取代码 关注微信公众号,发送[射箭]获取代码 效果预览 操作方法 点击屏幕,屏幕出现起始位置标志的圆点,不松开手指,滑动屏幕,控制力度和方向,移动距离越大,弓箭拉伸效果越大,松开以后,箭将沿着结束点 ...

  4. Cocos Creator模拟射箭效果 | 附代码

    1 获取代码 感谢「一枚小工」的投稿,关注他的微信公众号,发送[射箭]获取代码 2 效果预览 3 操作方法 点击屏幕,屏幕出现起始位置标志的圆点,不松开手指,滑动屏幕,控制力度和方向,移动距离越大,弓 ...

  5. canvas三角函数模拟水波效果

    原文:canvas三角函数模拟水波效果 最近项目中,ui设计了个水波效果的背景动画,然而并没有gif或svg动画,开始试着用css实现了一下,动画效果并不是很好,网上查了下基本都是用贝赛尔曲线实现,想 ...

  6. html5怎么产生手风琴效果,Html5 js如何实现手风琴效果

    Html5 js如何实现手风琴效果 发布时间:2020-08-03 09:54:10 来源:亿速云 阅读:92 作者:小猪 这篇文章主要为大家展示了Html5 js如何实现手风琴效果,内容简而易懂,希 ...

  7. OpenGL实现碰撞检测与模拟重力效果(简单的物理系统)

    最近在做一个OpenGL的小游戏,想要实现碰撞检测与模拟重力效果,即类似Unity3d的物理引擎.碰撞检测参考了一篇博文: http://blog.csdn.net/zju_fish1996/arti ...

  8. 实现osgEarth三维仿真场景模型雾的效果的添加解决方法

    在osgearth项目开发的过程中,为了实现逼真的三维场景可视化效果,需要对模型进行雾化处理,从而实现雾的自然天气情况模拟.在这过程中,利用OSG的osg::Fog类实现雾的效果,实现的效果如图1所示 ...

  9. cocoscreator实现射箭效果

    示例: 1:创建一个箭 -创建一个row节点为箭节点,添加刚体组件,并设置刚体Type为静态Static- 2:创建并挂载脚本 -创建一个脚本并挂载在bg节点上- 3: code cc.Class({ ...

最新文章

  1. container-as-a-service-0x00 -- 基于Docker的私有云混合云搭建需求
  2. 一件代发系统php网站源码_靠谱礼品代发平台网站一件代发(0.5元)
  3. iOS 13 真机调试包
  4. 嵩天-Python语言程序设计程序题--第九周:Python计算生态纵览
  5. 计算机程序的思维逻辑 (12) - 函数调用的基本原理
  6. [算法题] Search in Rotated Sorted Array
  7. c语言编程 排序,C语言编程-9_3 排序
  8. ulead gif animator_搞笑GIF:家庭聚餐,还有三十多个没来呢?|搞笑gif
  9. silverlight 中缓存应用程序相应的库文件
  10. 基于php和mysql的网上购物系统设计与实现_基于PHP+MySQL的网上购物系统设计与实现...
  11. mac 右键 启动终端
  12. python自动注册邮箱_python+selenium实现163邮箱自动登陆的方法
  13. tensorboard侧视_如何调整侧视/后视镜(以及为什么需要3台显示器)
  14. java填空题_JAVA填空题复习(有答案).doc
  15. 计算机网络面试常见问题
  16. 微信带参二维码数据解析
  17. 苹果ios系统企业级开发者授信下载app时出现:‘此app开发者需要更新’‘出现一朵云app无法打开’有的手机可以打开有的手机无法打开情况解决方案
  18. MSYS是什么,他与CYGWIN有什么区别?
  19. oVirt管理端高可用模式搭建(hosted-engine)
  20. 杂交水稻 CET4/6

热门文章

  1. 模板之家php mysql_PHP+APACHE+MYSQL安装方法
  2. python读mat文件_我用Python对咪蒙的1013篇历史文章做了一次深度的数据分析...
  3. python time库_python中time库的实例使用方法
  4. ios更新了系统无服务器,iPhone更新iOS 12.0.1系统失败怎么办?
  5. Android/ios手机销售榜信息
  6. nlv sqlserver_SQLServer数据类型及使用分析
  7. 使用这个插件,fiddler抓包直接生成httprunner脚本
  8. vc6.0 debug 比 release 快??_全网稀缺的快应用开源项目熊宝儿歌故事QuickApp
  9. 电脑分辨率是什么_吵翻天的2K、3K、4K屏到底是什么鬼?
  10. mysql自动备份工具 linux_自动备份MYSQL方法 (Linux)