cocos2d-x 关于是否继承CCSprite,以及关于继承初始化时候的未知问题
来源:互联网 发布:网络写手培训 编辑:程序博客网 时间:2024/05/08 17:05
转自:http://blog.csdn.net/chiuan/article/details/8531975
最近学习cocos2dx时候,正在打算把一个cocos2d-iPhone项目转用cocos2dx写一遍。
刚实现基本的场景逻辑,便出现一些奇怪的问题:
1、程序启动随机当机
2、对象实例化添加到SpriteBatchNode后闪一下便消失了
问题1:
首先我的程序主要层级架构如下:
GameSence :管理游戏中Sence\Layer等场景高级层次的关系
GameLayer :统一获取游戏对象GameObjects的引用,以及添加到游戏里面游戏对象物体的生成“层”;有CCArray作为所有游戏对象的管理,游戏对象input\touch的控制
BackgroundLayer :背景层的管理
GameUILayer :游戏中UI层的管理和点击控制等
GameLogic :负责一些游戏逻辑的控制,例如 GameObjects spawn、UIController;
导致问题1是我GameSence继承了CCSence导致的,后来把CCSence变为GameSence的一个对象,然后直接调用这个对象进行添加其他游戏Layer即可解决。问题我还没发现网上有雷同的,暂时不是很清楚其原因。
问题2:
首先我的程序游戏对象之间的关系如下:
CCSprite->GameObject->Monster->QuirkMonster
->ZapMonster
->Player->HumanPlayer
->AIPlayer
如上,我创建了一个GameObject游戏对象“基类”继承了CCSprite,由于我想实现static的create(……)方法来实例化具体的子类对象,导致我直接就用父类初始化实例化的对象转为我想要的子类实例。
例如:
GameObject * obj = new GameObject();
Monster* monster = (Monster*)obj;
确实父类强转子类在这里可行,但问题却出来了,未知的内存错误。经过补习后,父类转子类是可以的,但是父类实例化时候要是具体子类,说白了就是,你要先new了一个人,用“动物”引用了这个人,要用的时候你可以转回来!不然天生就是动物,强转人,就会出现未知的内存bug。
解决方法:
我在GameObject中添加了类初始化方法:
- bool initWithSpriteName(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer);
- bool initWithSpriteName(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer);
这个方法实现目地就是,我实例化这个具体对象后,可以操作父类的方法进行初始化,而不需要先new父类的对象初始化再强转子类。
- GameObject* GameObject::create(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer)
- {
- GameObject* object = new GameObject();
- if(object && object->CCSprite::initWithSpriteFrameName(pszSpriteFrameName))
- {
- object->layer = paramLayer;
- object->alive = true;
- //set the schedule update begin.
- object->scheduleUpdateWithPriority(1);
- return object;
- }
- else
- {
- CCLOG("%s","create GameObject error.");
- return NULL;
- }
- }
- bool GameObject::initWithSpriteName(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer){
- bool result = this->initWithSpriteFrameName(pszSpriteFrameName);
- if (result == false) {
- CCLOG("init with sprite name and cclayer error.");
- }
- else
- {
- this->layer = paramLayer;
- this->alive = true;
- this->scheduleUpdateWithPriority(1);
- }
- return result;
- }
- GameObject* GameObject::create(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer)
- {
- GameObject* object = new GameObject();
- if(object && object->CCSprite::initWithSpriteFrameName(pszSpriteFrameName))
- {
- object->layer = paramLayer;
- object->alive = true;
- //set the schedule update begin.
- object->scheduleUpdateWithPriority(1);
- return object;
- }
- else
- {
- CCLOG("%s","create GameObject error.");
- return NULL;
- }
- }
- bool GameObject::initWithSpriteName(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer){
- bool result = this->initWithSpriteFrameName(pszSpriteFrameName);
- if (result == false) {
- CCLOG("init with sprite name and cclayer error.");
- }
- else
- {
- this->layer = paramLayer;
- this->alive = true;
- this->scheduleUpdateWithPriority(1);
- }
- return result;
- }
如上:
- object->CCSprite::initWithSpriteFrameName(pszSpriteFrameName)
- object->CCSprite::initWithSpriteFrameName(pszSpriteFrameName)
GameObject的静态方法Create中,先new了GameObject然后调用父类(CCSprite)的初始化方法,为了其他继承GameObject的对象能同样调用GameObject的初始化,也实现了一个类似的初始化方法,其他子类也一样,这样就类似CCNode、CCSprite等初始化的流程。
- bool GameObject::initWithSpriteName(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer)
- bool GameObject::initWithSpriteName(char *pszSpriteFrameName, cocos2d::CCLayer *paramLayer)
问题2.1 关于是否要继承CCSprite:
推荐大家读下这里的讨论:http://www.cocos2d-iphone.org/forum/topic/6621
我也蛮赞成gaminghorror说的,因为继承CCSprite会造成一些初始化的问题,例如我上面的,每个初始化都要很麻烦去继承实现一遍。还有就是不能override一些spritewith方法等。方正我也不推荐,下一步我将会把GameObject独立出来,使用Component实现而非继承的时候进行优化,也算一个学习巡回渐进的过程吧。哈哈。笑自己比较蠢~
好吧,这里推荐一下可以继承CCNode,因为这样对于可视的对象,直接有add child,并且getTag等标签方法也很方便来调试和归类。
当然也有继承CCSprite的时候,例如一些特别的精灵,你要自己去控制draw,可以考虑继承实现。
- [cocos2d-x]关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- cocos2d-x 关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- cocos2d-x 关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- 关于继承问题初始化的问题
- [cocos2d-x]关于update回调,以及继承后子类调用父类的Update处理的问题
- 关于继承的讨论,以及私有属性继承的问题
- 关于继承的问题
- 关于继承的问题
- Cocos2d-x:用继承自CCSprite的子类实现点到点之间的画线
- 继承CCSprite类,初始化就报错
- 关于c++中的public继承,private继承,以及protect继承的问题
- 【Unity&继承】关于继承的一些问题
- 继承ccsprite后可能出现的问题
- Java关于继承的详细初始化顺序
- 关于继承父类的初始化方法
- cocos2d-js中关于继承的细节
- 一个关于继承的问题
- 关于继承的一个问题
- 目前以我的眼光所推荐的一些编程网站,欢迎各位留言提供
- \tutorial_code\HighGUI
- 最常被程序员们谎称读过的计算机书籍[转载]
- Cocos2d-x 利用CCSpriteBatchNode提高渲染效率
- 网络信息整合的几个关键点
- cocos2d-x 关于是否继承CCSprite,以及关于继承初始化时候的未知问题
- Asp.net(1)-入门概述
- 无向图的连通分量和生成树
- 10步让你成为更优秀的程序员[转载,中转站]
- cocos2d-x中CCCallFunc CCCallFuncN CCCallFuncND的区别和使用示例
- Cocos2d-x 2.0.4 如何制作一个基于Tile的游戏
- linux kernel data struct : 改进的冒泡排序法
- 初识压缩感知Compressive Sensing
- POJ 1798 Truck Histroy (MST)