我正在尝试计划每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) );
答案 0 :(得分:1)
这里你已经安排了addMiniBarrier 2秒钟,并且每次都会调用collisionMiniBarrier。 Sprite在动作后自行删除。因此,在某段时间内不会有任何具有kMiniBarrier标记的视图。 因此,当您使用标记收集子项时,请确保它是否为NULL
if(pMiniBarrier) { //您的碰撞检测代码。 }