![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
游戏开发
文章平均质量分 87
丿寒风
网易游戏3年,游戏创业4年,3D设计软件架构师4年...
展开
-
Android 启动黑屏优化(Cocos Creator 游戏)
一 Android 显示结构cocos creator 在打包成 Android 之后,首先启动一个标准 Android 应用。因此需要先弄清楚 Android 应用的显示逻辑。每个 Android 应用显示由 Activity、Window、View 等组成。每个 Android 应用至少有一个 Activity;Activity 可以包含多个 Window,有一个 PhoneWindow 是根;在每个 Window 中,Acitivity 通过 setContentView 设置将 View 设置原创 2021-01-10 14:02:20 · 2126 阅读 · 1 评论 -
游戏地图主要功能实现
游戏地图功能主要分为三块:地图纹理地图阻挡小地图镜头跟随一 地图纹理1 原始实现地图最基础的做法,是出一张图,然后拖入到场景中;2 动态加载但这种做法只适合有一张主城地图的界面游戏,若有多张地图,在场景中设置的地图,可能不是游戏中所需的,所以需要动态加载地图。 loadMap(mapId) { this.mapId = mapId; let node = new cc.Node() node.setAnchorPoint(0,原创 2020-08-31 14:25:17 · 1531 阅读 · 0 评论 -
游戏角色动画:从入门到商用(二)
接上一节:游戏角色动画:从入门到商用(二)七 合并多图集的plist文件一般游戏做到上面一步就可以了,如果要进一步的优化,会发现每个图集都会产生 plist 文件,多个图集那么 plist 也会很多。通常一个角色的资源都是一次性加载进内存,图片资源因为有最大尺寸限制,只能分为多张不同的文件中,但 plist 文件并没有限制,有没有办法将多个图集的 plist 文件合并成一个文件呢?不幸的是,查阅了 TP的官方文档并没有这个功能。观察 plist 文件的结构:<?xml version="1.0"原创 2020-08-26 14:34:17 · 670 阅读 · 0 评论 -
游戏角色动画:从入门到商用(一)
2D游戏中的角色由两种方案,第一种是骨骼动画,骨骼动画的好处是节省资源,减少空间占用;但是缺点是表现力差,一般只做侧面2方向,主要用于横板过关类的游戏。第二种是逐帧动画,逐帧动画理论上来将可以做任意多个方向,但每1个方向就是1套序列帧,会占用大量的内存,因此一般是采用1方向,4方向和8方向。其中1方向的一般是npc,只是正面朝向玩家,4方向和8方向的一般位普通角色,细节要求不高的话,可以利用翻转节省对称方向的资源。传统的经典2D游戏,梦幻,大话,神武,传奇等都是采用这种方式实现的。一 动画资源设计方原创 2020-08-26 14:01:18 · 1457 阅读 · 0 评论 -
导表工具开发(支持 JSON,Python,Lua,JS)
一 需求及分析1 提取需求在正式的游戏开发团队中,策划很大一部分工作内容的产出,都是以 Excel 表格的形式。给到程序员后,通常都不会直接读取 Excel 表格的内容,而是先将 Excel 表格内容转换成程序语言能够识别的文本格式,比如:比较通用的 JSON格式,或者是 Lua 中的 Table,python 中的 Dictionary 等。那么,需求就出来了:实现一个工具,读取 Excel 表格内容,转换成各语言能够识别的文本格式。2 需求分析用面向对象的思维来分析上述需求,至少有读和写两个对原创 2020-08-11 17:30:17 · 1508 阅读 · 0 评论 -
地图编辑器开发(五)
上一节篇尾提到,地图要切成小图便于加载,但地图编辑器是个网页版工具,要在网页上实现切图不是很方便,经过考虑之后,决定使用 nodejs 实现。Electron要做一个图形化的切图界面,加上要能使用 nodejs,最先想到的就是 Electron。Electron 是一个 nodejs 的扩展库,可以使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序。若之前写过网页,上手比较简单。界面完全基于 HTML 和 CSS 实现,切图只需两个简单功能,选择图片和生成切图,生成包含地图块和原创 2020-07-23 21:59:47 · 1590 阅读 · 1 评论 -
地图编辑器开发(四)
前一节把测试功能加上了,地图信息编辑好,测试通过之后,需要导出到游戏中。这节来看数据的导出。主要包括以下几个功能点:导出地图信息地图数据压缩读取地图数据导出地图信息数据内容在导出地图信息之后,把数据格式定义好,必备数据有两个:阻挡遮罩信息和格子尺寸,其他的数据可以按需添加。getExportData() { return { size: [this.oriW, this.oriH], cell: [this.CELL_W, this.CELL_H],原创 2020-07-22 22:30:02 · 1168 阅读 · 0 评论 -
地图编辑器开发(三)
上一节已经把地图信息编辑做好了,这一节实现对编辑好的地图信息的测试。主要实现以下功能:A星寻路显示路径角色移动A星寻路A星寻路算法的基本概念,参考维基百科,算法核心有以下几个点:开放列表和关闭列表按 f 值排序回溯路径推荐一个视频教程,概念,算法过程,实现都讲得非常详细。A星寻路发酸最终要实现的是,传入地图信息,起点和终点,要得到一个从起点到终点的路径,即从起点到终点所经过的格子列表。核心代码如下: // 把起点放入开启列表中 this.openList.push(this.原创 2020-07-21 16:22:19 · 1338 阅读 · 0 评论 -
地图编辑器开发(二)
上一节已经把地图加载到游戏中了,这一节主要实现地图的编辑能功能,也是地图编辑器最主要的功能,可以拆分为如下几个功能:地图滚动地图缩放画网格编辑格子信息地图滚动上一节中加载进来的地图,只显示了地图的一部分,要能编辑整个地图,需要地图能够滚动。因此需要将地图 sprite 放入到一个 ScrollView 中,设置水平和竖直方向都能滚动,删除滚动条,防止挡住地图,如图:运行结果如下图:这样地图就滚动了,按住鼠标就能拖动地图。但是还有问题,窗口显示的范围并没有变大,希望能通过缩放,在窗口中原创 2020-07-18 21:58:36 · 1873 阅读 · 0 评论 -
地图编辑器开发(一)
引言寻路是RPG游戏中必不可少的一部分,那么如何实现寻路呢?游戏中最常用的寻路算法是A星。A星寻路的基础是把地图划分成很多小格子,然后在格子上做不同的标记,即地图信息。然后给出起点和终点,A星算法就能找出从起点到终点的路径——经过格子列表。A星寻路算法网上有很多的资料,不做过多的介绍,主要看看地图信息如何生成?地图编辑器生成地图信息的工具,叫地图编辑器。我这里开发了一个简单的地图编辑器,主要包含以下几个功能:加载地图编辑地图地图缩放设置格子尺寸编辑格子信息测试阻挡A星寻路显原创 2020-07-18 14:41:02 · 3683 阅读 · 0 评论 -
gzip压缩引起的热更新bug
gzip引擎的热更新bug就在昨天,一切都是那么的寻常,就是普通得打了一次热更新包,然后上传到服务器,然后…啊,什么情况呀,七百多兆呀,整个资源也才这么七百多兆,什么鬼~~~,冷静,一定要保持冷静。查找过程project.minifest推断 :cocos creator 热更新是基于对比资源列表 project.minifest 的,既然这么大,应该是资源列表里面的文件 md5 全...原创 2020-03-20 11:22:44 · 756 阅读 · 0 评论 -
Cocos Creator基于热更新的分包方案
cocos 的热更新是基于对比本来和远程文件列表的md5实现的,如果有多个远程资源库,就可以拿来作为分包方案。大概流程是这样的:一 确定分包策略首先是,策划要根据一定的策略,将动态加载的资源分成几个包。比如游戏等级,前80级之前一个包,120级之前分一个包,200级之前分一个包;或者是关卡什么的。这个逻辑需要策划来确定,前期不会用到的资源就放到中期的包,中期不会用到的就放到后期的资源包。如果...原创 2019-11-07 20:47:42 · 3716 阅读 · 0 评论 -
Cocos Creator实现Google Play obb 分包
背景Google Play 对 APK 大小限制是 100 M,但是游戏稍微重度一点,资源会很多,很容易包体就会超过这个限制;Google Play 提供了 obb 分包方案,来解决包体问题。OBB 是 Opaque Binary Blob 的缩写,是一种类型 zip 文件格式,作为安卓应用的扩展数据包。参考:安卓开发指南和百度百科思路游戏多数资源都不需要在启动游戏时,就加载加载到内存,...原创 2019-10-26 12:45:10 · 5643 阅读 · 2 评论 -
cocos2dx的渲染流程(源码走读)
注意: 为了流程更加清晰,以下代码片段都是删除了其他无关的代码,只保留了与流程相关的函数调用。1 main 中调用 run:int main() { AppDelegate app; return Application::getInstance()->run();}2 Application 中调用 mainLoop :int Application::run(){原创 2016-09-07 17:38:09 · 1506 阅读 · 0 评论 -
手游摇杆(二)八方向摇杆和移动范围限制
前面的实现了一版最简单的四方向摇杆,基于此做两个方面的优化:升级为八方向限制移动范围一 八方向前面做的四方向摇杆,确认方向是基于不等式区域做的,八方向的会有四条直线方程,处理起来稍微麻烦一点,所以这里换成角度来做。如图:已知点P的坐标为(x, y),求op与x轴正方向的夹角a。由 tan(a) = y/x 可得 a = atan(y/x),所以由触摸点坐标p,可以得出op与x轴正向夹角。如图,原创 2017-07-17 22:01:55 · 6516 阅读 · 2 评论 -
手游摇杆(零)摇杆设计原理
摇杆是ARPG游戏中的标配,目前摇杆主要有两种方式: 1. 固定式 2. 跟随式 一 摇杆显示假设 外环旧的位置:posBig 外环新位置:posBigNew 外环半径:R 外环圆心:O 内环旧的位置:posSmall 内环新的位置:posSmallNew 触摸位置:p1 固定式内环在外环范围内移动; 外环位置固定,不能移动;更新策略: 判断触摸位置p是否在外环内,是则直接内原创 2017-04-01 19:02:29 · 5013 阅读 · 0 评论 -
手游摇杆(一)最简单的四方向摇杆
摇杆是所有手游中不可或缺的一部分,是最基本的操作方式,下面是用cococ creator实现的一个简单的摇杆,后面将基于此慢慢优化。一 场景新建一个场景,拖入三中图片,如图:分别表示:spPlayer 代表游戏中的角色,通过摇杆控制其移动;spRoker 摇杆的事件影响区域;spRokerCenter 摇杆的中心点。二 事件监听为了能控制摇杆,需要监听摇杆的事件,新建一个脚本CompRoke原创 2017-07-15 00:48:29 · 8077 阅读 · 1 评论 -
RPG游戏新手引导
我们的游戏是cocos cretror做一个2D的ARPG,这周做了一版新手引导,把实现方式分享下。设计引导一般会由各种操作组成,如npc对白、屏幕对白、剧情动画、强制玩家点击某个按钮,打开某个界面等,首先要做的是将引导都抽象出来,变成一个个可配置的项,如下: 操作类型 参数说明 1 屏幕对白 无 2 npc对话 npc编号 3 剧情动画 图片名;时长;图片名;时长原创 2017-06-03 23:25:38 · 2482 阅读 · 0 评论 -
AI之用行为树来实现逻辑
行为树是一种在游戏中常用的实现AI的方式,通过行为树可行图形化实现常用的程序结构。一 行为树节点类型每次执行AI时,从根节点(root)或running节点开始遍历,父节点执行子节点,子节点执行完后将结果返回父节点,父节点根据子节点的结果来决定接下来怎么做。通常每个节点有三个状态:成功(success),失败(failure),执行中(running)。行为树的遍历实际上是一次函数调用,立即完成的,原创 2017-03-03 12:32:12 · 4199 阅读 · 0 评论 -
游戏开发中常用的的设计模式
单例模式游戏客户端就是一个单例。 各类单例器,如UI管理器,事件管理器等。下面是Python实现的一个单例。class Singleton(object): @classmethod def Instance(cls): if not getattr(cls, "_instance", None): cls.__instance_num__原创 2017-01-17 18:07:05 · 1752 阅读 · 0 评论 -
手游优化方法汇总
一、CPU性能优化1、减少重复计算换高效的算法避免多次运算, 例如减少循环中计算利用空间换时间,将常用运算结果缓存2、合理使用数据结构不同数据结构的增删改查消耗得性能是不同的,合理利用数据结构,避免计算上的浪费。3、减少复杂调用将轮询方式修改为事件驱动,比如将在update中状态监听,改为事件触发将节点递归更新修改为有效路径更新,例如UI树不同对象和状态有不同的逻辑帧数,比如小兵的逻辑原创 2016-09-27 17:17:14 · 3024 阅读 · 0 评论 -
手游中的纹理压缩
移动设备内存有限,为了节省内存,一般都会对贴图进行压缩。 一张4MB的贴图,在移动设备中压缩之后只有1/8,也就是0.5MB。假如有一张1024px * 1024px的4通道(RGBA8888,每个通道都为8bit)贴图。 一般来说,一张纹理所占用的内存的计算方式为长乘以框再撑每个像素的比特数,计算公式日下: 内存 = 长 * 宽 * 像素比特数那么这张图所长的内存为:1024 * 102原创 2016-07-18 15:19:38 · 1674 阅读 · 0 评论 -
MVC架构在游戏开发中的应用
一 定义MVC即Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。MVC是一种“前端”的设计模式。MVC的目的是:希望View和Model分离,当某一方改变时,而另一个方不必随之改变的。例如,Java EE平台,iOS都是典型的基于MVC思想思想的,那么我们怎么在游戏设计中使用MVC模式呢。二 MV原创 2014-11-04 10:07:26 · 4089 阅读 · 1 评论 -
游戏引擎cocos2d-js和egret 对比
目前项目组的游戏开发都已经完成,准备开下一个项目。因为产品制作人想要兼容html5,备用的引擎有cocos2d-js和egret,下面就简单的来看看这两个引擎。cocos2dx官方主页:http://cn.cocos2d-x.org/egret官方主页:http://www.egret-labs.org/下面是个简单的对比列表:参考资料:http://w原创 2015-03-09 16:24:50 · 20012 阅读 · 6 评论 -
手游摇杆(三)跟随式摇杆
前一篇博客实现的固定式摇杆,在市面上很多游戏中都有应用,但在最后也提出了一个不是太好的地方,就是转向需要移动的位置比较远,操作比较累,为了解决这个问题,出现了跟随式摇杆。一 什么是跟随式摇杆所谓跟随式摇杆,即:当摇杆中心在摇杆大圆范围内时,跟固定式一样,大圆不动,中心移动;当遥感中心移动到大圆范围外时,大圆跟中心保持相对位置不变,大圆移动。二 位置计算在大圆内移动的计算跟前面的基本一样,主要看原创 2017-07-19 00:05:13 · 2735 阅读 · 0 评论 -
cocos creator 1.x 中使用自定义shader
为了减少游戏资源,游戏中免不了会使用一些shader,下面是一个将图片变灰shader,以此来看看如何在cocos creator中使用和管理shader。shader文件管理在assets中新建一个文件夹resources,然后在resources中新建一个Shader文件夹。将所shader文件放在Shader文件夹中。现在在Shader文件夹中新建两个文件gray.vert....原创 2017-06-10 01:50:00 · 17346 阅读 · 2 评论 -
cocos2dx转Android通用android.mk
做一个懒COCOS2D-X程序猿(一)停止手打所有cpp文件到android.mk前言:”懒”在这里当然不是贬义词,而是追求高效,拒绝重复劳动的代名词!做一个懒COCOS2D-X程序猿的系列文章将教会大家在工作中如何偷懒,文章篇幅大多较短,有的甚至只是几行代码,争取把懒发挥到极致! 一.懒人说书Android.mk中LOCAL_SRC_FILES需要罗列出所有参转载 2014-02-28 17:45:21 · 1178 阅读 · 0 评论 -
多语言版本解决方案
背景:项目在开发过程中都完全使用的中文开发环境,在代码、配表、ui里面有非常多的地方都直接使用了中文字符串。项目需要上海外,而且支持多个语言版本,切支持个语言版本之间切换,预计会上六七种语言的版本。思路:使用脚本提取所有含有中文的字符串,根据字符串内容生成唯一的id,然后生成一份id和内容的映射表,将生成的映射表作为原始文件去翻译,格式如图:id中文繁体英文俄语阿拉伯语土耳...原创 2019-09-09 20:52:15 · 2543 阅读 · 0 评论 -
cocos creator 图片资源加密
cocos creator 没有对资源进行加密,打包资源的资源很容易被扒,需要自己实现一套加密方式。这里简单记录下资源的加密方式。加密加密算法: XOR时机:在资源压缩打包完成之后加密工具: python脚本def encrypt(content): """ 加密内容 :param content: 加密密的字符串 :return: 加密之后的字符串...原创 2019-08-20 20:47:27 · 7101 阅读 · 2 评论 -
资源压缩和纹理压缩对cocos creator的Android包体大小影响
对cocos creator 2.1.x的项目,分别作了图片压缩,etc1纹理压缩和gzip压缩。图片压缩:png 使用 pngquant 压缩jpg 使用 mozjpeg 压缩etc1纹理压缩工具 ARM 的 Mali Texture Compression Toolpng 生成带 Alpha 通道的合成纹理jpg 直接生成压缩纹理gzip 压缩pytho...原创 2019-08-20 20:28:43 · 1681 阅读 · 0 评论 -
cocos creator 2.1+ 中使用材质和自定义shader
版本说明cocos creator 1.x shader 没有经过包装,可以直接定义shader,替换 sprite 原来的 shader,可以参考之前博客;cocos creator 2.x 引入了材质系统,使用 shader 必须通过材质,这里介绍下如何使用自定义 shader;2.1.2 版本编辑器中开放了实验版材质和shader,如图:过程如上图,新建一个shader,...原创 2019-07-20 14:25:55 · 6390 阅读 · 4 评论 -
cocos creator实现的日期选择控件
UIDatePicker日期选择控件及其使用示例及其使用,效果如果:使用步骤:将 UIDatePicker 文件夹拷贝到项目中在脚本中创建一个 Prefab,值设为 UIDatePicker需要显示时,创建节点,设置日期和回调cc.Class({ extends: cc.Component, properties: { label: { ...原创 2018-12-12 22:11:23 · 4749 阅读 · 3 评论 -
游戏UI设计-公共内容整理
游戏开发一般最大的成本都花在了美术上面,减少迭代次数是降低开发成本的有效有段。因此,对于游戏UI,在游戏立项之后,很多公共的内容可先定下来。有了这些公共的内容,除了节约开发成本,同时可以提高美术资源的复用程度。在没有特殊要求的情况下,就直接用公共资源即可,不需要额外地为不同界面再提供背景图,按钮等美术至于。从而也为方便了后面的迭代。也可以为美术的修改和迭代提供方便。游戏从立项到最后上线,或者上...原创 2018-11-22 11:19:43 · 2684 阅读 · 1 评论 -
RPG游戏寻找NPC流程
Created with Raphaël 2.2.0查找NPC是否在当前场景?是否在访问距离内?与NPC对话是否有任务?任务对话完成NPC功能对话跑到NPC附近是否Vip?跳转至目标场景传送门yesnoyesnoyesnoyesno...原创 2018-10-30 15:11:43 · 1205 阅读 · 0 评论 -
2d游戏中角色动画解决方案
刚刚在cocos creator论坛中,看到有水友在update更新spriteFrame来做角色动画,其实是可以使用 cc.Animation 来做角色动画,,这是我们游戏的实现方式,给大家参考下。一 资源管理1 美术输出资源要求首先,规划美术输出角色的动画,一个角色文件夹,比如 warrior_ori,包含角色各种动作子文件夹,如 idle,walk,run 等,动作文件夹中包...原创 2018-04-04 19:16:02 · 2931 阅读 · 0 评论 -
cocos creator 中使用shader实现流光
在论坛中有水友用多边形遮罩做了一个流光,这里分享一个用shader写的流光特效。原理将图片中指定区域的颜色亮度增大,或者加上颜色,然后在 update 中去更新这个高亮的区域。代码下面是 shader 内容, 关于 ShaderUtils 可以参考我之前的这篇博客。顶点 shader:module.exports =`attribute vec4 a_pos...原创 2018-04-14 18:39:18 · 13773 阅读 · 8 评论 -
cocos2d-js中使用websocket
下面是一个简单的封装://Network.jsvar WebSocket = WebSocket || window.WebSocket || window.MozWebSocket;var Network = (function(){ var instance = null; function getNetworkInstance (){ var networkInstan原创 2015-04-08 12:53:46 · 11463 阅读 · 7 评论 -
自己动手写cocos2dx游戏引擎(七)——自动释放池
上一节说到的Ref的引用计数时,没有说自动释放。自动释放功能相对来说比较复杂。首先有一个自动释放池。 #ifndef __AUTORELEASEPOOL_H__#define __AUTORELEASEPOOL_H__#include <string>#include <vector>#include "Ref.h"class Autorel...原创 2015-12-15 22:07:51 · 1077 阅读 · 0 评论 -
ARPG游戏中怪物AI实现
目前项目组正在做的是一款ARPG于MMO结合的游戏,下面游戏中AI实现的方式。一 AI配置1 配置说明AI配置使用python脚本,实现方式上使用伪行为树的结构,实现约定好关键字的意思,结构如下:ai配置说明文档data = { # 状态节点 'state_1': { 'action': [警戒距离, 追击距离], 'patroll': [巡逻距离,原创 2016-05-11 21:59:22 · 8289 阅读 · 0 评论 -
基于cocos2dx的网络游戏基本框架
做cocos2dx游戏开发也有一段时间了,把一个完整网络游戏的基本框架做个小结。一 界面2 场景基类:----------------创建界面--------------------scene()create()init()adaptScreen()setPriority()----------------更新界面------------------原创 2014-02-20 17:16:03 · 2983 阅读 · 0 评论