我和一位朋友正在用cocos2dx为Iphone开发一款游戏。这很简单,是无限地图中的标志性跑步者,带有随机障碍物。
地图以 chucks 为单位充电,所有这些都用随机结构初始化,当玩家的位置在 chck 的末尾时,添加下一个 chuck,如果玩家在 chck 的开始,则删除 chuck 通过。
在场景中,我有一个听众是这样称呼的:
//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);
}
结构 Chuck 是下一个:
class Chunck {
Node* _node;
std::vector<BlockCollisionable> _collisionables;
....
Chunck() {
_node = Node::create();
_node->retain();
}
~Chunck() {
_node->autorelease();
}
}
问题是当我添加 chuck 时,我在日志中没有问题,但它没有绘制。这些位置的屏幕是黑色的,我不明白发生了什么。
此外,当我删除最后一个 chck 失败并出现此错误时:
断言失败:引用计数应大于 0 断言 失败:(_referenceCount> 0),函数发布,文件/.../cocos2d/cocos/base/CCRef.cpp,第 98 行。
谢谢:D
你看不到Node
,因为你只创建了逻辑节点,没有什么可画的。它不是Sprite
或LayerColor
或TextField
.
接下来的事情 - 当你为 cocos 类调用::create
时,它会自动调用autorelease
并在没有人持有它并且引用计数器为零时自动删除节点。如果手动调用retain
则会将引用计数增加 1,然后应手动调用release
(而不是autorelease
)以减少它并允许删除。
当您通过addChild
将节点添加到场景/图层/节点时,它也会调用retain
,当您通过removeFromParent
将其从场景/图层/节点中删除时,它将调用release