cocos2d-x – 更改播放器动画时出错
发布时间:2020-12-14 18:57:12 所属栏目:百科 来源:网络整理
导读:首先,我使用的是cocos2d 3.6 一切顺利,直到我按下键盘上的右箭头键,从keypress事件监听器执行startRunning()函数,操作成功停止,但在下一行,this- runAction(Animate :: create(runAnimation));,得到错误. runAnimation是OK.我想问题是在运行新的Action但我不
首先,我使用的是cocos2d 3.6
一切顺利,直到我按下键盘上的右箭头键,从keypress事件监听器执行startRunning()函数,操作成功停止,但在下一行,this-> runAction(Animate :: create(runAnimation));,得到错误. runAnimation是OK.我想问题是在运行新的Action但我不知道它是什么. 这是代码: #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",-1); climbAnimation = createAnimation("Climb/player_climb_%d.png",-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",-1); runAnimation = createAnimation("Run/player_run_%d.png",-1); bowAnimation = createAnimation("Bow/bow_%d.png",-1); climbAnimation = createAnimation("Climb/player_climb_%d.png",-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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读