您好、欢迎来到现金彩票网!
当前位置:打鱼棋牌游戏平台 > 物理布局 >

研究一下物理引擎做了个游戏文末有感

发布时间:2019-06-12 17:36 来源:未知 编辑:admin

  前阵子过春节,在家看小孩没法出去玩,于是就码起来了,心血来潮想做个基于物理引擎的小游戏,于是愉快地打开了 Cocos Creator。

  一年多前,我开始学习小游戏开发,并尝试按全栈的方式去独立开发小游戏。由于做小游戏都抱着学习的心态,所以什么不擅长就临时学一下。最后整个游戏的策划、交互、视觉设计、音效设计、前端开发、后台开发、性能调优、功能测试等工作都一人包揽了。

  所用到的 IDE 包括(仅供参考,其他同行有更好的工具推荐的话,记得留言哦):

  Cocos Creator,主要用于视觉还原、主逻辑开发、跨端调试和编译。个人觉得这是超给力的游戏开发工具,把 component 的机制直接可视化,集成各种物理引擎、粒子引擎、UI 组件等功能,大大节省了游戏UI以及部分特效逻辑的研发成本。但小游戏版本的编译速度还是很慢啊。

  Visual Stuido Code,用于代码开发。这好像是最近最流行的代码撰写工具了,免费且稳定啊!

  微信开发者工具,用于微信私有功能开发,云开发,小游戏提审。相比早期的版本微信开发者工具的体验优化了很多,但在文件监听侧还是有点问题,跟 Cocos Creator 的联动,经常会出现 Cocos Creator 编译好文件,微信开发者工具会报错的问题。

  Google Chrome,web版游戏调试。有些时候一些性能调优可以放在 chrome 上面,它有非常专业的调试工具。

  从涉及的 IDE 看出来,其实开发一个游戏需要兼顾好多内容,尽管游戏提供的功能并不多,但实际研发时间却不短,花了整个春节假期(WTF,明明就几天)

  实际上,游戏开发相比页面开发,我认为前者更难,它更像一门综合技术,世界观构建、内容建设、美术构建、音效设计、程序算法等等,很多方面都需要涉猎,这里面的每项内容都够我钻研很长一段时间了。

  虽然自身策划能力很业余,但在动手开发前,再简陋的策划步骤还是省不了的,预先策划有助于快速开发。

  早前预想的故事场景是开卡车在林中运输木材,核心玩法很简单:把木箱子运到指定的区域。

  整个游戏基于仿真物理场景,唯一一点超现实的功能是用蓝墨水画的线条会被实体化,会成为物理碰撞体,玩家可借此搭建桥梁、容器、障碍物等方式来协助搬运。

  而为了解决内容构建的问题,我为游戏提供了一个开放的模式,那就是:玩家可自主创建关卡。

  这样的话,关卡是能动态新增的,任何人都可以随时随地在手机上去为本游戏构建关卡,我也可以脱离电脑很方便地为游戏设计初始关卡。

  这需要我在游戏开发中应用到原本网页设计的组件化思维,要把游戏里可能会出现的元素抽象为通用组件,然后构建一个编辑模式,让玩家拖动放置,进而设计出不同的关卡。

  游戏引进了金币的概念,它是整个游戏世界里的通用货币,目前构思中给金币赋予的作用有两个:a. 以 20 比 1 的方式兑换提示机会;b. 以 2000 比 1 的方式购买卡车皮肤(暂未实现)

  而金币的获取方式比较简单粗暴:签到、分享和看视频(还没到 1000 累计注册用户,所以没放开功能)

  鉴于内容太多,总的开发逻辑就不细说了,这里给一下开发过程中一些有用的经验。

  1.Widget,这能让某个元素自适应到任意位置。这是相当实用的控件了。使用方法非常简单,各种机型的自适应布局一下子就被兼顾了。

  1.动画定义,Cocos Creator 里为某个 Node 追加动画时,只要给它加 cc.Animation 组件,然后建立一个 animation-clip,针对它去可视化编辑动画的属性和帧状态,就能快速做出一个动画。

  2.动画事件监听,Cocos Creator 的动画控件里有一个我觉得非常实用的功能,那就是可以为动画的某一帧定义自定义监听事件(该事件代码体可定义在 Node 对应的用户脚本组件中),例如

  里过关时会有个弹框动画,在动画播放到差不多的时候,会播放一个音效,利用的就是动画的自定义事件。

  整个游戏世界就会进入物理监听状态,所有被定义成刚体(追加了 cc.RigidBody 组件)的 Node 将直接具备物理性质,通过追加 PhysicsCollider 控件可让 Node 具备指定热区的物理碰撞特性。

  碰撞体有一个挺有用的方法,getAABB,这是获取碰撞体包围盒的方法,可以用其结合 rect 的 containsRect 方法来实现对某个矩形区域里是否包含某碰撞体的功能,在

  它可以定义一些常用的物理场景,比如本游戏里,汽车轮子上用的就是物理引擎的 WheelJoint 控件:

  该控件可以模拟机车轮子的物理效果,让轮子跟某个刚体保持一定距离,并能自转。

  其实除了这类型的关节组件外,官方还提供了很多别的关节组件,具体的用法可以参考 Cocos Creator 的官方开发文档:

  1.testPoint 方法,该方法可以检测某个坐标点下是否存在物理碰撞体,

  2.rayCast 方法,该方法可以获取指定出发点到终点间射线所经过的刚体集合,

  这个方法的原生实现逻辑相当复杂,各种几何算法什么的,反正几何数学没学好的花叔如果要以原生方式实现,也只能勉强实现很挫的效果,但 Cocos Creator 直接就封装好供大家调用了,非常方便。

  它可以把某个节点像场景那样单独存为一个文件,然后在不同场景中引用,并通过:

  方法进行预制对象节点的复制,这样可以实现节点逻辑的复用,用来做节点组件最合适不过了。

  不管是创作模式还是“闯关模式”里的地图元素的基础数据模型均来自该预制对象,如果需要新增地图元素,只要修改这个预制对象即可全局生效,可以说非常方便了。

  但大家要注意,预制对象对性能有一定的反向作用,具体可以翻翻 Cocos Creator 的论坛,可以说它是双刃剑。

  想要了解 camera 的用法,还能研究一下官网提供的 demo,这里就不展开细说了:

  讲真,毕竟我也不是太深入地去了解过 Cocos Creator 的底层原理,所以性能优化这块就只能从自己这个项目来给点小技巧,以下稍微讲讲:

  降低 DrawCall 是提升游戏渲染效率一个非常直接有效的办法,而两个 DrawCall 是否可以合并为一个 DrawCall 的一个非常重要的因素就是这两个 DrawCall 是否使用了同一张贴图,所以官方是建议合图的。

  但我项目中用了那么多碎图,这时候让我去合图,岂不搞死我!苦恼之际以外发现 Cocos Creator 提供了一个强大的功能“自动合图(Auto Atlas)”

  不用不知道,一用吓一跳,这功能可以把当前目录以及子目录下所有的图片文件以指定的算法去合并成 sprite 图,并且自动更新原有 spriteFrame 的引用,一下子就把全部碎图合成大图来按需调用了。

  然而....我发现 drawcall 也没降低多少。没花太多时间去想为什么,这个方式我就先不关注了。

  节点如果没来得及释放,那么一定会导致 drawcall 上升,往这个方向想,我就想到tantiate(),在

  里只有这个方法会主动去新增节点,那么只要产生的临时节点及时销毁就行,但发现其实在复制完都调用了 removeFromParent() 方法,逻辑好像是对的。

  但后来查了一下资料,原来 removeFromParent 方法执行后,节点并不会自动销毁,真正能让它销毁的是 node 的 destroy 方法。囧大了。应该换成 destroy。于是就全局搜索 removeFromParent,逐一替换,drawcall 就顺利降下来了。

  除上述常规手段外,针对自己的代码也需要做一下优化,本游戏的代码逻辑中最有可能优化的地方是“画线”部分:

  2.监听节点上 touchmove,每次移动的时候对它上面的 cc.Graphics 组件进行 lineTo 的画线处理,同时存储每个移动点

  1.当前移动点与上一个移动点的直线距离少于一个限定值,就认为当前移动点无效。(相当于强制移动点的距离)

  相应的判断代码很简单,利用 Cocos Creator 提供的向量求距的方法即可:

  2.“当前移动点跟上一个移动点的移动方向”如果跟“上一个移动点跟上上个移动点的移动方向”一样的话,那么上一个移动点即可销毁不做记录。(相当于把直线部分的移动点压减为两端点)

  依靠上述 3 种方式,我大概能把 drawcall 控制在 50 左右,但其实效果还是能优化。

  Cocos Creator 就性能优化来说,还提供了“节点池”和动态合图的优化方式,本游戏目前还没有应用上,未来也许可以试试。

  花叔怎么说也从事互联网快 10 年了,现在对于平时的工作也不需要单纯的执行,也许从旁指导一下就算完事了。所以有人会问:你怎么还孜孜不倦地画图、写代码、做 demo 呀?还需要吗?

  我就给他说了一件事,从前有一天,我指导另一个同事的项目,振振有词有理有据,但同事反问我一句:你多久没写代码了?这里面是 xxxxx 这样的。

  虽然还是答上去了,但后来我就在想,幸好他这个项目我以前研究过,不然就凭那句“你多久没写代码了”,我就直接把主导权送出去了。

  企业获利大多是基于信息不对称,谁是信息上游,谁就更有可能控制局面;管理者、策划者给的是方向,固然重要,但信息不对称的事情大多在于技术层。

  我见过 cp 怎样用技术忽悠需求方,特别是高新技术层面的事情,忽悠起来简直轻而易举。

  有时候,我们转型、通道转通道、技术转管理,以为是找了个更好更适合的方向。

  其实我看到更多可能的:1.专业到了瓶颈,对瓶颈逃避而选择转型罢了;2.专业能力突出被授予管理权力,然后就以为要转型了;3.真的不适合本专业

  第三点且不说,前两点,何曾想过你想转向的领域,缺你吗?你苦心经营的技术不时而锻炼就会淡忘,就愿意因为一点点小瓶颈而舍弃吗?

  花叔,是一名腾讯的 UI 工程师,同时也是一名游戏开发狂热爱好者,欢迎各位开发者点击【阅读原文】与作者直接交流,也欢迎关注他的微信公众号:MinProgram,小小程序,大大思路!

  前面两篇我们介绍了物理投篮小游戏的界面布局、物理组件的基本使用方法,从今天开始进入编程篇的内容。难度在逐渐加深,为了不给大家造成阅读负担,程序篇会分成多次来讲,每篇教程尽量简单,就算没有编程基础,跟着源码、注释、讲解、视频,相信也能帮助大家快速上手Cocos Creator...

  一、模块 cc Cocos 引擎的主要命名空间,引擎代码中所有的类,函数,属性和常量都在这个命名空间中定义。 二、常用API 网站

  往期技术派文章: 第01期《野蛮人大作战》从开发到上线期 Cocos Creator 2.0 摄像机的灵活运用 第03期 插件推荐 CC_inspector + 第04期 实时竞技小游戏技术分享 技术派第 05 期,Cocos 邀请到了具有多年手游开发经验的大掌教,...

  Cocos 巡回沙龙已于 6 月 9 日在成都收官,活动暂时告一段落,但汇集了众多开发者的交流群却还蛮活跃的,除了技术问题交流,还有行业资讯八卦和招聘等等,C 姐平时也很爱刷群消息,近日我就在广州沙龙交流群中刷到了一篇开发者转发分享的文章: 这是一位自学游戏开发的同学讲述了...

  我对咸菜是有情怀的,不光是我,只要是农村长大的人儿都是对咸菜有感情的。在我们眼中,咸菜不是咸菜,不是调味品,就是跟蔬菜一样的菜了。吃饭的时候没有蔬菜,只有它们相陪伴,所以最难忘。 这里的咸菜概念是比较宽泛的,并不是特指某一种咸菜,而且各种味道咸的,借它来下饭的搭配物的总称,...

  满屏都是锦鲤,跟你有关系的有几个呢?裂变时代的红利还能维持多久?知识付费是风口还是浪尖?满脑子的问号,却一脸懵逼的人多的是吧?可不管怎么着,还是一个字:干!风里雨里工地等你……为什么会默认关联这个词?

  肠胃最怕凉 夏天,冰淇淋、冷饮、冰冻水果,吃起来那叫个过敏!但夏季也是肠道疾病的高发期,专家建议,这个季节少吃太凉的东西,尤其早晨起床时和晚上临睡前。为了及时给肠胃保暖,吃凉拌食物时,不妨加点姜或芥末,可以暖胃、杀菌。 颈椎最怕吹 天气热自然很多家庭都长时间开着空调,颈椎对...

  #面向对象的封装性 1.创建一个A类型的对象 A c = new A();。 2.赋值(这里就可以读取了。只是值是系统默认的)。 3.读取 # private的运用 1.用private修饰的数据只能在本类中访问。(外面访问不了了)。安全了。 2.面向对象的封装性指的是属...

  相识五年,恋爱四年,但都抵不过异地的一年。最后,他还是说出了分手,而我们之间,也随着“分手”那两个字,都烟消云散了。 他是我学长,我是他学妹;他是部门的部长,我是他手下的小兵;就这样,很自然而然的,他就成了我男朋友,而我成了他的女朋友。 四年的相处,要说没有矛盾是不可能的,...

http://lotusyogacenter.com/wulibuju/169.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有