cocos2d-x项目过程记录(Objective-C转C++)
(原创作品,欢迎转载,注明出处,谢谢:http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3179335)
1.单例模式中,静态指针的释放过程(垃圾工人)
2.反射机制的使用(oc中的语言特性,c++没有)
3.触摸事件的setHandlePriority()的bug
4.CCDictionary只有读取plist没有写入plist,所以对于游戏中的动态数据就只能使用CCUserDefault::sharedUserDefault()的方式进行保存和修改
5.animation = CCAnimation::createWithSpriteFrames(frameArray,frameRate);
CCAnimation::create()默认使用的CCAnimationFrame的数组,之前一直使用CCSpriteFrame,中间有个类型检查,通不过。
所以只好使用createWithSpriteFrames了。
6.c++中的通过类对象获取类名,typeid().name()获取到的类名有多余的信息,需要字符串处理才能继续使用。
比较容易使用的方法:dynamic_cast();这个dynamic_cast()进行强转的策略是,子类对象可以强转成父类指针,而父类对象或者其他对象转成子类指针时会为空
7.在cocos2d-x中,精灵的默认锚点为ccp(0,0);
8.cocos2d-x在xcode中编辑编译与调试体验不如cocos2d-iphone,例如调试时候po,oc中支持description,而c++没有;再如CCArray和CCDictionary,po也打印不出内容
9.触摸事件的认识,就component类来说,继承自sprite,在onEnter和onExit函数中,进行触摸代理的添加和移除,事实上只有继承自CCLayer才可这么干,否则的话应该添加注册函数。
10.使用单例类来保存CCArray或者CCDictionary的时候,千万要注意,这些东西会被autorelease掉。究竟是什么时候释放的,我不清楚,总是cocos2d-iphone是没有问题的(它可能是最后释放),但是-x就不一定了,所以需要手工控制引用计数,给保存资源的变量或者指针—>retain()即可解决。还有就是,在shareInstance静态方法中,千万不要使用cocos2d-x默认的CREATE_FUN宏函数,因为这里面也有autorelease,没有试过会不会出问题,但是看例子都是直接Class* instance = new Class();instance->init();。纠结了好久,终于明白,灰常高兴,程序猿的快乐就是这么简单!
10.获取类型的时候,不存在NSStringFromClass,所以就在每个需要获取类信息的类里添加上获取信息的方法,以便获取信息。c++中的typeid(Class).name(),会根据编译器的不同来产生不同的字符串,难以加以解析。
11.对于自定义按钮的点击监听事件,可以有两种,所在层上监听,事件分发处理,挨个找;在自定义控件范围上处理,在范围内可以,不在范围内不响应。要注意坐标系的中点的变换。重点在如下两个函数:
bool CCMySprite::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent)
{
CCPoint touchLocation = pTouch->getLocation(); // 返回GL坐标
CCPoint localPos = this->convertToNodeSpace(touchLocation);//切记这里是转成相对与自己的坐标
CCRect rc = rect();
rc.origin = CCPointZero;
bool isTouched = rc.containsPoint(localPos);
if(isTouched)
{
printf("nihao");
return true;
}
printf("wohao");
returnfalse;
}
CCRectCCMySprite::rect()
{
returnCCRectMake(getPositionX() - getContentSize().width * getAnchorPoint().x,
getPositionY() - getContentSize().height * getAnchorPoint().y,
getContentSize().width, getContentSize().height);
}
12.小差异:对于数组来说,-phone上的非空可以移除走,而-x不可以,需要加以判断。
13.小差异:o-c中对于一个方法,如果变量是空的,那么方法自动不执行,而c++中注意中断,应该注意防御性编程
14.batchnode的使用
15.类型识别感觉挺好使的方法:dynamic_cast<>动态转换,如果可以转成某个父类,则转,不可以就返回空值,比起getClassName()或者typeid安静多了。
16.对于动画来说,与-iphone中不同的是
CCAnimation *animation = CCAnimation::create(frameArray,0.1);//会报错说是,元素类型错误
改成
CCAnimation *animation = CCAnimation::createWithSpriteFrames(frameArray,0.1);//就好了
注:framArray是CCSpriteFrame的数组。
17.在使用CC前缀的类时,千万要注意,记着retain()和release(),我因为这个出过好多错,检查变量不为空,但是事实上里边的东西已经没有了。一定要保持自己对这些变量的控制,我现在还没顾上研究究竟在什么时候释放掉的,但是在-iphone中没问题的,在-x中确有问题,这让我一度很纠结。
18.在define的时候切记上括号。
(原创作品,欢迎转载,注明出处,谢谢:http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3179335)
cocos2d-x项目过程记录(Objective-C转C++)的更多相关文章
- cocos2d-x项目过程记录(跨平台iOS和Android)
(原创作品,欢迎转载,注明出处,谢谢:http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3205249) 1.配置环境,重 ...
- cocos2d-x项目过程记录(ios和android设备的适配)
(原创作品,欢迎转载,注明出处,谢谢:http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3213645) 1.原理分析的博 ...
- cocos2d-x项目过程记录(cocos2d-x的新知)
1.给CCMenuItem带上点击参数(这是CCNode的一个属性) CCMenuItem *item = CCMenuItemSprite::create(unselectedPic, select ...
- cocos2d-x项目过程记录(纹理和内存优化方面)
1.参考资料:Cocos2d-x纹理优化的一些方案 cocos2d-x如何优化内存的应用 iOS和android游戏纹理优化和内存优化(cocos2d-x) 2.加载贴图集纹理 CCSpriteF ...
- 将React Native 集成进现有OC项目中(过程记录) 、jsCodeLocation 生成方式总结
将RN集成到现有OC项目应该是最常见的,特别是已经有OC项目的,不太可能会去专门搞个纯RN的项目.又因为RN不同版本,引用的依赖可能不尽相同,所以特别说明下,本文参考的文档是React Native ...
- 升级Windows 10 正式版过程记录与经验
升级Windows 10 正式版过程记录与经验 [多图预警]共50张,约4.6MB 系统概要: 预装Windows 8.1中文版 64位 C盘Users 文件夹已经挪动到D盘,并在原处建立了符号链接. ...
- 双系统Ubuntu分区扩容过程记录
本人电脑上安装了Win10 + Ubuntu 12.04双系统.前段时间因为在Ubuntu上做项目要安装一个比较大的软件,导致Ubuntu根分区的空间不够了.于是,从硬盘又分出来一部分空间,分给Ubu ...
- 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...
- 升级到 ExtJS 5的过程记录
升级到 ExtJS 5的过程记录 最近为公司的一个项目创建了一个 ExtJS 5 的分支,顺便记录一下升级到 ExtJS 5 所遇到的问题以及填掉的坑.由于 Sencha Cmd 的 sencha ...
随机推荐
- 深入Java虚拟机读书笔记第五章Java虚拟机
Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...
- php基础知识【函数】(3)字符串string
一.大小写转换 1.strtolower()--转换为小写. echo strtolower("Hello WORLD!"); //hello world! 2.strtouppe ...
- .NET序列化的一点技巧
介绍 序列化是将对象状态转换为可保持或传输的形式的过程.序列化的补集是反序列化,后者将流转换为对象.这两个过程一起保证数据易于存储和传输. .NET Framework 提供了两个序列化技术: 二进制 ...
- ASP.NET导出Excel(利用NPOI和EPPlus库,无需安装Office)
网上提供了很多Asp.net中操作Excel的方法,其中大部分是调用微软的Office组件,下面提供三个无须安装Office即可从Asp.net输出Excel的方法. 1 简单方法 //下面代码输出的 ...
- 为什么要用专业的ETL
这两天一直在思考一个问题,为什么要用专业的etl工具进行数据清洗,原因如下: ETL负责将分布的.异构数据源中的数据如关系数据.平面数据文件等抽取到临时中间层后进行清洗.转换.集成,最后加载到数据仓库 ...
- 使用 getNextException() 来检索已经过批处理的特定元素的异常。 ERRORCODE=-4228, SQLSTATE=null
今天查询了一天发现的问题,用ibatis做批量操作时,报错: [非原子批处理出现故障]使用 getNextException() 来检索已经过批处理的特定元素的异常. ERRORCODE=-4228, ...
- java学习之关键字
java语言当中的关键字,之所以存在,是为了告诉编译器如何解释一段有意义的代码段.比如说 /**需求:演示java中关键字存在的含义步骤:用class,public,static,void等说明什么是 ...
- bzoj2818
我们先穷举素数p然后令y>x 这样问题就是求这个gcd(x,y)=p (1<=x<y=n)不难发现必须y=kp k∈N* 当y=p时,易知个数为φ(1)当y=2p 个数为φ(2), ...
- Struts2再爆远程代码执行漏洞
Struts又爆远程代码执行漏洞!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction ...
- CMOS Sensor的调试经验分享
转自:http://bbs.52rd.com/forum.php?mod=viewthread&tid=276351 CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一 ...