获得徽章 0
- #每天一个知识点#
2023/06/25
游戏中场景的概念(scene)
在前一个项目中是只有一个场景的,但是在后面的第二个项目,是把游戏分为两大类主场景的。首先多分场景能更清楚管理项目,我们确保同一时刻只有运行一个场景,而切换场景的时候就把上一个场景的东西都回收。如果没有使用场景,之前的开发有一个问题,那就是我们有一个金币栏的组件,没有区分场景的时候,即使进入关卡,实际上大厅的东西都是存在的,只不过看不到(被遮罩了),这时候就可能触发一些错误监听。
当然也有支持单场景的开发,单场景的话,其实就能不用考虑太多数据传递的问题。不过目前我们项目中,是把核心控件都提取出来设置为常驻,就算切换场景也不会被销毁。
对于是单场景还是多场景,其实还是得看实际的业务开发,没有绝对的正确,多场景的话便于管理,清晰,但是得考虑场景切换逻辑比较复杂,单场景所有资源都能管理处理,缺点是没法很好的管理展开赞过评论2 - #每天一个知识点#
2022/06/23
说说在 2D游戏中实现一个一些效果吧。前端时间公司新项目需要尽可能的模拟现实中游戏的场景,也就是说我们需要实现一个3D 曲面的效果,可是我们现在的是一个 2D游戏,要基于原本的项目框架,如何实现呢?这边试验的方案首先是直接写 shader 处理渲染,简单来说就是曲面就是一个双曲线的效果嘛,所以我们计算出一个长方形投影映射为双曲线的转换公式,然后来做处理。这是方案一,其实开始也实现了这个曲面的效果,但是这个计算过程太麻烦了、后面同事又给出另有一种方式,那就是建模,这里是建了一个曲面的模型,然后我们拿到摄像机的渲染的纹理,把这个纹理设置到这个模型上,也能达到效果,这也算一种方案吧。不过其实这些都算野路子的实现,真正想实现3D的效果,其实还是应该用 3D去做,但是这样成本太高了,不过其实吧研究使用这些野路子的过程和后续的一些问题,也花了不少时间~展开赞过评论1 - #每天一个知识点#
2023/06/21
cocos ceater对象池
在 cocos ceater 中实现对象池主要是两个基本方法,那就是获取节点,以及存储节点
获取节点的时候,我们传入需要实例的预制体,和该该节点钩挂的父节点。那么我们实现中,我们可以通过节点的名来作为 key,然后先查看是有以及有该节点池,有的话直接拿,要是没有的话我们得克隆出来,而要是没有该节点的对象池的,就需要创建该节点的对象池。
而存储的方法中,我们就是需要把该节点传入,然后判断是否有该节点池,有的话存入,没得话就得创建该节点的对象池来存入
然后我们在每一个克隆节点的地方就能换为对象池中的 getNode方法,然后销毁的地方使用 pushNode 方法,下面是最简单基本的一个实现,具体开发中,我们还需要更多的条件和对应的函数等展开赞过评论1 - #每天一个知识点#
2022/06/20
聊聊cocos ceater 中文件的摆放吧,其实项目的文件摆放不是随便摆的,首先直观上是为了我们分类清晰,另外文件的存放还影响分包热更之类。
首先我们的包应该尽可能拆散,这是为了我们的热更能尽可能的小,因为我们的更新是以一个包为标准的,那么如果我们的包都很大,那么我们只要改变了里面的一点东西,这次热更新这一整个包都得更新,这就会导致热更量过大。基于此因为 resource 包每次是必须加载的,所以不应该加入过多东西,以及频繁发生变动(上线后)。对于业务中每一个部分应该尽可能分为相应的一个包。然后包内,比如一个活动,我们一般都会里面创建有 anim / prefabs / textures /sound 等四个文件夹来存放这个活动或者关卡的对应资源等。注意代码不会放在这里面,我们的脚本应该独立所有,作为单独一部分,因为脚本是我们常变动的东西,我们不要把它放到 bundles 和 resource 里面去。展开赞过评论2 - #每天一个知识点#
2023/0619
我们在 cocos ceater 如果不通过动画组件直接代码设置播放 sp.skeleton 动效,在2.4.5版本是没有看到有指定次数的方法的在调用播放的API中,所以下面是自己捣鼓的两种实现方式,一种是我们通过打标签的方式,我们监听动画的完成,完成之后次数加一,然后再次播放动效。而第二种方式我们处理播放spin动效返回的信息,我们通过处理这个动效的 spin 的 track信息来判断执行次数了。关于spin动效的信息可以看这里zh.esotericsoftware.com
展开等人赞过67 - #每天一个知识点#
2023/06/18
cocos creator 触摸事件单点和多点
在cocos ceater 2.4.5版本,是没有切换多点触控和单点触控的全局开关的。一般当我们游戏中不需要多点的时候,我们就得处理多点事件。查阅论坛和一些资料,发现一般就是使用触摸事件中返回的 event 中的 getID的值,判断当前事件的 getID 为 0 就表明示当前事件,如果不是,则表明为第二个触摸事件,就此可知 cocos creator的触摸事件ID,是从零开始开始赋值的。
试验在浏览器中,微信小程序,和安卓中都是这个规则。但是在ios的设备上,并非如此,而是返回一个很大的数。所以该方法在 IOS上是不行的,论坛也又引擎官方说明了这个问题。这里要记得注意一下。展开赞过评论2 - #每天一个知识点#
2023/06/17
cocos ceater 手指的触控和平板上触控
游戏中我们常可能会有这样一个功能,就是一个可以点击拖拽移动位置的 Icon,而且一般我们会按下拖拽的的时候把它的透明度至为100这样,方便玩家知道这是可以拖拽的。实现这个小功能并不难,思路上是下面的几个步骤:
● 首先我们是要监听按下start的状态,这时候我们需要一个 isMove 的标签,因为我们得区分是点下的操作还是移动的操作。
● 然后我们监听移动,也就是 cc.Node.EventType.TOUCH_MOVE ,监听手指在屏幕的移动。,在这里添加我们的回调函数,执行透明度设置,设置位置变化的操作
● 最后我们监听按下end的状态,这里判断之前是移动还是点击,用来处理相应的操作吗,点击的话就处理点击的逻辑,移动的话就恢复透明度之类的
下面放个实现的代码(哈哈哈,示意个实现思路就算了,回想这个还是毕业刚入职的时候写的了,现在一看很是问题,别问为啥不改,能运行的代码就是好代码,哈哈哈)
然后,现在才是今天我想说的问题,那就是实现这个功能中会有个小坑,在网页和手机上当时试过效果还行,但是后面在大屏设备上发现想要点击的时候没法点击,会触发拖拽移动。这是因为在大屏中,手指显得比较大,我们点下去就会触发 cc.Node.EventType.TOUCH_MOVE,所以没有响应点击事件,这里其实解决比较简单,也就是判断位移位移大于一个值(这里是2.5)的时候才是发生位移状态,另外 X 和 Y 都要监听哦。展开赞过评论1
,之前搜索过一些提交规范,给大家参考一下