Когда я пытаюсь реализовать добавление одного узла за n секунд, процедура выходит из строя.cocos2dx Ошибка расписания 3.x
Если я только что запустил runBlock(0.0f)
, процедура выполняется нормально.
Это мой код
MainLayer.cpp
bool MainLayer::init(){
if (!Layer::init()){
return false;
}
block_array = new std::vector<block*>();
Size visibleSize = Director::getInstance()->getVisibleSize();
auto body = PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT, 3.0);
body->setCategoryBitmask(0x0001);
body->setCollisionBitmask(0x0001);
body->setContactTestBitmask(0x0000);
body->getShape(0)->setRestitution(0.0);
auto edgeNode = Node::create();
edgeNode->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));
edgeNode->setPhysicsBody(body);
this->addChild(edgeNode);
auto sp = Sprite::create("CloseNormal.png");
sp->setTag(PLAYER);
auto sp_body = PhysicsBody::createCircle(sp->getContentSize().width/2);
sp_body->setCategoryBitmask(0x003);
sp_body->setCollisionBitmask(0x003);
sp_body->setContactTestBitmask(0x001);
sp->setPhysicsBody(sp_body);
sp->setPosition(visibleSize/2);
this->addChild(sp);
initBlock();
/**
When run function "runBlock", process crash!!
*/
schedule(schedule_selector(MainLayer::runBlock), 5.0f, CC_REPEAT_FOREVER, 0.0f);
//runBlock(0.0f); if just run it, everything is right
return true;
}
void MainLayer::initBlock(){
block_array->push_back(new block1()); //block is other class, it has no problem
block_array->push_back(new block2());
block_array->push_back(new block3());
}
void MainLayer::runBlock(float dt){
Size size = Director::getInstance()->getVisibleSize();
int len = block_array->size();
block* bl;
do
{
int rand = floor(CCRANDOM_0_1()*len);
if (rand == len){
rand -= 1;
}
bl = (*block_array)[rand];
} while (bl->node->getParent()); //Crash in here!!!!!
bl->come(Vec2(size.width*1.5, 0));
this->addChild(bl->node);
}
Я использую VS2013. Информация об ошибке
Without exception handling in 0x009D5402(in test.exe) 0xC0000005: Access violation when reading location 0xFEEF0012
У меня есть отладка. «bl-> node» выделяется память. Поэтому я не думаю, что это ошибка NULL-указателя. Однако я не знаю, из-за чего причина аварии.
Пожалуйста, помогите мне, спасибо!
Я хочу, чтобы выполнить несколько различных блоков категории, которые приходят справа от окна просмотра снова и снова. И я не думаю, что корень проблемы - цикл while никогда не выходит. Поскольку я использую «bl = (* block_array) [0]», вместо цикла while проблема все еще существует –
, тогда как (bl-> node-> getParent()); всегда будет истинным, если ваш блок уже добавлен в слой. Это вызовет бесконечный цикл – Striker