2016-05-05 4 views
0

Когда я пытаюсь реализовать добавление одного узла за 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-указателя. Однако я не знаю, из-за чего причина аварии.

Пожалуйста, помогите мне, спасибо!

ответ

0

После нескольких кадров все ваши блоки будут иметь родителей, а цикл while никогда не выйдет.

Я действительно не понимаю, что именно вы пытаетесь выполнить здесь, но могу ли я предложить хранить два массива, заполняя первое в initBlocks(), произвольно выбирая один в runBlock(), обрабатывая его и перемещая это во второй массив.

Таким образом, вам не нужен цикл while, который отнимает много времени, если вы продолжаете выбирать блок, который вы уже обработали.

+0

Я хочу, чтобы выполнить несколько различных блоков категории, которые приходят справа от окна просмотра снова и снова. И я не думаю, что корень проблемы - цикл while никогда не выходит. Поскольку я использую «bl = (* block_array) [0]», вместо цикла while проблема все еще существует –

+0

, тогда как (bl-> node-> getParent()); всегда будет истинным, если ваш блок уже добавлен в слой. Это вызовет бесконечный цикл – Striker

0

ли это так:

void MainLayer::runBlock(float dt) 
{ 
    Size size = Director::getInstance()->getVisibleSize(); 

    //waiting_block_array = block_array when you initialize 

    if (waiting_block_array) 
    { 
     int rand = random (0, waiting_block_array.size() - 1); 
     addChild (waiting_block_array[rand]); 
     waiting_block_array[rand]->come(Vec2(size.width*1.5, 0)); 
     this->addChild(waiting_block_array[rand]->node); 
     waiting_block_array.erase (waiting_block_array.begin() + rand); 
    } 
+0

ваш средний я должен клонировать block_array to waiting_block_array? Я действительно не понимаю wait_block_array. Кстати, block_array - это статический вектор, и то, что я хочу выполнить, - это несколько разных блоков категорий, которые снова и снова появляются справа от видового экрана. –

+0

Думайте о wait_block_array как о векторе блоков, который ожидает добавления к слою , – Striker

+0

Я нашел причину аварии! После инициализации и 5 секунд bl-> node = NULL. Я изменил свой код, но проблема все еще существует. Вы можете увидеть [link] (https://stackoverflow.com/questions/37066542/what-is-the-memory-management-in-cocos2dx-3-10) –

Смежные вопросы