【发布时间】:2015-10-13 08:59:59
【问题描述】:
首先,我使用的是 cocos2d 3.6
一切正常,直到我按下键盘上的右箭头键,从按键事件侦听器执行 startRunning() 函数,操作成功停止但在下一行,this->runAction(Animate::create( runAnimation));,我得到错误。
runAnimation 没问题。我猜问题出在运行 new 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;
}
};
【问题讨论】: