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