[cocos2d-x篇]讀取其它類別裡的指標變數

文章撰寫日期︰2013/02/28 15:18
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

在Cocos2d-x裡,
每個物件被實體化到被釋放的過程非常的嚴謹和短暫,
如果需要存取,
除了要對指標變數下cocos2dx的內建宏(macro)
CC_SAFE_RETAIN(指標變數)
來保護指標變數不會被輕易釋放掉以外,
在官方的Sample code - SimpleGame的GameOverLayer.h裡還看到了一個存取指標變數的方法︰
在標頭檔.h裡宣告以下宏
CC_SYNTHESIZE_READONLY(cocos2d::CCSprite*, droidGuy, Sprite);
這行程式碼會宣告droidGuy這個指標變數為CCSprite物件,
並且可以使用getter的方式從外部類別取到該指標物件。
layer1->getSprite();
這樣子就能取到該指標物件了。

[cocos2d-x篇]指標變數被釋放造成BAD_ACCESS

文章撰寫日期︰2013/02/28 14:56
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

宣告了CCLabelTTF指標變數,
在後來的程式流程需要setString("")重新更改CCLabelTTF裡的文字,
卻遇到BAD_ACCESS問題,
告訴我CCLabelTTF已經放Cocos2d-X釋放掉了。

二、解決辦法

CCLabelTTF最好在CCNode的實作函式bool init()裡去宣告,
並且init()裡使用do{}while(0)機制,
讓指標變數物件一旦都實體化成功後,
return true來告知cocos2d-x該Scene的init()已實體宣告成功。

bool TestSceneLayer::init(){
    bool bRet = false;
    do {
        setTouchEnabled( true );
        setAccelerometerEnabled( true );
        
        CCSize s = CCDirector::sharedDirector()->getWinSize();

        // init physics
        this->initPhysics();

        label = CCLabelTTF::create("TestSceneLayer", "Marker Felt", 32);
        this->addChild(label, 0);
        label->setColor(ccc3(0,0,255));
        label->setPosition(ccp( s.width/2, s.height-50));

        bRet = true;
    } while (0);
    return bRet;
}

外層要使用該Scene的方式也很簡單,
就是使用Scene::create(),
此函式會去啟動init該函式。
cocos2d::CCScene* TestSceneLayer::scene()
{
    // 'scene' is an autorelease object
    CCScene * scene = NULL;

    do {
        scene = CCScene::create();
        CC_BREAK_IF(! scene);

        
        // add layer as a child to scene
        TestSceneLayer* layer1 = TestSceneLayer::create();
        scene->addChild(layerl);
        
    } while (0);
    
    return scene;
}


經過以上的使用,
應該就不會發生指標變數中途被釋放造成BAD_ACCESS的問題。

[CocosBuilder篇]載入ccb檔遇到BAD_ACCESS錯誤

文章撰寫日期︰2013/2/28 11:52
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在cocosbuilder更新了ccb(CocosBuilder圖層檔)後,
在cocos2dx裡CCBReader::readKeyframe(int type)函式遇到BAD_ACCESS的錯誤。

二、解決辦法

此問題主要是因為在Cocosbuilder裡添加了新的sprite圖片和物件,
但在Xcode專案References裡卻找不到該ccb檔特定幀的圖片資源,
造成ccb檔匯入失敗。

請確認是否有將所有ccb檔需用到的圖形資源匯進Xcode資料夾

[Blogger篇]讓部落格的程式語法高亮

讓網頁部落格的語法(高亮)被標註 http://www.stylifyyourblog.com/2012/07/syntax-highlighting-in-blogger-using.html

[cocos2d-x篇]'jni.h' file not found

文章攢寫時間︰2013/02/14 19:15
文章修改時間︰2013/03/09 15:32
文章修改次數︰2
cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題

在編譯cross-platform時遇到'jni.h' file not found的錯誤。

二、解決辦法

由於Android lib要置入CocosDenshion\android才能跨系統透過JNI控制Android的音控,
將Xcode裡CocosDenshion\android資料夾移除Reference即可。

因為jni.h要在Android編譯時才會找到。


[cocos2d-x篇]CocosBuilder製作出來的動畫停滯不動

文章攢寫時間︰2013/02/14 19:15
文章修改時間︰2013/03/09 15:32
文章修改次數︰2

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1

一、問題
今天試圖用CocosBuilder 2.1 + Cocos2d-X 2.0.4製作動畫互動遊戲,
但卻遇到CocosBuilder製作出來的動畫,
如果純粹使用
  CCNodeLoaderLibrary* nodeLoaderLibrary = 
          CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary();

而沒有再加上
  nodeLoaderLibrary->
   registerCCNodeLoader("GameScene", GameSceneLayerLoader::loader());
時,
動畫能正常播放,
加了NodeLoader反而就停滯不動的問題。

一直往CocosBuilder的相關底層CCBReader去找原因,
卻找不到。

二、解決辦法

後來才發現因為我繼承的CCLayer子類別裡,
因為有覆寫CCLayer::onEnter(),
但實作時,
忘了在該覆寫函式第1行呼叫︰CCLayer::onEnter()去引用父類別的onEnter()事件導致產生CocosBuilder製作出來的動畫完全停滯不動的問題。

這個問題花了2天終於找到原因。



=======================================
補述︰
onEnter是CCLayer的虛擬函式(virtual method),
   virtual void onEnter();
virtual method在C++的功能是「多型」,
也就是說,
一旦在子類別實作了此函式,
那麼程式將不會執行父類別的onEnter函式,
而直接呼叫子類的onEnter函式。

詳情可參考Gossip的部落格

[C++篇]兩個類互相引用的編譯衝突

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
文章撰寫時間︰2013/02/13 12:50

一、問題


今天遇到一個狀況︰

在cocos2d-x裡我有2個類要彼此呼叫使用,

在A.h裡下以下代碼
#include "B.h"
而在B.h裡下以下代碼
#include "A.h"
這時候編譯器告訴我們︰
不能在A.h裡載入B.h,
而B.h裡也載入A.h
這樣做會相衝

二、解決辦法

將include的動作放在2個body中即可解決

在A.cpp裡#include "B.h"
也在B.cpp裡#include "A.h"

[cocos2d-x篇]cocos2d-x v.2.0後對多螢幕解析度的支援方式

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
文章攢寫時間︰2013/02/12 13:20

在cocos2d-x v2.0後
針對多螢幕析度上做了很好的適應支援。

cocos2d-x目前提供了3種螢幕適屏方式,
分別為︰

1.以高為主,左右可能會有黑邊的kResolutionShowAll

內置圖片 2
kResolutionShowAll

2.以寬為主,上下可能會被裁切的kResolutionNoBorder

內置圖片 5
kResolutionNoBorder


3.強制縮放kResolutionExactFit
內置圖片 4
kResolutionExactFit

而這是用iPod 960*640製作的原比例

內置圖片 6
原比例
至於要怎麼使用這3種模式,
在cocos2dx的sample code
HelloCpp-->AppDelegate.cpp裡
// Set the design resolutiont
pEGLView->setDesignResolutionSize
(designResolutionSize.width, designResolutionSize.height, 
kResolutionNoBorder);

網上也很多相關的說明,不在此一一縐述。
cocos2dx果然很強悍啊!

Cocos2d-X + CocosBuilder 經驗手扎

cocos2dx使用版本︰v 2.0.4
cocosBuilder使用版本︰v 2.0 alpha 1
文章攢寫時間︰2013/02/11
文章更新時間︰2013/02/12 13:25
文章更新次數︰2

一、問題
大年初一折騰了一整天,
一直無法將cocosBuilder製作出來的ccbi文檔在cocos2d-X(Xcode environment)載入。

break point落在
CCNode.cpp addChilde函式
void CCNode::addChild(CCNode *child)
{
    CCAssert( child != NULL, "Argument must be non-nil");
    this->addChild(child, child->m_nZOrder, child->m_nTag);
}
說明︰Cocos2d-X發現欲加入的child(下面匯入ccbi產生的node)是空值,
造成程式無法繼續進行。

二、解決辦法

網路上一堆有用無用的文章,
終於確定CocosBuilder 3 Alpha輸出的ccbi文檔
無法在Cocos2d-X 2.0.4下使用
CCNode* node = ccbReader->readNodeGraphFromFile("HelloCocosBuilder.ccbi");
此node節點一直無法實例化,
產生的node是空值。

如果改用CocosBuilder 2.1+ Cocos2d-X 2.0.4則問題解決

至於載入ccbi的方式
我是用這個老外的方式成功載入。

註︰
經爬文後,
發現CocosBuilder 3對ccbi文檔做了全新的攢寫,
目前cocos2dx v2.0.4版內建的CCBReader僅支援ccb 2代。
cocos2dx的團隊正在積極更新中。

另外,
CocosBuilder 3製作出來的專案檔,
不能在CocosBuilder 2做修改編輯!