位置: 编程技术 - 正文

cocos2dx ActionManager播放动画回调问题

编辑:rootadmin
ActionManager播放动画回掉问题 问题描述:我在studio编辑器里编辑了一个界面,里面有一个动画,我想当动画执行完毕后,再执行一些其他操作,然后就使用了ActionManager::shareManager()->playActionByName(JSON_NAME, "opacityAnimation", func)接口实现,结果动画播放完毕后程序就崩溃了

推荐整理分享cocos2dx ActionManager播放动画回调问题,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

更改代码如下 :问题解决,红色部分为更改部分,建议使用对比工具对比一下

#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());

cocos2dx ActionManager播放动画回调问题

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

RapidJSON的一些方便操作的宏定义 以前是一直使用CCJsonConventer去把JSON字符串转化为CCDictionary对象的,现在使用cocos2d-x3.x后,不推荐使用CCDictionary了,而且,JSON库也换成了rapidjson,不过我

cocos2dx 3.2 解决触摸事件中两个按钮同时响应的问题 上篇触摸机制讲解中提到过存在两个按钮同时响应的问题。问题描述我们一般使用EventListenerTouchOneByOne注册触摸事件,但是这里的触摸消息是按顺序依次

【cocos2dx】创建精灵的两种方法 一种为直接引用单张图片,但是这样效率不高,不推荐。第二中方法采用精灵帧的方法,通过工具TexturePacker将纹理打包成.plist文件,然后在进行访问。

标签: cocos2dx ActionManager播放动画回调问题

本文链接地址:https://www.jiuchutong.com/biancheng/372605.html 转载请保留说明!

上一篇:【cocos2dx】如何实现场景的跳转(cocos2d怎么用)

下一篇:RapidJSON的一些方便操作的宏定义(rapidjson使用)

  • 企业所得税相关分录
  • 转登记纳税人按规定再次登记为一般纳税人后
  • 土地税房产税会计分录
  • 仓库盘亏怎么处理
  • 购买土地自建厂房,土地怎样摊销
  • 职工受到工伤后应该怎么办
  • 收回个人社会保险费是否可以冲红管理费用
  • 稳岗返还入什么科目
  • 如何从对公账户的资金情况来确定案件,发现犯罪嫌疑人?
  • 停车费收入增值税申报表怎么填
  • 企业年金需要缴纳个人所得税吗
  • 加计扣除退回的所得税怎么做账
  • 1 3%增值税发票样本
  • 航天金穗服务费抵扣
  • 制造行业运输费包括哪些
  • 金碟系统操作
  • 公司注销时没有实收资本怎么办
  • 房产印花税缴纳
  • 企业所得税报表模板
  • 个人所得税的申报税额是什么意思
  • 销项税额是负数是怎么回事
  • 国有土地租金怎么交税
  • 车辆购置税通过应交税费吗
  • 资本公积转增资本什么意思
  • 代开的普通发票如何盖章?
  • 如何修改电脑默认打印机
  • windows11怎么显示桌面图标
  • ie增强的安全配置已启用上不了网
  • 网络端口被占用怎么解决
  • 个人与公司交易超过20万
  • Linux怎么使用Windows的软件
  • win11怎么用win10界面
  • 广告公司广告费会计分录
  • ServiceLayer.exe - ServiceLayer是什么进程 有什么用
  • linux中常用的文件类型有哪些如何区分
  • 工程结算书和竣工结算书
  • 顺流交易逆流交易区别
  • 钉钉的组织在线怎么设置
  • 公司投资一家公司然后再投资
  • 蓝桥杯b组2020
  • 新手入门指南
  • php递归函数桃子一天吃一半
  • 利润与所有者权益的区别
  • 销售的百分点怎么计算
  • ps中如何使用切片工具
  • 织梦相关文章调用
  • 一般纳税人废业企业库存怎么办
  • 应收账款逾期无法偿还
  • 增值税专用发票和普通发票的区别
  • 报销凭证粘贴单怎么用
  • 待摊费用属于企业的债权
  • 装修工程是可以做什么的
  • 劳务分包的形式完成施工任务
  • 发票冲红视频教程
  • 工会会员缴纳的医疗互助金列工会什么科目
  • 不得从销项税额中抵扣的进项税额,不得计提加计抵减额
  • 自来水厂被收购,员工怎么办
  • 出口不报关账务处理
  • 制造费用包括哪些内容科目
  • 施工单位结算
  • 存货毁损损失应计入的科目是
  • 行政事业单位预算一体化账务处理
  • 建筑行业总产值占我国GDP的比重
  • 实收资本,资本公积,盈余公积
  • 固定资产如何管理
  • 启用账簿时应在账簿上签名或盖章的是
  • mysql 5.7.30安装
  • 有效减少win8关机时间的方法分享
  • linux基金会什么时候成立
  • w8系统文件夹怎么设置密码
  • 初始化opengl时出错
  • jQuery的Ajax用户认证和注册技术实例教程(附demo源码)
  • unity3d性能优化工具
  • node基础知识
  • unity编辑器安装
  • jquery fullpage
  • 出口退税中的留抵税额
  • 河北华盛税务师事务所
  • 三证合一 税务
  • 如何打印个税缴纳记录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设