一  框架层面

二  Lua层面

三  工具层面

四  android打包



一 框架层

    总体来说,cocos2dX提供的一个简便的框架,包括了渲染,动画,事件分发,网络还有UI,物理引擎等几大模块。对于做一个游戏从功能上来说已经

足够了。我从这几个方面分别探讨下cocos2dX的优缺点以及我们在项目中是怎样用到的

(1)渲染:渲染这块,他的渲染数据跟Sprite进行了绑定,然后对于openGl也是直接进行了调用,而不是採用策略或者插件进行调用。对于后期假设採用DX的话

我认为这块比較冗余些。可是这些并不会影响游戏的渲染速度。它提供了batch来进行批次渲染。所以在游戏里,我们对资源进行了分组,然后分别用textPacker

拼成一张图片,格式呢 没有alpha的採用 RGB565,有alpha的採用RGBA4444,要求高的话就採用RGBA8888,然后统一採用批次渲染。游戏的速度会提升非常多。

对于游戏数据的管理,cocos採用CCTextureCache这个单例类进行管理。释放能够採用所有释放,还有释放没实用过的。而且也提供了异步载入动画资源的方法

(PS:这个对于想做ARPG的同学来说,但是好东西了)。所以对于渲染这块,我们尽量用批次,然后记得释放内存就OK了。

(2)动画:cocos他提供了一套action机制。总体来说,是sprite run action。然后驱动action里面的动画数据,进行播放动画。全部的动画都能够走action

接口。对于使用者来说,也不用去关心其它东西,仅仅须要初始化好你想要的动作,然后把动作数据塞给action。然后让sprite run 就能够了。大概action就是这个

流程。本来我们想自己写自己的动画,可是到后期,由于自己写一套工作量大。所以对于move,scale什么的仍旧採用cocos自己的。仅仅有animation採用了我们的。

可是如今想起来,全然没有必要。cocos提供的已经足够了。我们所须要做的就是把动作编辑器导出的动画数据用cocos的动作翻译(对于动作编辑器我后面会讲)写

这么一个层就好

(3) 事件分发:cocos对于事件分发这块就比較弱了。他是事件管理是通过存储每个object以及他接收事件的优先级。然后进行分发。可是他并没有对场景进行树的管理

。所以我们的改变就是建立起场景树,然后事件分发先从场景顶端往下分发。期间每一个节点能够设置是否响应以及是否继续往下传递的属性(作为OC出身,这块全然模仿苹果那套)

全然丢弃了cocos的那一套事件分发机制。对于场景树的维护,仅仅须要每次step的时候更新下。所以对于查询性能须要好好写一下

(4)网络:cocos提供了对curl的封装。提供了http的一些简单比方get,post的封装。但对于断点续传等并没有封装。对于socket,cocos则全然没有提供。我们採用了

BSDSocket

(5)UI:UI这边,cocos提供了几种简单的控件,比方CCButton等。他们都继承于CCSprite,可是太少。并且初始化方法是在是太过于奇葩。所以我们自己写了一套UI。

(事实上无非也就是 button,label,tableView,scrollView,image还有textInput)他们也都继承CCSprite。然后添�一些每一个控件独有的逻辑就能够了。最麻烦

的应该就是textInput了。照着cocos提供的input写一遍,然后改改。(cocos提供了CCEditeBox,可是这货的的解决的方法是在IOS上调用IOS的的控件。可是他是直接加到了egLView上,对于页面移动,页面关闭处理起来比較麻烦。

所以这个临时还不能用)



二 lua

                为了让游戏更有灵活性,cocos提供了lua。由C++做引擎,然后lua去写逻辑。这样就能够绕开苹果的审核。我们就讨论下C++与lua碰到的问题。

(1)通讯:cocos採用了tolua++来进行C++与lua的通讯。看Cocos2dXLuaLoad文件中,那些就是lua与C++通讯的一个层。详细通讯原理比方是通过

栈,什么的我就不讲了(事实上我也不太懂)。这些东西tolua++都已经替咱封装好了。我们须要做的就是写好C++文件

然后生成load文件。在CCLuaEngine里调用你生成的那个load方法。lua就能够訪问C++了。须要说明的是,我们这边尽量是lua调用C++的方法,C++不会去调用

Lua的方法。调用也是通过callBack去调用。

(2)问题:

     问题1.当C++里面的函数须要传递lua指针时:在C++里,lua的函数指针是一个int的 变量。生成时用Lua_Func来取代。然后生成后运行cocos2dX源代码

里面build.xml。xml的左右就是定制tolua++的生成。在里面把lua的函数指针转成了int了。详细的看xml内容就能够了。

     问题2.在CCLuaEngine里调用那些load方法时,是有顺序的。一定要父类在前,子类在后。不然子类就无法訪问父类的方法。

(3)写法:

                lua都要添�module,变成模块化,提高代码的可读性,然后require的时候一定要像cocos样例那样,写全路径。不然打包android的时候

就悲剧了。

                lua里面不要用全局变量持有sprite等C++数据。每一个模块也要像cocos那样提供2个方法,一个是进入该模块的初始化方法,一个是退出

该模块的销毁方法。

                对于lua这边写法,我们參考了 moai,还有corona,在lua那边在封装下C++,其它lua不是直接调用C++,尽量不要让lua的写法太过于

活跃。不然以后调试真心头大。



(4)调试:lua的调试是最大的问题。仅凭一个lua_error所报错的信息是全然不够的。并且Xcode对于lua的语法高亮支持的也不好。我们对此

进行了2方面的尝试

    1.windows下,用decoda。然后也能够打断点。

    2.mac下,临时用Eclips加lua插件进行写lua,然后通过log进行调试。只是近期想尝试Vim,应该会比之前靠谱。

三 工具层面

                工具上,cocos提供了 cocosBuilder,我认为他属于一个集成的工具。想要追求全,必定不精。所以cocosBuilder无论是

场景编辑,界面编辑,还是动作编辑都不是非常好用。所以我们採用的策略是用Flash的那一套。界面编辑用FlexBuilder的界面编辑,然后

导出xml,写一个xml翻译类,依据xml创建面板,动作编辑用FlashPro。然后用jsfl读出flash信息,导出xml,用cocos自己的action机制

去翻译,演绎。场景编辑的话,我们的游戏并没实用场景编辑的需求,所以没有进行研究,只是titleMap是个不错的选择



四 andrid打包

        android打包,事实上难点在于调试。由于无法打断点。本来lua就难调试,结果还要加上android。打包android那边就是多看看NDK,JNI的

一些资料,然后了解mk文件怎么书写。看看cocos提供的那些sh脚本。打包大部分问题都是路径的问题。依据错误一步步来,别急,肯定能打上。

打包完毕以后,剩下就是调试。调试的话 主要就是C++与java之间的通讯了。那就要多看看jni的一些东西。然后看cocos/platform/ 还有android

里面的类。那些是c++跟java通讯的类。我们调试主要就在那打log。jni的原理我就不讲了。。多看看懂一点就能够了。毕竟咱仅仅是为了看懂,会照猫画虎

写一点。不是必需深究。对了,android好奇葩,上网还须要权限配置!!!在mainfest.xml配置权限。靠,搞了好久这个问题。





好了,我对于cocos的见解就这么些。可能包括了cocos全部的东西吧。都不细,仅仅是给大家当一个消遣时间的东西。欢迎大家一起讨论。

最后,感谢cocos2dX的那些大牛们。是你们的无私让我们才有机会这么easy接近游戏开发。谢谢你们。

从不同层面看cocos2d-x的更多相关文章

  1. Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog

    前两天看到一群里在讨论 Tomcat 参数调优,看到不止一个人说通过 accept-count 来配置线程池大小,我笑了笑,看来其实很多人并不太了解我们用的最多的 WebServer Tomcat,这 ...

  2. i++ 与 ++i 的从字节码层面看二者的区别

    /** * javap命令可以对class反汇编得到其字节码文件(此命令并不是jdk8开始的,只不过jdk8中对工具进行加强,增加了一些参数,可通过 javap -help了解) * * 注意: * ...

  3. 从字节码层面看“HelloWorld” (转)

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  4. 从字节码层面看“HelloWorld”

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  5. cocos2d js的一些tip

    cocos2d-js-v3.2-rc0 cc.director.end();//退出app cc.Application.getInstance().openURL("http://www. ...

  6. 从XCodeGhost事件看软件来源鉴别的重要性

    事件 事件引爆于9月18日乌云网公布的一则分析报告:"XCode编译器里有鬼 – XCodeGhost样本分析",这份纯粹的技术分析报告引发中国iOS生态链的众多开发者的关注. 引 ...

  7. Java抽象类和接口的区别(好长时间没看这种文章了)

    Java抽象类和接口的区别(好长时间没看这种文章了) abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的 ...

  8. 另一个维度:cocos-2d VS vue

    最近再看cocos-2d的东西,期间得到了同事和老板的支持,在此感谢.之前一直在做vue网页,现在看游戏cocos-2d这块,刚接触肯定有点不适应.cocos-2d多了很多感念:导演.场景.节点等.这 ...

  9. 从谷歌Pixel3不堆硬件看智能手机下一个十年将被AI制霸

    别看现在的智能手机行业热闹异常--厂商混战.新品频出.噱头涌现,但能引领手机行业发展趋势的依旧是苹果和谷歌.如果说苹果的iPhone树立了一个个智能手机行业进化的标杆,那么谷歌其实就是在为安卓手机的发 ...

随机推荐

  1. N!水题

    //题目是求N!的问题,思路:设定一个整形数组来存放每次计算过后的值 有两个for循环,第一个for循环每次加进一个数 然后在第二个for循环里面计算出此时的阶乘,比如9999,先给出i=2 在第二个 ...

  2. hdu 2211

    题意: 中文题目,自己看.............. 递归调用.... 没什么难度,注意下long long就行........ AC代码: #include <iostream> #de ...

  3. 黑马程序员-out和ref

    C# 方法参数关键字:ref.out 当希望方法返回多个值时,声明 out方法很有用.使用 out参数的方法仍然可以将变量用作返回类型(请参见 return),但它还可以将一个或多个对象作为 out参 ...

  4. Nagios监控memcached

    下载地址: http://search.cpan.org/CPAN/authors/id/Z/ZI/ZIGOROU/Nagios-Plugins-Memcached-0.02.tar.gz http: ...

  5. inline-block元素的空白间距解决方法

    方法1 <ul><li>item1</li><li>item2</li><li>item3</li><li&g ...

  6. zepto源码研究 - zepto.js-4(常用的工具)

    $.each: /** * 以集合每一个元素作为上下文,来执行回调函数 * @param elements * @param callback * @returns {*} */ $.each = f ...

  7. 单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。

    一.问题在哪? 在配置cas-client中,有这么一段配置: <filter> <filter-name>CAS Filter</filter-name> < ...

  8. 单点登录CAS使用记(七):关于服务器超时以及客户端超时的分析

    我的预想情况 一般情况下,当用户登录一个站点后,如果长时间没有发生任何动作,当用户再次点击时,会被强制登出并且跳转到登录页面, 提醒用户重新登录.现在我已经为站点整合了CAS,并且已经实现了单点登录以 ...

  9. 【转】常用背景色RGB数值

    [转自]http://blog.sina.com.cn/s/blog_8fc890a201013z8h.html

  10. 基础知识 mfc

    句柄 资源的标示  图标句柄(HICON) 光标句柄(HCURSOR) 窗口句柄(HWND) 类似于指针 wm_keydown表示键盘上的按键按下了数值 WPARAM ||LPARAM  两个整形数据 ...