改变玩家动画时出错



首先,我使用cocos2d 3.6一切都工作得很好,直到我按键盘上的右箭头键,从按键事件监听器执行startRunning()函数,动作成功停止,但在下一行,this->runAction(Animate::create( runAnimation));,我得到错误。runAnimation没问题。我想问题是在运行新的动作,但我不知道是什么。

代码如下:

#pragma once
#include "cocos2d.h"
using namespace cocos2d;
const int DIR_RIGHT = 1;
const int DIR_LEFT = -1;


class CPlayer: public Sprite
{
private:
    Animation* idleAnimation;
    Animation* runAnimation;
    Animation* bowAnimation;
    Animation* climbAnimation;
    SpriteFrame* jumpFrame;
    SpriteFrame* fallFrame;
    SpriteFrame* wallJumpFrame;
    boolean onGround = true;
    boolean running = false;
    int dir = DIR_RIGHT;
    float movementSpeed = 50; //50 unit in world space 
    float stateTime=0;
public:
    Animation* createAnimation(const char* format, float delay, bool loop){
        Animation* animation = Animation::create();
        char str[100] = { 0 };
        int frameIndex = 1;
        do
        {
            sprintf(str, format, frameIndex);
            auto frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
            if (frame == NULL)
                break;
            animation->addSpriteFrame(frame);
            Texture2D::TexParams texParams = { GL_NEAREST, GL_NEAREST, GL_CLAMP_TO_EDGE, GL_CLAMP_TO_EDGE };
            frame->getTexture()->setTexParameters(texParams);
            frameIndex++;
        } while (true);
        int loops = 1;
        if (loop)
            loops = -1;
        animation->setDelayPerUnit(delay);
        animation->setLoops(loops);

        return animation;
    }
    CPlayer(){
        idleAnimation = createAnimation("Idle/player_idle_%d.png", .2f, -1);
        runAnimation = createAnimation("Run/player_run_%d.png", .5f, -1);
        bowAnimation = createAnimation("Bow/bow_%d.png", .2f, -1);
        climbAnimation = createAnimation("Climb/player_climb_%d.png", .2f, -1);
        jumpFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("Fall-Jump-WallJ/player_climb_jump.png");
        fallFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("Fall-Jump-WallJ/player_climb_fall.png");
        wallJumpFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("Fall-Jump-WallJ/player_climb_wall_jump.png");
        this->runAction(Animate::create(idleAnimation));
    }
    CREATE_FUNC(CPlayer);
    void startRunning(){
        running = true;
        if (onGround){
            this->stopAllActions();
            this->runAction(Animate::create( runAnimation));
        }
    }
    void endRunning(){
        running = false;
        if (onGround){
            this->stopAllActions();
            this->runAction(Animate::create(idleAnimation));
        }
    }
    void update(float delta){
        stateTime += delta;
        if (onGround && running){
            this->setPositionX(this->getPositionX() + delta*  movementSpeed*dir);
        }
    }
    void headToRight(){
        this->setFlipX(false);
        dir = DIR_RIGHT;
    }
    void headToLeft(){
        this->setFlippedX(true);
        dir = DIR_LEFT;
    }

};

您的createAnimation方法返回一个自动释放的动画对象,该对象在您使用它之前被释放。

要解决这个问题,你需要在创建自动释放对象后保留它们,并在析构函数中释放它们,或者当你不再需要它们时:

CPlayer(){
    idleAnimation = createAnimation("Idle/player_idle_%d.png", .2f, -1);
    runAnimation = createAnimation("Run/player_run_%d.png", .5f, -1);
    bowAnimation = createAnimation("Bow/bow_%d.png", .2f, -1);
    climbAnimation = createAnimation("Climb/player_climb_%d.png", .2f, -1);
    idleAnimation->retain();
    runAnimation->retain();
    bowAnimation->retain();
    climbAnimation->retain();
    jumpFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("Fall-Jump-WallJ/player_climb_jump.png");
    fallFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("Fall-Jump-WallJ/player_climb_fall.png");
    wallJumpFrame = SpriteFrameCache::getInstance()->getSpriteFrameByName("Fall-Jump-WallJ/player_climb_wall_jump.png");
    this->runAction(Animate::create(idleAnimation));
}
virtual ~CPlayer() {
    idleAnimation->release();
    runAnimation->release();
    bowAnimation->release();
    climbAnimation->release();
}

最新更新