Cocos2d在继承的类

时间:2016-03-29 17:03:39

标签: c++ cocos2d-x marmalade

所以我在使用Cocos2d的自动释放恶作剧方面遇到了很多麻烦,并且(几乎)希望我能够自己处理所有这些......

无论如何,我遇到的问题是创建一些动画。我有一个名为AnimatedDamageableSprite的类,它继承自DamageableSprite继承自Sprite等的CCSprite ...

当我创建一个AnimatedDamageableSprite时,我在屏幕上有一个成功的动画,它会按预期运行。

当我创建Suicider时,(你猜对了)继承自AnimatedDamageableSprite,包含动画帧的CCArray在第一个循环之后不会存在,并且在第二次更新尝试时,程序会出现AV错误。

这是两个类的代码:

Sprite.h

// This class works
class AnimatedDamageableSprite :public DamageableSprite {
public:
    AnimatedDamageableSprite(int hp, CCPoint pos, CCTexture2D* tex, int rows, int columns, float scaleX, float scaleY);
    virtual ~AnimatedDamageableSprite();
    virtual void update(float dt);
    virtual bool updateFrame(float dt);
    virtual SpriteType getType() { return ANIMATED_DAMAGEABLE_SPRITE; };
protected:
    float m_frameNum;
    CCArray* m_frames;
    int m_numOfFrames;
};

// This class doesn't
class Suicider :public AnimatedDamageableSprite {
public:
    Suicider(int difficulty);
    virtual ~Suicider();
    virtual void update(float dt);
    virtual SpriteType getType() { return SUICIDER; };
private:
    float m_speed;
};

Sprite.cpp

AnimatedDamageableSprite::AnimatedDamageableSprite(int hp, CCPoint pos, CCTexture2D* tex, int rows, int columns, float scaleX, float scaleY)
    :DamageableSprite(hp, pos, tex, scaleX, scaleY), m_frameNum(0), m_numOfFrames(rows*columns) {
    float texWidth = tex->getContentSize().width / (float)columns;
    float texHeight = tex->getContentSize().height / (float)rows;
    m_frames = CCArray::createWithCapacity(m_numOfFrames);
    m_frames->retain();
    for (unsigned int i = 0; i < columns; i++) {
        for (unsigned int j = 0; j < rows; j++) {
            CCRect r(i*texWidth, j*texHeight, texWidth, texHeight);
            m_frames->addObject(new CCSpriteFrame);
            ((CCSpriteFrame*)m_frames->lastObject())->createWithTexture(tex, r);
            ((CCSpriteFrame*)m_frames->lastObject())->initWithTexture(tex, r);
            m_frames->lastObject()->retain();
        }
    }
    initWithSpriteFrame((CCSpriteFrame*)m_frames->objectAtIndex(m_frameNum));
    setTexture(tex);
    setPosition(pos);
    setScaleX(scaleX);
    setScaleY(scaleY);
    updateTransform();
}

// This function is called every frame. It returns a boolean for unrelated reasons
bool AnimatedDamageableSprite::updateFrame(float dt) {
    bool retVal = false;
    // Assume animations are at 30 FPS for now
    m_frameNum += dt * 0.03f;
    while (m_frameNum >= m_numOfFrames) {
        m_frameNum -= m_numOfFrames;
        retVal = true;
    }
    setDisplayFrame((CCSpriteFrame*)m_frames->objectAtIndex(m_frameNum));
    updateTransform();
    return retVal;
}

// This class calls the constructor of the one that works, and does nothing else relevant to the problem
// It also doesn't override the updateImage() function
Suicider::Suicider(int difficulty)
    : AnimatedDamageableSprite(1, CCPoint(10,10), g_textureManager.getTexture("Suicider Sheet"), 6, 10, SCALE_WIDTH, SCALE_HEIGHT) {
    // ...
}

编辑:

似乎我忘了实际指出问题。

CCArray* m_frames中声明的AnimatedDamageableSprite在该实例中使用时很好,但在Suicider类中使用时会在帧的末尾删除它 - 即它不是&#39保留。因此,当我尝试访问其中不再存在的项目时出现AV错误

我也尝试将其保留在Suicider构造函数中,尽管这并没有改变任何内容。

0 个答案:

没有答案