首先,我正在使用cocos2d 3.6
一切顺利,直到我按下键盘上的右箭头键,从keypress事件监听器执行startRunning()函数,操作成功停止,但在下一行,this->runAction(Animate::create( runAnimation));
,我得到错误。
runAnimation是好的。我想问题是在运行新的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", .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;
}
};
答案 0 :(得分:5)
您的 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();
}