调度respawn在冲突检测中返回错误

时间:2014-05-19 04:18:56

标签: c++ cocos2d-x

我正在尝试计划每2秒重新生成一个精灵,并且我还有一个方法可以验证每个帧在每2秒产生的精灵与玩家精灵之间的碰撞。但是我收到一个错误,因为在运行所有屏幕后删除了重生的精灵。如果我不删除它,则碰撞检测方法有效,否则无效。

这是我收到的错误消息:

EXD_BAD_ACCESS

这是验证碰撞的方法:

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

1 个答案:

答案 0 :(得分:1)

这里你已经安排了addMiniBarrier 2秒钟,并且每次都会调用collisionMiniBarrier。 Sprite在动作后自行删除。因此,在某段时间内不会有任何具有kMiniBarrier标记的视图。 因此,当您使用标记收集子项时,请确保它是否为NULL

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