2016-05-05 4 views
0

Wenn ich versuche, einen Knoten pro n Sekunden hinzuzufügen, stürzt die Prozedur ab.cocos2dx 3.x schedule error

Wenn ich nur runBlock(0.0f) ausführen, wird die Prozedur normal ausgeführt.

Dies ist mein Code

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); 

}

ich VS2013 verwenden. Die Fehlerinformation ist

Without exception handling in 0x009D5402(in test.exe) 0xC0000005: Access violation when reading location 0xFEEF0012 

Ich habe debug. "bl-> Knoten" ist Speicher zugeordnet. Also ich denke nicht, dass es NULL Zeigerfehler ist. Ich weiß jedoch nicht, welchen Grund der Absturz verursacht hat.

Bitte helfen Sie mir, Danke!

Antwort

0

Nach ein paar Frames haben alle Ihre Blöcke Eltern und die While-Schleife wird nie beendet.

Ich verstehe nicht wirklich, was Sie hier erreichen wollen, aber ich schlage vor, zwei Arrays zu behalten, die erste in initBlocks() zu füllen, eine zufällig in runBlock() auszuwählen, zu verarbeiten und zu verschieben es zum zweiten Array.

Auf diese Weise brauchen Sie die while-Schleife nicht, die viel Zeit in Anspruch nimmt, wenn Sie einen Block, den Sie bereits verarbeitet haben, weiter auswählen.

+0

ich mehrere andere Kategorie Block erreichen möchten, die sich von der rechten Seite des Darstellungs kommen immer und immer wieder. Und ich glaube nicht, dass der Grund für das Problem ist, dass die While-Schleife niemals beendet wird. Da ich "bl = (* block_array) [0]" anstelle der while-Schleife verwende, existiert das Problem weiterhin –

+0

while (bl-> node-> getParent()); wird immer wahr sein, wenn Ihr Block bereits zur Ebene hinzugefügt wurde. Dies wird eine Endlosschleife verursachen – Striker

0

Do it diese Weise:

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

Ihr bedeutet, ich sollte block_array zu waiting_block_array klonen? Ich verstehe das waiting_block_array nicht wirklich. By the way, block_array ist ein statischer Vektor, und was ich erreichen möchte, ist mehrere verschiedene Kategorie-Block, die von der rechten Seite des Ansichtsfensters immer wieder kommen –

+0

Denken Sie an waiting_block_array als Vektor von Blöcken, die darauf warten, der Ebene hinzugefügt werden . – Striker

+0

Ich habe den Absturzgrund gefunden! Nach der Initialisierung und 5 Sekunden ist bl-> node = NULL. Ich habe meinen Code geändert, aber das Problem besteht immer noch. Sie können sehen [link] (https://stackoverflow.com/questions/37066542/what-is-the-memory-management-in-cocos2dx-3-10) –