有一类的成员精灵在INIT方法生成,在成员方法调用时为啥总出错

我常常在INIT或者在构造函数中生成些精灵之类的,如果不在同一地方addChild() 到后面 addChild()时就会出错,
就算我在精灵生成处加上 retain()也不行,请问这是什么原因呢?

比如我有这样一个类

class CGameWood :
    public CCNode
{
public:
    CGameWood(void);
    ~CGameWood(void);

    virtual bool init();
    void HorseRideWood(); 
    CCPoint WoodGetPosition();
    CCPoint HorseGetPosition();
    void SetWoodUpHorseDisable(bool bOk);

public:
    CCSprite *m_woodSprite;
    CCSprite *horseSprite;
    


```


但我在使用的时候总是报错,好像这精灵已经被释放掉似的?请问为什么会这样?请帮帮忙,真的很头痛的问题 
 

你m_woodSprite->addChild是什么情况?
我没看到你m_woodSprite初始化相关的代码?是这原因?

为了节省地方,怕没人看,所以没截出来

CGameWood::CGameWood(void)
{    
    this->setContentSize(CCSizeMake(133, 63)); // 设置该类对象的尺寸
    m_woodSprite = CCSprite::create("horseRiver/wood.png");
    m_woodSprite->setPosition(ccp(270, 220));
    //m_woodSprite->setAnchorPoint(ccp(0, 0));
    

    CCActionInterval *woodMove = CCMoveTo::create(1.0f, ccp(WOOD_RIGHT_X, WOOD_Y));
    CCMoveTo *woodMoveReturn   = CCMoveTo::create(1.0f, ccp(WOOD_LEFT_X, WOOD_Y));// 返回 
    CCSequence *seq = CCSequence::create(woodMove, woodMoveReturn, NULL);
    m_woodSprite->runAction(CCRepeatForever::create(seq));// 木头类只需要不停左右运动
    this->addChild(m_woodSprite);
    //

}


```


是在构造函数里面初始化的

就是这样,所以让我很是不解:3:

我觉得是你到资源路径有问题,导致CCSprite创建失败,后面就获取不到了。

现在把两个成员精灵,都放在构造函数里初始化似乎就好了,但是我初始化了m_woodSprite
应该就能接着调用INIT方法了吧?那horseSprite应该也不应该没初始化啊。

怎么会资源路径有问题,路径有问题,根本就不能显示出来,到SPRITE生成那步就出错了。

.。。。。你分开初始化的话 要retain啊 不然当然就没了。。。。

哈哈,还真的是,太弱了这个问题,我也没看到,你的m_woodSprite…

试一下在在构造函数CGameWood::CGameWood()后面加:CCNode();

CGameWood::CGameWood():CCNode(){
}

构造里面的代码考到init的 ccnode::init的后面
确保你new后调用了init

有啊,我之前也retain了,你看我注释过的地方:6:

贴出错代码吧,第一次贴的明显是找不到,又不是段错误。

你的代码我自己写了一份,你的CGameWood怎么初始化的?贴下代码,我这里没问题的。

我的CGameWood类是这样定义的

class CHorsePlayScene :
    public cocos2d::CCLayer
{
public:
    virtual bool init();
    static cocos2d::CCScene *scene();
    CREATE_FUNC(CHorsePlayScene);// 即先调用构造函数(CCLayer类node方法中调用构造函数),再调用init方法进行初始化
    CHorsePlayScene(void);
    ~CHorsePlayScene(void);

    void InitHorseBG();

    // 转换当前小马动作方法
    void ChangeHorseAction(cocos2d::CCObject *menuItem);
    bool HorseWoodPosVerdict(); // 判断小马与木头的位置
    void HorseJump();           // 小马跳动作的设置
    void FallingDown();         // 小马落水后转场 
private:
    cocos2d::CCSprite *horseSprite;// 此精灵是岸边的小马
    CHorseObj *horse;              // 用于接收小马类的对象
    CGameWood *wood;               // 用于接收木头的对象
    int          m_status;            // 小马当前应该执行的动作状态
    int          m_nHorseDirection;   // 小马面朝向
};


```


然后我在另外一个类里 NEW它的对象

bool CHorsePlayScene::init()
{
    InitHorseBG();

    
    // 创建木头
    wood = new CGameWood();                                                                         
    
    this->addChild(wood, 2, 2);
    
    CCDelayTime *delay = CCDelayTime::create(3.0f);
    
    return true;
}


```


就是这样而已,所以那奇怪的问题,让我很是捉急:5:

你跟一下,看看是不是因为你的init方法没走,如果没走要么自己调用一次wood->init,要么用create函数创建对象。