cocos2d-x问题记录:只在回调函数中执行动作会导致终端
2016-01-13 21:30
363 查看
今天写一个Demo,犯了一个容易疏忽的错误,记录于此。
角色类:Actor
在init()方法中完成了m_MoveLeftAction和m_MoveRightAction的初始化,代码略。
在场景类中init()中调用MoveRight() MoveLift()测试正常,在键盘响应事件中调用出错,调用堆栈停在
action->startWithTarget(target);//此处出错
原因:
在Actor对动作变量完成初始化后,未执行此动作,此时在场景的init()中调用是没有问题的,因为此时一帧并未结束,动作变量引用计数大于0。在场景的init()函数结束之后,引擎主循环开始,此时动作因为没有在每一帧被执行,会因为自动释放机制引用计数变为0,此时再执行动作就会引发错误。
解决:
手动retain()和release()
角色类:Actor
#ifndef __ACTOR_H #define __ACTOR_H #include "cocos2d.h" USING_NS_CC; typedef enum _ActorState { MoveLeft, MoveRight, Stand, }ActorState; class Actor : public Sprite { public: Actor(); ~Actor(); virtual bool init(); CREATE_FUNC(Actor); void MoveRight(); void MoveLeft(); void StopMove(); private: void changeActorState(ActorState state); Action *m_MoveLeftAction; Action *m_MoveRightAction; ActorState m_actorState; }; #endif
在init()方法中完成了m_MoveLeftAction和m_MoveRightAction的初始化,代码略。
在场景类中init()中调用MoveRight() MoveLift()测试正常,在键盘响应事件中调用出错,调用堆栈停在
action->startWithTarget(target);//此处出错
原因:
在Actor对动作变量完成初始化后,未执行此动作,此时在场景的init()中调用是没有问题的,因为此时一帧并未结束,动作变量引用计数大于0。在场景的init()函数结束之后,引擎主循环开始,此时动作因为没有在每一帧被执行,会因为自动释放机制引用计数变为0,此时再执行动作就会引发错误。
解决:
手动retain()和release()
相关文章推荐
- Cocos2d-x中背景音乐和音效使用实例
- Cocos2d-x学习笔记之CCScene、CCLayer、CCSprite的默认坐标和默认锚点实验
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之文本类使用实例
- Cocos2d-x保存用户游戏数据之XML文件是否存在问题判断方法
- Cocos2d-x UI开发之菜单类使用实例
- Cocos2d-x UI开发之CCControlButton控件类实例
- Cocos2d-x学习笔记之世界坐标系、本地坐标系、opengl坐标系、屏幕坐标系
- Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
- Cocos2d-x学习笔记之CCLayerColor层的使用实例
- Cocos2d-x Schedule定时器的使用实例
- Cocos2d-x中使用CCScrollView来实现关卡选择实例
- Cocos2d-x中CCEditBox文本输入框的使用实例
- cocos2d-x学习笔记之CCLayer、CCLayerColor、CCLayerGradient、CCLayerMultiplex场景层介绍
- Cocos2d-x UI开发之CCControlSlider控件类使用实例
- Cocos2d-x学习笔记之开发环境搭建
- Cocos2d-x学习笔记之Hello World!
- 使用C++进行Cocos2d-x游戏开发入门过程中的要点解析
- Cocos2d-x的内存管理总结
- Cocos2d-x 3.0中集成社交分享ShareSDK的详细步骤和常见问题解决