在Unity5中使用Protobuf

射击游戏项目开发笔记 (二)

由于很多的因素,项目改用U3D开发,而项目组目前为止没资深的Unity开发程序员,只能摸着石头过河了.我们网络通信数据使用protobuf的格式,(关于这protobuf的格式分析在上一篇笔记中已经分析得很详细了).简单说明一下目前项目的开发环境与插件的使用情况:

开发脚本: C# (.Net 2.0) 由于我与另一位同事均无C#功底,所以业余时间学习C#必不可少,本人而言已经有了基本的计划.(为什么不是JS 或者BOO,详细翻了一下Assets Unity 基本上大多插件都是用C#写的,Boo更加是第一次听)

开发工具:抛弃官方的Mono 使用VS2012,主要使用了UnityVS插件,注意这个插件现在已经免费了.传送门

GUI:有UGUI与NGUI和GUI三个选择,目前选的是NGUI,主要原因是NGUI的教材网上一抓一大把,由于换引擎的突发性,已经没太多时间给我去看那个比较好用了.(很多事情总是充满无奈)

网络模块:Unity5 提供了一套Net组件,在我花了两天时间去看了它的几个组件之后,发现根本不足以满足我们项目的要求.所以决定使用.Net自带的Socket自己实现.(约莫花了三天的时间)

继续阅读“在Unity5中使用Protobuf”

把pbc移植到项目引擎中

射击游戏项目开发笔记 (一)

目前我使用的引擎对代码的编码方式有了非常严格的控制,一般的C++写法已经无法在引擎中运行了,由于目前项目准备使用protobuf来作为通讯数据,所以我必须实现一个动态解析protobuf的库,考虑到已经有人做了一个事情,而且做得很好(https://github.com/cloudwu/pbc),所以我就把云风大侠的c版本移植到目前使用的引擎上来.这篇文章主要记录的是一些修改事项和protobuf的一些基本内容,并非使用教程.

简要说明

protocol buffers是google提供的一种将结构化数据进行序列化和反序列化的方法,其优点是语言中立,平台中立,可扩展性好,目前在google内部大量用于数据存储,通讯协议等方面。PB在功能上类似XML,但是序列化后的数据更小,解析更快,使用上更简单。用户只要按照proto语法在.proto文件中定义好数据的结构,就可以使用PB提供的工具(protoc)自动生成处理数据的代码,使用这些代码就能在程序中方便的通过各种数据流读写数据。PB目前支持Java, C++和Python3种语言。另外,PB还提供了很好的向后兼容,即旧版本的程序可以正常处理新版本的数据,新版本的程序也能正常处理旧版本的数据。

ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器生成的代码来读写这个数据结构。你甚至可以在无需重新部署程序的情况下更新数据结构。

继续阅读“把pbc移植到项目引擎中”

调用CMD遇到的诡异问题

在Win下通过代码调用CMD执行批处理不是什么新技术了,主要是有一下三种方式,这里粗略提下.我实现过C版 C++版,汇编版,AS版的调用执行批处理命令.下面是C++版本的做法:

直接调用函数system

最简单的方式可如下调用system函数执行命令

system("echo Hello CMD");

缺点:会显示CMG控制台窗口,无回显数据,优点:简单直接

使用ShellExecuteEx

其次简单的方式是使用ShellExecuteEx函数

SHELLEXECUTEINFO sei; 
memset(&sei, 0, sizeof(SHELLEXECUTEINFO)); 
sei.cbSize = sizeof(SHELLEXECUTEINFO); 
sei.fMask = SEE_MASK_NOCLOSEPROCESS; 
sei.lpVerb = _T("open"); 
sei.lpFile = _T(strToolName); 
sei.lpParameters = "echo Hello CMD";
// SW_HIDE SW_SHOWNORMAL 参数决定是否显示控制台
sei.nShow = SW_HIDE;//; SW_SHOWNORMAL
ShellExecuteEx(&sei); 
// 等待进程结束再往下执行
WaitForSingleObject(sei.hProcess, INFINITE); 
CloseHandle(sei.hProcess); 

缺点:无回显数据,优点:可隐藏控制台

继续阅读“调用CMD遇到的诡异问题”

3D基础编程笔记(一)

概念篇

DirectX 9.0,C++

作为3D编程菜菜,经同事指点若须打好基础,应从DirectX3D开始,因为D3DX对于3D编程的封装没那么高级.同样一个功能 D3DX往往需要几个函数,而OpenGL等则一个函数搞定,太高级的封装反而隐藏了原理.(大家都会用cocos2d-x,而且用得很溜,试问又有几个能拍胸脯说真正理解其内部原理呢.)下面记录一些常用概念,主要方便自己查询.

什么是引擎

引擎是什么?大家在游戏开发中肯定会遇到的,在日常同行交流中 首先问的估计也是:你们项目用的是什么引擎啊?用cocos2d-x?用U3D?用虚幻4?用CryEngine?用godot?那为什么要把他们叫做引擎呢?说到引擎一般有三种东西:

  • 机器发动机

汽车的引擎也叫发动机,因为那是整个汽车的动力源泉.

  • 搜索引擎

搜索引擎指自动从因特网搜集信息,经过一定整理以后,提供给用户进行查询的系统。

  • 游戏引擎

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些互交式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始。大部分都支持多种操作系统平台,如Linux、Mac OS X、微软Windows。游戏引擎包含以下系统:渲染引擎(即“渲染器”,含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理。

我们关注的显然是游戏引擎,一句话概括:游戏引擎就是一整高级编程组件.

继续阅读“3D基础编程笔记(一)”

近期的变化与计划-201503

工作变动

在3月02日从中手游离职出来已经一个月了,不知不觉在这个公司呆了快三年时间,而我刚毕业对自己的计划跳槽时间点也刚好是三年.这个时间离开也不算违背了当初自己的计划,离职的原因真的很难说清楚.委屈了?还是钱少了?其实都有,只是委屈的成分现在感觉更足一点(未来我可能会转而认为还是钱的问题,毕竟委屈这个东西是会因为时间而冲淡的,就像某些感情一样).明明我们都那么爱游戏.现在能回忆起来最清晰的还是那一场又一场和不同的人吃的不同的散伙饭.我们究竟要散伙多少次才能找到 真^伙伴 呢.

离职的当天就是我到现在的公司入职的时间.在现在的公司我适应度快得出于意料,刚毕业那时候在意的很多东西 主观的客观的,现在反而能淡然处之.而那个时候口头最在意其实心里最无视的东西-个人成长,现在反而真正重视起来.希望在现在这个创业公司能创造一些美好的东西.

近期忙碌

在过去一个月里,我主要是负责把现在公司之前封装的一套cocos2d-x代码 兼容到android平台,编写部分文档和新增引擎测试案例.由于在上周已经决定转向3D,所以目前这套我认为已经达到70%(有很多还可以细化的地方并没有处理.)的封装库也等于没太大作用了.同事做得比我更干脆,他直接分享了,传送门. 需要的可以去下载玩玩,某些功能相当不错,对骨骼动画性能的优化,对图片资源大小的压缩更是超出目前普遍的处理方式几条街,但是BUG也不少.谁能真正阻止BUG的产生呢?呵呵

继续阅读“近期的变化与计划-201503”

2dx配置android开发环境(64bit win7)

author: Rect 2015/03/10
cocos2d-x version: - 2.2.5
ndk version: r9
jdk version: 1.8

鉴于每次配置各种环境都要找各种教程,实在神烦,所以不如自己整理出来.

setp 1.安装或解压如下全部工具到一个文件夹,例如我的 E:\tool\android

工具 文件名 安装或者解压后路径
NDK 编译C++需要使用的框架 android-ndk-r9-windows-x86_64.exe E:\tool\android\android-ndk-r9
SDK 安卓SDK android-sdk_r23.0.2-windows.zip E:\tool\android\android-sdk-windows
JDK java虚拟环境 jdk-8u40-windows-x64.exe E:\tool\android\Java
ADT eclipse+adt集成环境 adt-bundle-windows.zip E:\tool\android\adt-bundle-windows
Cygwin调试编译C++用的工具 setup-x86_64.exe 安装选项请看图,路径随意,但不可有空格

继续阅读“2dx配置android开发环境(64bit win7)”

Android NDK项目崩溃信息抓取

开发日志系列(十六)

cocos2d-x lua binding,android-ndk-r9c,eclipse,cygwin,window7 64bit,red mi,Thl9,htc one

项目最近进入高速迭代阶段,版本更新速度比平时加快了几倍,这几天出的版本 莫名的出现频繁崩溃闪退的问题(仅仅Android上),不得已停下逻辑开发工作去fix 这个问题.

问题重现

打开游戏进入场景 频繁切换模块界面的时候 有一定几率崩溃

初步猜测

很大可能是加载销毁UI资源的时候导致C++代码出错.而仅仅在Android上出问题 就有可能是挂在异步加载的线程上.由于 最近两周才做的UI资源分模块管理 和异步加载.所以 异步子线程出的问题非常大.

这个问题的难点在于,C++代码在android上调试比较困难,由于我们的项目(cocos2d-x lua)并非单纯的NDK项目 所以并不能完全用单步调试JNI的方式解决.需要知道问题的根源 还是必须从想办法抓取崩溃最后的打印信息开始.

继续阅读“Android NDK项目崩溃信息抓取”

字符串逐字刷新

开发日志系列(十五)

在做游戏剧情展示的时候遇到一种需求把游戏对话逐字显示给玩家,效果如下:

malu

实现这种效果的方式就是把一个字符串逐个中文取出来刷新到屏幕上,研究了各种编码之后发现UTF8的编码非常简单 也很容易逐个/中文/英文/符号 读取.首先看看UTF8非常简单的编码方式:

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

UTF8编码规则

Unicode符号范围 UTF-8编码方式
(十六进制) (二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

继续阅读“字符串逐字刷新”

回合卡牌的战斗模块

开发日志系列(十四)

cocos2d-x lua binding C/C++

在我目前参与的这款无操回合卡牌手游中,客户端战斗模块是由我实现的,在项目上线之前一直都生怕出现不可逆转的设计问题,所以我把模块流程描述给美术,别的程序同事听 同时尽量写出来.这个模块几乎全部使用C++实现.

战斗流程

解析服务端战斗数据创建战斗场景创建战斗对象进入场景按回合播放战斗特效对象退出场景显示战斗结果销毁回收内存/重播

  • 战斗数据解析器(parser)

这个解析器主要工作是解析和管理战斗初始数据.除此之外不做任何事情,目前项目中一般的战斗数据长度大概是1.5kb(1200~1600字节),在按数据结构(struct)解析数据的时候需要注意 服务端和客户端 的struct定义数据位对其的问题:

#pragma pack(1)
define some struct..
#pragma pack()

继续阅读“回合卡牌的战斗模块”

2dx中使用自定义位图字体

开发日志系列(十三)

成品预览

Font

环境与工具

cocos2d-x 2.2.3,AngelCode,PhotoShop

在我参与的项目中,由于美术对战斗表现非常苛刻,飘血等飘字的样式否需要逐字自定义,例如上图中的Zzz,闪避,反击,等等,最初他们设想是把所有飘字做成各个散图,用飘图来代替最初的飘文字.这绝对不是一种好的方法.于是我想到了自定义位图字体.在 cocos2d-x源码中发现CCLabelBMFont对位图字体支持的非常不错.因为CCLabelBMFont中仅仅看某个字的矩阵范围,而这个矩阵里是什么 有什么 完全不会干涉.创建位图字体首先需要使用一款叫做AngelCode的工具.步骤如下:

AngelCode的使用

  • 新建一个文本文件,写入要做成位图的字,例如:反击 挡 连击 闪 睡(Zzz)
  • 保存为UTF8格式
  • AngelCode中Edit->Select chars form file
  • AngelCode中Options->Font Setting 设置size大小
  • AngelCode中Options->Font Setting 选择默认字体
  • AngelCode中Options->Export Options修改 间隙像素 建议 > 3,
  • AngelCode中Options->Export Options修改Texture寛高
  • AngelCode中Options->Export Options修改Bit深度为32
  • AngelCode中Options->Export Options修改File Format为Text
  • AngelCode中Options->Export Options修改Textures为png文件
  • AngelCode中Options->Save Bitmap font as生成位图字体

继续阅读“2dx中使用自定义位图字体”