您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x使用过程中遇到的错误(VS下开发,移植到Android发布)

2013-07-17 11:21 567 查看
转载:/article/2649320.html

环境:windows7, VS2010, cocos2d-1.0.1-x-0.12.0, cygwin, eclipse, android sdk4.0.3, ndk r7b

在vs上开发,然后移植到android上.

20120718

CCArray的foreach操作:

cocos2d-x 本地通知调用的问题 CCNotificationCenter

在注册的postNotification消息函数中,不能再调用addObserver,可能会引发存储CCNotificationObserver对象的CCArray扩容,导致CCArray重新new了一块内存地址,CCArray首指针改变,当执行完返回postNotification函数的时候和原来的CCArray首指针不一致,导致内存读取出错。

[cpp] view
plaincopy

observer->performSelector

就是注册的消息回调函数。该函数内不能对再添加或减少自定义消息。

[cpp] view
plaincopy

void CCNotificationCenter::postNotification(const char *name, CCObject *object)

{

CCObject* obj = NULL;

CCARRAY_FOREACH(m_observers, obj)

{

CCNotificationObserver* observer = (CCNotificationObserver*) obj;

if (!observer)

continue;



if (!strcmp(name,observer->getName()))

observer->performSelector(object);

}

}

20120719

强制类型转换:

自定义类MainScene继承自CCLayer,使用手法同HelloWorld,MainScene::scene()直接new了一个scene对象,并将MainScene的对象挂到scene下。

但是后来调用的时候产生错误操作:MainScene* pScene = (MainScene*)(pDirector->getRunningScene());scene被强制转换成CCLayer,对所谓的MainScene对象成员操作,导致内存块异常,现象就是在莫名其妙的地方挂掉,每次都不同,内存块检测也报过异常。

危险的强制内存转换,切记切记!

20120723

最好不要写出全局变量初始化顺序有依赖关系的代码。

[java] view
plaincopy

const CCSize WIN_SIZE = CCDirector::sharedDirector()->getWinSize();

一开始在VS上调试没事,移植到Android上,初始化的时候就挂了。

查了一下资料,原因是初始化顺序的问题。(具体初始化的顺序没搞清楚,⊙﹏⊙b汗,欢迎补充,感激不尽)

PS:找到了几篇初始化静态常量顺序的文章

1.控制全局变量初始化顺序 && #pragma详解

2.全局变量初始化顺序

[cpp] view
plaincopy

int get_a()

{

static int a = 5;

return a;

}

int get_b()

{

static int b = get_a();

return b;

}

3.J***A中初始化顺序复习

4.初始化有序常量的一点小技巧

20120726

playEffect

音效播放前要先preloadEffect,否则第一次播放音效没有声音。可以一次preloadEffect所有音效,android那边调用的是HashMap存储音效存放路径。

vs端不写preloadEffect也能正常播放,但是android端必须先preloadEffect才能正常播放,否则第一次播放没有声音。背景音乐没发现这个问题。

20120803

CCTargetedTouchDelegate 的继承 和 dynamic_cast

想写个可以响应touch的sprite

类定义成了这个样子:

[cpp] view
plaincopy

class GemBoard : public CCSprite, CCTargetedTouchDelegate

然后注册touch消息的时候

[cpp] view
plaincopy

CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this, 0, true);

在这挂了,查了一下午,挂在了

-addTargetedDelegate

-CCTargetedTouchHandler::handlerWithDelegate

-initWithDelegate

-CCTouchHandler::initWithDelegate

-dynamic_cast<CCObject*>(pDelegate)->retain();

-void CCObject::retain(void)

跟到这里,编译器告诉我CCObject的this指针是0,我晕呀。感觉太诡异了。

原因:CCTargetedTouchDelegate在上面的写法中是私有继承,而根据dynamic_cast的作用:(运算符可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。)上面的情况就合情合理了。

今天学到了2个知识点:

1. class B: public A, C 这种情况下A是public继承,C是private继承;class B: A 这个A也是private继承

2.dynamic_cast 除了public 的其他都返回null

所以改成

[cpp] view
plaincopy

class GemBoard : public CCSprite, public CCTargetedTouchDelegate

就正确了。发现自己的c++基础真烂。

20121101

今天不是万圣节吗,怎么变成了愚人节!!!

因为做的项目是VC++下开发,然后编成本地代码在Android上运行,所以有些地方需要上真机打印log调试。我日哦,我在代码里加了N多的log代码,就是一句也不打出来,在log上纠结了一天,一开始以为是cocos2d的代码出问题了,难道是自动屏蔽了log输出?上网查资料,当然什么也找不到。我就在加log代码,然后上真机,看不到log,然后继续加log代码,往复循环。下班的时候,同事看我这么纠结,就问我,vc上打断点看程序运行到log代码处了吗?结果是程序正常运行,断点根本不走,靠!原来我一直在一段废代码上加log!我的生命呀,就这样浪费了。我想起了一首神曲,有兴趣的同学可以听一下:Wrong
hole - DJ Lubel

20121103

CCTexture2D::initWithData

bool CCTexture2D::initWithData(const void *data, CCTexture2DPixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pixelsHigh,const CCSize& contentSize)

使用数据创建纹理,我试了无数遍,各种问题都考虑了,就是不知道为啥正常创建出来的纹理显示不出来。最后发现是contentSize这个最后的参数,我给的是(0,0)当然创建不出来了,一开始还以为是CCTexture2D创建成功后返回给我的生成的纹理大小。事实证明是我想多了……这个参数就是一开始指定要创建纹理的大小的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐