VS堆栈显示是在Animate::initAnimation中出错了
if ( ActionInterval::initWithDuration(singleDuration * animation->getLoops() ) )
{
_nextFrame = 0;
setAnimation(animation);
_origFrame = nullptr;
_executedLoops = 0;
_splitTimes->reserve(animation->getFrames().size()); // 这里出错
```
swordsman.cpp
#include "cocos2d.h"
#include "Swordsman.h"
#include "Enemy.h"
USING_NS_CC;
Swordsman::Swordsman(const std::string str) : Enemy(str) {
initPhysicsBody();
initAnimate();
idleAnimate();
}
void Swordsman::moveLeft() {
speed = _physicsBody->getVelocity() + Vec2(-MOVE_VEC, 0);
if (isSpeedZero()) {
idleAnimate();
isMove = false;
return;
}
if (isFaceRight) {
_sprite->setFlippedX(true);
isFaceRight = false;
}
if (!isMove) {
runAnimate(); // 执行这里 要么没有变化要么出错
isMove = true;
}
_physicsBody->setVelocity(speed);
}
void Swordsman::moveRight() {
speed = _physicsBody->getVelocity() + Vec2(MOVE_VEC, 0);
if (isSpeedZero()) {
idleAnimate();
isMove = false;
return;
}
if (!isFaceRight) {
_sprite->setFlippedX(false);
isFaceRight = true;
}
if (!isMove) {
runAnimate(); // 执行这里 要么没有变化要么出错
isMove = true;
}
_physicsBody->setVelocity(speed);
}
void Swordsman::idleAnimate() {
_sprite->stopAllActions();
_sprite->runAction(currentAnimate);
}
void Swordsman::runAnimate() {
_sprite->stopAllActions();
_sprite->runAction(Animate::create(runAnimation));
}
void Swordsman::attackAnimate() {
currentAnimate = Animate::create(attackAnimation);
_sprite->stopAllActions();
_sprite->runAction(currentAnimate);
}
void Swordsman::initIdleAnimation() {
idleAnimation = Animation::create();
for (int i = 1; i < 5; i++) {
idleAnimation->addSpriteFrameWithFile((std::string)StringUtils::format("Swordsman/idle_%d.png", i));
}
idleAnimation->setDelayPerUnit(0.18f);
idleAnimation->setLoops(-1);
}
void Swordsman::initRunAnimation() {
runAnimation = Animation::create();
for (int i = 1; i < 5; i++) {
runAnimation->addSpriteFrameWithFile((std::string)StringUtils::format("Swordsman/move_%d.png", i));
}
runAnimation->setDelayPerUnit(0.18f);
runAnimation->setLoops(-1);
}
void Swordsman::initAttackAnimation() {
attackAnimation = Animation::create();
for (int i = 1; i < 5; i++) {
attackAnimation->addSpriteFrameWithFile((std::string)StringUtils::format("Swordsman/attack_%d.png", i));
}
attackAnimation->setDelayPerUnit(0.18f);
attackAnimation->setLoops(-1);
}
void Swordsman::initAnimate() {
initIdleAnimation();
initRunAnimation();
initAttackAnimation();
}
```
有关此派生类的相关数据类型和函数在头文件的定义
public:
virtual void idleAnimate() = 0;
virtual void runAnimate() = 0;
virtual void attackAnimate() = 0;
virtual void stiffAnimate() = 0;
protected:
bool isFaceRight = true;
bool isMove = false;
Vec2 speed;
Animation* runAnimation;
Animation* idleAnimation;
Animation* attackAnimation;
```