cocos2dx ActionManager播放动画回调问题
来源:互联网 发布:市场进入策略一手数据 编辑:程序博客网 时间:2024/05/21 23:00
ActionManager播放动画回掉问题
问题描述:我在studio编辑器里编辑了一个界面,里面有一个动画,我想当动画执行完毕后,再执行一些其他操作,然后就使用了ActionManager::shareManager()->playActionByName(JSON_NAME, "opacityAnimation", func)接口实现,结果动画播放完毕后程序就崩溃了
更改代码如下 :问题解决,红色部分为更改部分,建议使用对比工具对比一下
#include "CCActionObject.h"
#include "CCActionNode.h"
#include "../Json//DictionaryHelper.h"
#include "../Json/CocoLoader.h"
NS_CC_EXT_BEGIN
ActionObject::ActionObject()
: m_ActionNodeList(NULL)
, m_name("")
, m_loop(false)
, m_bPause(false)
, m_bPlaying(false)
, m_fUnitTime(0.1f)
, m_CurrentTime(0.0f)
, m_pScheduler(NULL)
, m_CallBack(NULL)
, m_fTotalTime(0.0f)
{
m_ActionNodeList = CCArray::create();
m_ActionNodeList->retain();
m_pScheduler = CCDirector::sharedDirector()->getScheduler();
CC_SAFE_RETAIN(m_pScheduler);
}
ActionObject::~ActionObject()
{
m_ActionNodeList->removeAllObjects();
m_ActionNodeList->release();
//CC_SAFE_RELEASE_NULL(m_ActionNodeList);
CC_SAFE_RELEASE(m_CallBack);
CC_SAFE_RELEASE(m_pScheduler);
}
void ActionObject::setName(const char* name)
{
m_name.assign(name);
}
const char* ActionObject::getName()
{
return m_name.c_str();
}
void ActionObject::setLoop(bool bLoop)
{
m_loop = bLoop;
}
bool ActionObject::getLoop()
{
return m_loop;
}
void ActionObject::setUnitTime(float fTime)
{
m_fUnitTime = fTime;
int frameNum = m_ActionNodeList->count();
for ( int i = 0; i < frameNum; i++ )
{
ActionNode* actionNode = (ActionNode*)m_ActionNodeList->objectAtIndex(i);
actionNode->setUnitTime(m_fUnitTime);
}
}
float ActionObject::getUnitTime()
{
return m_fUnitTime;
}
float ActionObject::getCurrentTime()
{
return m_CurrentTime;
}
void ActionObject::setCurrentTime(float fTime)
{
m_CurrentTime = fTime;
}
float ActionObject::getTotalTime()
{
return m_fTotalTime;
}
bool ActionObject::isPlaying()
{
return m_bPlaying;
}
void ActionObject::initWithDictionary(const rapidjson::Value& dic,CCObject* root)
{
setName(DICTOOL->getStringValue_json(dic, "name"));
setLoop(DICTOOL->getBooleanValue_json(dic, "loop"));
setUnitTime(DICTOOL->getFloatValue_json(dic, "unittime"));
int actionNodeCount = DICTOOL->getArrayCount_json(dic, "actionnodelist");
int maxLength = 0;
for (int i=0; i<actionNodeCount; i++) {
ActionNode* actionNode = new ActionNode();
actionNode->autorelease();
const rapidjson::Value& actionNodeDic = DICTOOL->getDictionaryFromArray_json(dic, "actionnodelist", i);
actionNode->initWithDictionary(actionNodeDic,root);
actionNode->setUnitTime(getUnitTime());
m_ActionNodeList->addObject(actionNode);
int length = actionNode->getLastFrameIndex() - actionNode->getFirstFrameIndex();
if(length > maxLength)
maxLength = length;
}
m_fTotalTime = maxLength*m_fUnitTime;
}
void ActionObject::initWithBinary(cocos2d::extension::CocoLoader *pCocoLoader, cocos2d::extension::stExpCocoNode *pCocoNode, cocos2d::CCObject *root)
{
stExpCocoNode *stChildNode = pCocoNode->GetChildArray(pCocoLoader);
stExpCocoNode *actionNodeList = NULL;
int count = pCocoNode->GetChildNum();
for (int i = 0; i < count; ++i) {
std::string key = stChildNode[i].GetName(pCocoLoader);
std::string value = stChildNode[i].GetValue(pCocoLoader);
if (key == "name") {
setName(value.c_str());
}else if (key == "loop"){
setLoop(valueToBool(value));
}else if(key == "unittime"){
setUnitTime(valueToFloat(value));
}else if (key == "actionnodelist"){
actionNodeList = &stChildNode[i];
}
}
if(NULL != actionNodeList)
{
int actionNodeCount = actionNodeList->GetChildNum();
stExpCocoNode *actionNodeArray = actionNodeList->GetChildArray(pCocoLoader);
int maxLength = 0;
for (int i=0; i<actionNodeCount; i++) {
ActionNode* actionNode = new ActionNode();
actionNode->autorelease();
actionNode->initWithBinary(pCocoLoader, &actionNodeArray[i] , root);
actionNode->setUnitTime(getUnitTime());
m_ActionNodeList->addObject(actionNode);
int length = actionNode->getLastFrameIndex() - actionNode->getFirstFrameIndex();
if(length > maxLength)
maxLength = length;
}
m_fTotalTime = maxLength*m_fUnitTime;
}
}
int ActionObject::valueToInt(std::string& value)
{
return atoi(value.c_str());
}
bool ActionObject::valueToBool(std::string& value)
{
int intValue = valueToInt(value);
if (1 == intValue) {
return true;
}else{
return false;
}
}
float ActionObject::valueToFloat(std::string& value)
{
return atof(value.c_str());
}
void ActionObject::addActionNode(ActionNode* node)
{
if (node == NULL)
{
return;
}
m_ActionNodeList->addObject(node);
node->setUnitTime(m_fUnitTime);
}
void ActionObject::removeActionNode(ActionNode* node)
{
if (node == NULL)
{
return;
}
m_ActionNodeList->removeObject(node);
}
void ActionObject::play()
{
stop();
this->updateToFrameByTime(0.0f);
int frameNum = m_ActionNodeList->count();
for ( int i = 0; i < frameNum; i++ )
{
ActionNode* actionNode = (ActionNode*)m_ActionNodeList->objectAtIndex(i);
actionNode->playAction();
}
if (m_loop)
{
m_pScheduler->scheduleSelector(schedule_selector(ActionObject::simulationActionUpdate), this, 0.0f , kCCRepeatForever, 0.0f, false);
}
else
{
m_pScheduler->scheduleSelector(schedule_selector(ActionObject::simulationActionUpdate), this, 0.0f, false);
}
}
void ActionObject::play(CCCallFunc* func)
{
this->play();
m_CallBack = func;
CC_SAFE_RETAIN(m_CallBack);
}
void ActionObject::pause()
{
m_bPause = true;
}
void ActionObject::stop()
{
if (this->m_CallBack)
{
this->m_CallBack->release();
this->m_CallBack = NULL;
}
int frameNum = m_ActionNodeList->count();
for ( int i = 0; i < frameNum; i++ )
{
ActionNode* actionNode = (ActionNode*)m_ActionNodeList->objectAtIndex(i);
actionNode->stopAction();
}
m_pScheduler->unscheduleSelector(schedule_selector(ActionObject::simulationActionUpdate), this);
m_bPause = false;
}
void ActionObject::updateToFrameByTime(float fTime)
{
m_CurrentTime = fTime;
int nodeNum = m_ActionNodeList->count();
for ( int i = 0; i < nodeNum; i++ )
{
ActionNode* actionNode = (ActionNode*)m_ActionNodeList->objectAtIndex(i);
actionNode->updateActionToTimeLine(fTime);
}
}
void ActionObject::simulationActionUpdate(float dt)
{
bool isEnd = true;
int nodeNum = m_ActionNodeList->count();
for ( int i = 0; i < nodeNum; i++ )
{
ActionNode* actionNode = (ActionNode*)m_ActionNodeList->objectAtIndex(i);
if (actionNode->isActionDoneOnce() == false)
{
isEnd = false;
break;
}
}
if (isEnd)
{
if (m_CallBack != NULL)
{
m_CallBack->execute();
}
if (m_loop)
{
this->play();
}
else
{
m_bPlaying = false;
m_pScheduler->unscheduleSelector(schedule_selector(ActionObject::simulationActionUpdate), this);
}
}
}
NS_CC_EXT_END
- cocos2dx ActionManager播放动画回调问题
- cocos2dx ActionManager动作管理
- cocos2dx - ActionManager内存泄露
- cocos2dx源码分析:ActionManager
- Cocos2dx 播放flash动画
- cocos2dx 播放动画
- cocos2dx动画播放混乱
- cocos2dx中播放Armature动画
- cocos2dx coscostudio 动画连续播放
- ActionManager
- cocos2dx-js 帧动画的播放方法
- Cocos2dx 帧动画播放动作类-Animate
- 解决cocos2dx CCArmature动画在部分型号的安卓手机上播放不正常的问题
- Cocos2dx-lua 播放音循环播放问题
- cocos2dx Action 的学习Cocos2d-x v3.3 ActionManager详解
- cocos2dx中播放循环音效问题
- cocos2dx 几个精灵按照顺序播放动画解决方法
- 【Cocos2dx-lua 3.11.1】plist制作、播放帧动画
- POJ1062 昂贵的聘礼 图论(Dijkstra)
- Linux 使用 cp 命令强制覆盖功能
- 详解OSX(Unix)中的Hard Link与Symbolic Link((硬连接与软连接)
- 线程和进程的区别
- css样式重置
- cocos2dx ActionManager播放动画回调问题
- 强大的NPOI
- linux下安装 QQ2014
- 哈弗曼编码
- byte的范围为何是-128到127
- 在Eclipse中搭建quick-cocos2d-x的lua开发环境
- iOS面试题总
- 创建型模式
- Android动画效果translate、scale、alpha、rotate详解