Cocos2d-x 解惑

2013-8-17

一、Http相关:

  1. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 无法解析的外部符号 __imp__pthread_create,该符号在函数 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" (?lazyInitThreadSemphore@CCHttpClient@extension@cocos2d@@AAE_NXZ) 中被引用  
  2. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 无法解析的外部符号 __imp__pthread_detach,该符号在函

解决办法:项目属性->链接器->附加依赖项中添加:libcurl_imp.lib、pthreadVCE2.lib 这两个库。再编译,走你。

、在程序编译没错,调试的时候却提示到:

void CCObject::retain(void)
{
    CCAssert(m_uReference > 0, "reference count should greater than 0");

    ++m_uReference;
}
通过堆栈调试得到是在:

cardGlobal_array=CCArray::createWithContentsOfFile("card.plist");
cardGlobal_array->retain();

有问题,通过F11进入到源码内部查处原因是图片加载的目录不对,在默认加载目录里并没有card.plist这张图片。

解决办法:加载时添加子路径,如:plist/card.plist。

2013-8-22

程序运行一两秒后出现以下错误提示:

un-Time Check Failure the value of ESP was not properly saved across a function call. this is usually a result of calling a function 
        declared with one calling convention with a function pointer declared with a different calling convention.
解决办法:在全局定时器上出了问题(什么是全局定时器?百度以下),在win平台上开发,那么声明函数加上关键字__stdcall,也就是在MyListener对全局定时器的声明和定义前加上:__stdcall

(PS:科普:__stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:
1.参数传递顺序
2.调用堆栈由谁(调用函数或被调用函数)清理
thiscall仅仅应用于“C++”成员函数。this指针存放于CX/ECX寄存器中,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。)



2013-8-29

在ScrollView中,水平拖动的图片会出现突然在竖直方向闪现的情况

解决办法:

在ScrollView的定义中,需要把ScrollView包容的layer的高度设置成和scrollView高度大小一致。

	campContainer_layer->setContentSize(CCSize(140*(campCard_array->count()+3)+60+40,290));
    
        CCScrollView* campScroll = CCScrollView::create(CCSize(400,290),campContainer_layer);


2013-9-22

再次出现以下错误提示:

un-Time Check Failure the value of ESP was not properly saved across a function call. this is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

但是这次的问题用上述的方法无法解决了,因为错误的函数不是出现在自定义的函数里,而是在ccTouchEnded里,这样就没办法再用 __stdcall的方法了。

既然这个不行,那就只能在函数的代码中找错误。

最终用排除法找出错误是在:

cardLayer_other->runAction(CCSequence::create(
			CCScaleTo::create(0.1f,0.9f),
			CCScaleTo::create(0.1f,0.8f)));
聪明的你肯定发现这样写是不对的。好吧,我承认犯这种错误很低级!谁让我目前还对action较为生疏呢~

于是我改成这样子:

CCActionInterval* actionTo = CCScaleTo::create(0.1f,0.9f);
CCActionInterval* actionBack = actionTo->reverse();
cardLayer_other->runAction(CCSequence::create(actionTo,actionBack,NULL));
运行下,又报错。错在第二个恢复动作不能直接用
actionTo->reverse();
因为只有CCScaleBy 这种的动作才能直接用reverse();其他的就只能勤快点写完整咯。那么,改吧:

CCActionInterval* actionTo = CCScaleTo::create(0.1f,0.9f);
CCActionInterval* actionBack = CCScaleTo::create(0.1f,0.8f);
cardLayer_other->runAction(CCSequence::create(actionTo,actionBack,NULL));
好了,完美运行!


2013-11-28

应用运行到析构函数的时候经常出现内存早已free等类似的错误,查看array释放有retain(),如果有的话,查看在构造函数中是否有将全局的数组或者字符串 初始化,如果有的话,注释掉它吧。。。(虽然知道这很不科学,但是很有效,呵呵)


2014-01-13

VS调试过程中,有些情况设置断点无响应,提示:当前不会命中断点等等,解决办法:

请在断点选项里设置允许源代码与原始版本不同。这个是针对单个断点进行设置。如果要对所有的断点进行设置,则要在“工具”——〉“选项”——〉“调试”——〉“要求源文件与原始版本完成匹配”去掉勾。如果还不行,就按下面这样试试:

以前为了调试“C++ Runtime Component”,把属性->调试里的“UI任务”和“代理任务”都改成“仅限本机”了。现在改回来,改成“仅限托管”。


2014-05-15

二维数组的初始化问题,

如果是定义局部的二维数组,则直接初始化,如:

int star[2][3] = {{}};

如果是在类中声明的二维数组,则不能像上面这样初始化,应该如下:

class star

{

public:

static int star[2][3];

};

在下面初始化

int star::star[2][3] = {{}};

你可能感兴趣的:(Cocos2d-x 解惑)