C ++& cocos2dx - 无法以编程方式添加节点

时间:2017-04-27 18:29:47

标签: c++ memory graphics cocos2d-iphone cocos2d-x

朋友和我正在用cocos2dx为Iphone开发游戏。它很简单,是一个带有随机障碍的无限地图中的典型跑步者。

地图在chuncks中充电,所有这些都是随机结构初始化的,当玩家的位置在chunck的末尾添加下一个chunck时,如果玩家在chunck的开头,则移除chunck过去了。

在场景中,我有一个通过这种方式调用的听众:

//For remove a chunck from the view
unsigned int id = this->getChunckForRemove();
this->_listener->removeChunckFromScene(id);
....
//For add a chunck to the view
TiledMap::Chunck* chunck = new TiledMap::Chunck(this.globalPosition);
this->globalPosition += SIZE_OF_CHUNCK; //Ex.: SIZE_OF_CHUNCK = 5194
this->_listener->addChunckToScene(chunck, 1);

实现是场景,下一个是:

void
Scenes::
PlayerTestScene::removeChunckFromScene(const int id)
{
    log("Remove chunck from scene :%d", id);
    this->_nodeScroll->removeChildByTag(id);
}
...
void
Scenes::
PlayerTestScene::addChunckToScene(const int id, TiledMap::Chunck* chunck)
{
    log("Add chunck to scene :%d", id);
    this->_nodeScroll->addChild(chunck->_node, 1,  id);
    this->player->setFloorCollision(chunck->_collisionables);
}

结构Chunck是下一个:

class Chunck {
  Node* _node;
  std::vector<BlockCollisionable> _collisionables;
  ....
  Chunck() {
     _node = Node::create();
     _node->retain();
  }
  ~Chunck() {
     _node->autorelease();
  }
}

问题是当我添加chunck时,我在日志中没有问题但是没有绘制。这些位置的屏幕是黑色的,我不承担它正在做什么。

此外,当我删除最后一个chunck失败时出现此错误:

  

断言失败:引用计数应大于0断言   失败:(_ referenceCount&gt; 0),函数发布,文件   /.../cocos2d/cocos/base/CCRef.cpp,第98行。

谢谢:D

1 个答案:

答案 0 :(得分:1)

您无法看到Node,因为您只创建了逻辑节点并且没有任何内容可供绘制。它不是SpriteLayerColorTextField

接下来的事情 - 当您为cocos类调用::create时,它会自动调用autorelease并在没有人持有它时自动删除节点,并且引用计数器为零。如果您手动拨打retain,则会将引用次数增加1,然后您应手动拨打release(而不是autorelease)以减少它并允许删除。

当您通过addChild将节点添加到场景/图层/节点时,它也会调用retain,当您通过removeFromParent将其从场景/图层/节点中删除时,它会立即显示致电release