2015-07-23 13 views
5

Prima di tutto, sto utilizzando cocos2d 3.6 Tutto funziona bene finché non premo il tasto freccia destra sulla tastiera che esegue la funzione startRunning() dal listener di eventi keypress, le azioni vengono interrotte correttamente ma sulla riga successiva , this->runAction(Animate::create(runAnimation));, ottengo errore. runAnimation è OK. Immagino che il problema sia nell'eseguire una nuova azione ma non so cosa sia.Errore durante la modifica dell'animazione del player

Ecco il codice:

#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; 
    } 



}; 

risposta

5

tuo createAnimation metodo restituisce un autoreleasedanimazione oggetto, che viene rilasciato prima di usarla.

Per risolvere questo problema è necessario mantenere i vostri oggetti autoreleased dopo averli creati, e rilasciarli in distruttore o quando non hai bisogno di loro non più:

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(); 
} 
Problemi correlati