cocos2d-x 疑難奇葩錯誤

1. Invalid Type for cocos2d::Vector<T>! 
cocos2d::Vector<XX*> 定義在頭文件裏XX不能用前向聲明,即class XX; ,只能在頭文件裏包含 #include "XX.h",否則會出此錯

2. CCRANDOM_0_1函數不隨機,每次運行生成數據都一樣! 

關於隨機數 cocos2d-x 定義了一個宏 CCRANDOM_0_1() 生成的是 [0, 1] 之間的值

因此,要生成  [0-100] 之間的數    CCRANDOM_0_1() * 100

生成 [1,5]  之間的float 數,  就是 CCRANDOM_0_1() * 4 + 1

此函數調用了rand(),使用rand()要設定隨機數種才能實現真正隨機
//指定隨機數種子,隨機數依據這個種子產生 採用當前時間生成隨機種子:
struct timeval now;
gettimeofday(&now, NULL); //計算時間種子
unsigned rand_seed = (unsigned)(now.tv_sec*1000 + now.tv_usec/1000);
srand(rand_seed);
接下來調用 CCRANDOM_0_1就OK了

3. schedule函數不起作用,定時函數不執行
我的代碼:

void Wave::start()
{
	this->schedule(schedule_selector(Wave::startRunEnemy), _beginRate);
}
但進入遊戲後startRunEnemy死活不執行,原因是schedule有個變量m_bRunning沒有激活。這個變量必須在調用了Node::onEnter()纔會置爲true。所以出現這個問題原因是:1. Wave沒有繼承爲Node類  2.Wave沒有掛載到場景上  3. 沒有調用Node::onEnter(),解決這個問題很簡單,在schedule之前加上onEnter就是,目測也沒什麼副作用,如下:
void Wave::start()
{
	Node::onEnter();
	this->schedule(schedule_selector(Wave::startRunEnemy), _beginRate);
}

但是在unschedule函數之前,即取消定時器的時候還要加上Node::onExit(),否則也是不能取消定時器

4. 項不會計算爲接受一個參數的函數

都說運行時錯誤難找,但編譯時報錯有時也很頭疼,定位於錯誤居然是xrefwrap什麼玩意的文件,我想媽呀,這回是內核級錯識了,我哪有本事改,但沒本事改也的改呀,只好看報錯位置,是_VARIADIC_EXPAND_0X(_APPLYX_CALLOBJ, , , , )什麼天書一樣的東東,看樣子好像是函數綁定之類,我想起了代碼只有一個地方用到了函數指針綁定,有一個函數定義是這樣的:

void addFixturesToBody(b2Body *body, std::string shapeName, std::function<void*(int)> userdataCallBack, float scale);

其中std::function<void*(int)>是重點懷疑對象,是不是std::function我用錯了語法了呢,我只知道void*是返回值,(int)表示函數只有一個int型指針,但其他的我就不知道了,對這個新東西我確實不熟,再加上返回值還是void*,就更復雜了,與是我把它改了又改,還是錯誤依舊。

我想要是運行時報錯就好了,起碼我還能下個斷點知道哪裏錯,這編譯時出錯我哪知道哪一句出錯了呢,我不死心看vs的輸出窗口,果然在最下面被我發現了,

d:\cocos2dpro\spacegame\classes\shapecache.cpp(111): 參見對正在編譯的函數 模板 實例化“std::function<_Fty>::function<int>(_Fx &&)”的引用

好,我定位到shapecache.cpp第111行,果然被我找到了罪魁禍首,函數調用這兒:

this->addFixturesToBody(body, shapeName, NULL, scale);  我用那個NULL代替了函數指針,原來找不到這個函數指針,所以不能轉化,奇怪的是我把NULL改成nullptr就好了,不知道原因

看來出錯了多看看輸出還是有好處的。

5. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call..

這是最奇葩的錯誤了,有的時候不怎麼出現,但一旦報這個錯保準能讓你求生不得求死不能。爲什麼?太高深了太低層了呀。查網上有關這錯誤的,有的說是函數調用時有內存溢出把棧給沖毀了。你說這怎麼改?還有的說是調用錯誤,應該聲明_stdcall。可是我又沒用到那玩藝,難道要改低層cocos2d-x引擎呀?終於,找到一篇有用的文章說是還是函數指針錯誤 ,函數指針調用時與規定的格式參數不匹配會報這個錯。我這個錯是在update函數裏出現的,調用如下:在某層init方法中:

//設置定時回調方法
auto sched = Director::getInstance()->getScheduler();
sched->schedule(//設置定時回調方法
auto sched = Director::getInstance()->getScheduler();
sched->schedule(SEL_SCHEDULE(&MenuLayer::update), this, 0.1f, false);  //每0.1秒回調一下

問題就是這個update方法聲明,這位大牛是在android環境下寫的,在類聲明中寫成void update();

但我們知道update是聲明標準是void update(float dt);而且SEL_SCHEDULE也聲明瞭update是帶參數float型,所以這裏函數指針與規定的不匹配,就會報這個難解的錯誤,我搜索工程中所有的update,都加上參數float dt,問題解決!

發佈了50 篇原創文章 · 獲贊 16 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章