H5游戏开发:决胜三分球
前言
本次是与腾讯手机充值合作推出的活动,用户通过氪金充值话费或者分享来获得更多的投篮机会,根据最终的进球数排名来发放奖品。
用户可以通过滑动拉出一条辅助线,根据辅助线长度和角度的不同将球投出,由于本次活动的开发周期短,在物理特性实现方面使用了物理引擎,所有本文的分享内容是如何结合物理引擎去实现一款投篮小游戏,如下图所示。
准备
此次我使用的游戏引擎是 LayaAir,你也可以根据你的爱好和实际需求选择合适的游戏引擎进行开发,为什么选择该引擎进行开发 ,总的来说有以下几个原因:
- LayaAir 官方文档、API、示例学习详细、友好,可快速上手
- 除了支持 2D 开发,同时还支持 3D 和 VR 开发,支持 AS、TS、JS 三种语言开发
- 在开发者社区中提出的问题,官方能及时有效的回复
- 提供 IDE 工具,内置功能有打包 APP、骨骼动画转换、图集打包、SWF转换、3D 转换等等
物理引擎方面采用了 Matter.js,篮球、篮网的碰撞弹跳都使用它来实现,当然,还有其他的物理引擎如 planck.js、p2.js 等等,具体没有太深入的了解,Matter.js 相比其他引擎的优势在于:
- 轻量级,性能不逊色于其他物理引擎
- 官方文档、Demo 例子非常丰富,配色有爱
- API 简单易用,轻松实现弹跳、碰撞、重力、滚动等物理效果
- Github Star 数处于其他物理引擎之上,更新频率更高
开始
一、初始化游戏引擎
首先对 LayaAir 游戏引擎进行初始化设置,Laya.init
创建一个 1334x750 的画布以 WebGL 模式去渲染,渲染模式下有 WebGL 和 Canvas,使用 WebGL 模式下会出现锯齿的问题,使用 Config.isAntialias
抗锯齿可以解决此问题,并且使用引擎中自带的多种屏幕适配 screenMode
。
如果你使用的游戏引擎没有提供屏幕适配,欢迎阅读另一位同事所写的文章【H5游戏开发:横屏适配】。
12345678 |
...Config.isAntialias = true; // 抗锯齿Laya.init(1334, 750, Laya.WebGL); // 初始化一个画布,使用 WebGL 渲染,不支持时会自动切换为 CanvasLaya.stage.alignV = 'top'; // 适配垂直对齐方式Laya.stage.alignH = 'middle'; // 适配水平对齐方式Laya.stage.screenMode = this.Stage.SCREEN_HORIZONTAL; // 始终以横屏展示Laya.stage.scaleMode = "fixedwidth"; // 宽度不变,高度根据屏幕比例缩放,还有 noscale、exactfit、showall、noborder、full、fixedheight 等适配模式... |
二、初始化物理引擎、加入场景
然后对 Matter.js 物理引擎进行初始化,Matter.Engine
模块包含了创建和处理引擎的方法,由引擎运行这个世界,engine.world
则包含了用于创建和操作世界的方法,所有的物体都需要加入到这个世界中,Matter.Render
是将实例渲染到 Canvas 中的渲染器。
enableSleeping
是开启刚体处于静止状态时切换为睡眠状态,减少物理运算提升性能,wireframes
关闭用于调试时的线框模式,再使用 LayaAir 提供的 Laya.loading
、new Sprite
加载、绘制已简化的场景元素。
1234567891011121314 |
...this.engine;var world;this.engine = Matter.Engine.create({ enableSleeping: true // 开启睡眠});world = this.engine.world;Matter.Engine.run(this.engine); // Engine 启动var render = LayaRender.create({ engine: this.engine, options: { wireframes: false, background: "#000" }});LayaRender.run(render); // Render 启动... |
1234567 |
...// 加入背景、篮架、篮框var bg = new this.Sprite();Laya.stage.addChild(bg);bg.pos(0, 0);bg.loadImage('images/bg.jpg');... |
三、画出辅助线,计算长度、角度
投球的力度和角度是根据这条辅助线的长短角度去决定的,现在我们加入手势事件 MOUSE_DOWN
、MOUSE_MOVE
、MOUSE_UP
画出辅助线,通过这条辅助线起点和终点的 X、Y 坐标点再结合两个公式: getRad
、getDistance
计算出距离和角度。
1234567 |
...var line = new this.Sprite();Laya.stage.addChild(line);Laya.stage.on(this.Event.MOUSE_DOWN, this, function(e) { ... });Laya.stage.on(this.Event.MOUSE_MOVE, this, function(e) { ... });Laya.stage.on(this.Event.MOUSE_UP, this, function(e) { ... });... |
12345678910111213 |
...getRad: function(x1, y1, x2, y2) { // 返回两点之间的角度 var x = x2 - x1; var y = y2 - x2; var Hypotenuse = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)); var angle = x / Hypotenuse; var rad = Math.acos(angle); if (y2 < y1) { rad = -rad; } return rad;},getDistance: function(x1, y1, x2, y2) { // 计算两点间的距离 return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));}... |
四、生成篮球施加力度
大致初始了一个简单的场景,只有背景和篮框,接下来是加入投篮。
每次在 MOUSE_UP
事件的时候我们就生成一个圆形的刚体, isStatic: false
我们要移动所以不固定篮球,并且设置 density
密度、restitution
弹性、刚体的背景 sprite
等属性。
将获得的两个值:距离和角度,通过 applyForce
方法给生成的篮球施加一个力,使之投出去。
12345678910111213141516171819 |
...addBall: function(x, y) { var ball = Matter.Bodies.circle(500, 254, 28, { // x, y, 半径 isStatic: false, // 不固定 density: 0.68, // 密度 restitution: 0.8, // 弹性 render: { visible: true, // 开启渲染 sprite: { texture: 'images/ball.png', // 设置为篮球图 xOffset: 28, // x 设置为中心点 yOffset: 28 // y 设置为中心点 } } });}Matter.Body.applyForce(ball, ball.position, { x: x, y: y }); // 施加力Matter.World.add(this.engine.world, [ball]); // 添加到世界... |
五、加入其他刚体、软体
现在,已经能顺利的将篮球投出,现在我们还需要加入一个篮球网、篮框、篮架。
通过 Matter.js 加入一些刚体和软体并且赋予物理特性 firction
摩擦力、frictionAir
空气摩擦力等, visible: false
表示是否隐藏,collisionFilter
是过滤碰撞让篮球网之间不产生碰撞。
123456789101112131415161718192021222324252627282930 |
...addBody: function() { var group = Matter.Body.nextGroup(true); var netBody = Matter.Composites.softBody(1067, 164, 6, 4, 0, 0, false, 8.5, { // 篮球网 firction: 1, // 摩擦力 frictionAir: 0.08, // 空气摩擦力 restitution: 0, // 弹性 render: { visible: false }, collisionFilter: { group: group } }, { render: { lineWidth: 2, strokeStyle: "#fff" } }); netBody.bodies[0].isStatic = netBody.bodies[5].isStatic = true; // 将篮球网固定起来 var backboard = Matter.Bodies.rectangle(1208, 120, 50, 136, { // 篮板刚体 isStatic: true, render: { visible: true } }); var backboardBlock = Matter.Bodies.rectangle(1069, 173, 5, 5, { // 篮框边缘块 isStatic: true, render: { visible: true } }); Matter.World.add(this.engine.world, [ // 四周墙壁 ... Matter.Bodies.rectangle(667, 5, 1334, 10, { // x, y, w, h isStatic: true }), ... ]); Matter.World.add(this.engine.world, [netBody, backboard, backboardBlock]);} |
六、判断进球、监听睡眠状态
通过开启一个 tick
事件不停的监听球在运行时的位置,当到达某个位置时判定为进球。
另外太多的篮球会影响性能,所以我们使用 sleepStart
事件监听篮球一段时间不动后,进入睡眠状态时删除。
123456789101112 |
...Matter.Events.on(this.engine, 'tick', function() { countDown++; if (ball.position.x > 1054 && ball.position.x < 1175 && ball.position.y > 170 && ball.position.y < 180 && countDown > 2) { countDown = 0; console.log('球进了!'); }});Matter.Events.on(ball, 'sleepStart', function() { Matter.World.remove(This.engine.world, ball);});... |
到此为止,通过借助物理引擎所提供的碰撞、弹性、摩擦力等特性,一款简易版的投篮小游戏就完成了,也推荐大家阅读另一位同事的文章【H5游戏开发】推金币 ,使用了 CreateJS + Matter.js 的方案,相信对你仿 3D 和 Matter.js 的使用上有更深的了解。
最后,此次项目中只做了一些小尝试,Matter.js 能实现的远不止这些,移步官网发现更多的惊喜吧,文章的完整 Demo 代码可【点击这里】。
如果对「H5游戏开发」感兴趣,欢迎关注我们的专栏。
参考
Matter.js
LayaAir Demo
H5游戏开发:决胜三分球相关推荐
- H5游戏开发包括哪些游戏类型
H5在微信还没有诞生的时候,就已经在各大手机应用方面展露头角.最早的H5小游戏,例如4399公司开发的,开始了新一轮的热潮.随着微信的推出,很多H5游戏开始嵌入到微信公众号.微信群.朋友圈. H5因其 ...
- H5游戏开发很重要,后台可控可测,超圣刷流水,招代理稳赢
H5游戏开发很重要,后台可控可测,超圣刷流水,招代理稳赢 不想出去打工?不行出去被老板指手画脚?轻松兼职,家中工作,刷流水一万得200,微信游戏包赢,牛牛,金花,三公各大游戏.VX244107639, ...
- H5游戏开发:一笔画
一笔画是图论科普中一个著名的问题,它起源于柯尼斯堡七桥问题科普.数学家欧拉在他1736年发表的论文<柯尼斯堡的七桥>中不仅解决了七桥问题,也提出了一笔画定理,顺带解决了一笔画问题.用图论的 ...
- 移动端h5游戏开发中的动画和动效展示
在移动端h5游戏开发中,经常会遇到动画和动效的展现需求,比较常用的实现方法有css3.svg.定时器等,针对不同的场景和需求使用不同的技术,可以提升设计和开发的效率,保证产品的效果和质量,也能让用户有 ...
- H5游戏开发:消灭星星
「消灭星星」是一款很经典的「消除类游戏」,它的玩法很简单:消除相连通的同色砖块. 1. 游戏规则 「消灭星星」存在多个版本,不过它们的规则除了「关卡分值」有些出入外,其它的规则都是一样的.笔者介绍的版 ...
- H5游戏开发之扫雷-李强强-专题视频课程
H5游戏开发之扫雷-119人已学习 课程介绍 <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷 ...
- 微信H5游戏开发需要注意什么?
微信H5游戏开发需要注意什么? 如果一些企业要做H5游戏开发的话,首先要明确思考H5开发的内容和推广方式,同时开发时也要注意一些技术问题.七猫网络小编在这总结一下开发H5游戏时需要注意的几个问题的要点 ...
- 微信H5游戏开发的发展与现状
2021年,随着诸多企业和品牌借助H5游戏营销一次次赚的盆满钵满,尚未布局的商家们除了羡慕,还依旧抱着观望,不敢尝试的想法.经过与此类商家的深入交流,不难发现此类商家疑虑的是H5游戏本身的特性,TOM ...
- H5游戏开发:推金币
近期参与开发的一款「京东11.11推金币赢现金」(已下线)小游戏一经发布上线就在朋友圈引起大量传播.看到大家玩得不亦乐乎,同时也引发不少网友激烈讨论,有的说很带劲,有的大呼被套路被耍猴(无奈脸),这都 ...
最新文章
- 程序员过年最怕问到什么?
- EDAS ScheduleX 问题
- 文献学习(part14)--Structural Deep Network Embedding
- latex插入gif_如何将照片和GIF插入Google幻灯片
- C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④
- Codeforces Round #643 (Div. 2)(A, B, C, D, E)
- poj 2886Who Gets the Most Candies?
- spring-boot整合场景实例分析
- vue3.0实现地图功能
- ASP.NET URL Routing
- python max int
- 关于备考软考过程中历年真题的说明
- 一个Web前端实习生的简历
- 取消windos开机时的磁盘检查,提升开机速度
- 某大厂测开面试题解析(python)——给1-100编号,每次从中拿走奇数位数字,剩下重新编号,再拿走奇数位,循环多次到最后剩下一个数字,请返回这个数字的原始编号
- 【新人求助】苹果允许开发者制作类似按键精灵的app吗?
- 案例十三、模仿微信打飞机游戏
- Hadoop退出安全模式
- 手机验证码的测试用例梳理
- 风控人都在夸交通出行数据好用,那就来看看如何挖掘与应用此类数据