cocos2d-x项目过程记录(Objective-C转C++)

(原创做品,欢迎转载,注明出处,谢谢:http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3179335node

1.单例模式中,静态指针的释放过程(垃圾工人)c++

2.反射机制的使用(oc中的语言特性,c++没有)编程

3.触摸事件的setHandlePriority()的bug数组

4.CCDictionary只有读取plist没有写入plist,因此对于游戏中的动态数据就只能使用CCUserDefault::sharedUserDefault()的方式进行保存和修改xcode

5.animation = CCAnimation::createWithSpriteFrames(frameArray,frameRate);iphone

CCAnimation::create()默认使用的CCAnimationFrame的数组,以前一直使用CCSpriteFrame,中间有个类型检查,通不过。函数

因此只好使用createWithSpriteFrames了。post

6.c++中的经过类对象获取类名,typeid().name()获取到的类名有多余的信息,须要字符串处理才能继续使用。动画

比较容易使用的方法:dynamic_cast();这个dynamic_cast()进行强转的策略是,子类对象能够强转成父类指针,而父类对象或者其余对象转成子类指针时会为空this

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

相关文章
相关标签/搜索