C++ 重新调度在碰撞检测中返回错误

C++ 重新调度在碰撞检测中返回错误,c++,cocos2d-x,C++,Cocos2d X,我正在尝试每2秒安排一个精灵重生,我还有一个方法可以验证每2秒生成的精灵和玩家精灵之间的每帧冲突。但是我得到了一个错误,因为在运行所有屏幕之后,被重生的精灵被移除。如果我不删除它,碰撞检测方法会工作,否则不会 这是我收到的错误消息: EXD_坏访问 这是验证碰撞的方法: void HelloWorld::collisionMiniBarrier(float dt) { CCSprite *pPlayer = (CCSprite*)getChildByTag(kPlayer);

我正在尝试每2秒安排一个精灵重生,我还有一个方法可以验证每2秒生成的精灵和玩家精灵之间的每帧冲突。但是我得到了一个错误,因为在运行所有屏幕之后,被重生的精灵被移除。如果我不删除它,碰撞检测方法会工作,否则不会

这是我收到的错误消息:

EXD_坏访问

这是验证碰撞的方法:

void HelloWorld::collisionMiniBarrier(float dt)
{

    CCSprite *pPlayer = (CCSprite*)getChildByTag(kPlayer);
    CCSprite *pMiniBarrier = (CCSprite*)getChildByTag(kMiniBarrier);
    CCRect playerRect   = CCRectMake(pPlayer->getPositionX(),pPlayer->getPositionY(),100,100);
    CCRect tankRect     = CCRectMake(pMiniBarrier->getPositionX(),pMiniBarrier->getPositionY(),100,100);

    if(playerRect.intersectsRect(tankRect))
    {
        CCLog ("Hallalua");
    }
    else
    {
        CCLog("Not Intersected");
    }

}
这就是我如何每2秒生成一个重生的精灵:

void HelloWorld::addMiniBarrier(float dt) {
    CCLog("game state %d", gameState);
    Y1 = visibleSize.height*.7;
    Y2 = visibleSize.height*.5;
    Y3 = visibleSize.height*.3;
    X1 = visibleSize.width*.25;
    float Y;


    int randPos = rand() % 3 +1;

    if (randPos == 1) {
        Y = Y1;
    } else if (randPos == 2) {
        Y = Y2;
    } else if (randPos == 3) {
        Y = Y3;
    }

    if (gameState == 1) {

        miniBarrier = Sprite::create("hero-1.png");
        miniBarrier->setPosition(Point(visibleSize.width + miniBarrier->getContentSize().width, Y));
        miniBarrier->setTag(kMiniBarrier);


        this->addChild(miniBarrier, 1, kMiniBarrier);

        float x1 = miniBarrier->getContentSize().width;



        // Create the actions

        auto actions = Sequence::create(
                    MoveTo::create(2, Point(-x1, Y)),
                    RemoveSelf::create(),
                                        NULL);
        miniBarrier->runAction(actions);


    }

}
我就是这样安排这些选择器的:

  this->schedule(schedule_selector(HelloWorld::addMiniBarrier),2 );
    this->schedule(schedule_selector(HelloWorld::collisionMiniBarrier) );

在这里,您已安排addMiniBarrier 2秒钟,而collisionMiniBarrier每次都会收到呼叫。 精灵在动作后会自动移除。因此,在一定的时间间隔内,不会有任何带有kMiniBarrier标记的视图。 所以,当您使用标记收集child时,只需确保它是否为NULL

if(pMiniBarrier) { //你的碰撞检测代码。 }