2015-07-23 11 views
5

सबसे पहले, मैं cocos2d 3.6 का उपयोग कर रहा हूं सबकुछ ठीक से काम करता है जब तक कि मैं कुंजीपटल पर दायां तीर कुंजी दबाता हूं जो कि keypress event श्रोता से startRunning() फ़ंक्शन निष्पादित करता है, क्रियाएं सफलतापूर्वक बंद हो जाती हैं लेकिन अगली पंक्ति पर , this->runAction(Animate::create(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; 
    } 



}; 

उत्तर

5

आपका createAnimation विधि देता है एक autoreleasedएनीमेशन वस्तु है, जो इससे पहले कि आप इसका इस्तेमाल जारी की है:

यहाँ कोड है।

इस मुद्दे आप अपने autoreleased वस्तुओं बनाए रखने के लिए जाने के बाद उन्हें बनाने के लिए, और उन्हें नाशक में जारी या जब आप उन्हें जरूरत नहीं है की जरूरत है ठीक करने के लिए कोई और अधिक:

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(); 
} 
संबंधित मुद्दे