Справка по cocos2d: CCMenuItem не выбрал "EXC_BAD_ACCESS" и CCCallFunc
У меня были проблемы с CCMenuItem и его синхронизацией с CCCallFunc.
В основном я получаю 'EXC_BAD_ACCESS'
@ эта строка класса CCMenuItem
-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{
...
[selectedItem_ unselected]; // EXC_BAD_ACCESS
[selectedItem_ activate];
...
}
Кажется, пункт меню освобождается до окончания касания. Я использую CCCallFunc для вызова метода removeThisSprite, который удаляет его из родительского
поэтому последнее действие последовательности CCMenuItem я вызываю:
[CCCallFuncO actionWithTarget:self selector:@selector(removeThisSprite:) object: _currentButton]
Метод removeThisSprite выглядит следующим образом:
CCMenuItemSprite2 *sender = nil;
sender.isEnabled = NO;
if ([_sender isKindOfClass:[CCMenuItemSprite class]]) {
sender = _sender;
[sender removeFromParentAndCleanup: YES];
}
Обычно это происходит, когда игрок "спамит" экран касаниями, но не происходит, если касания не быстрые. Что может произойти с игрой, которую я делаю. Я предполагаю, что есть какая-то проблема с синхронизацией, когда игроки слишком быстро нажимают на кнопку.
1 ответ
Вы всегда можете попробовать и отложить удаление пункта меню:
[self performSelector:@selector(removeMenuItem:) withObject:sender afterDelay:0.1f];
...
-(void) removeMenuItem:(id)sender
{
if ([sender isKindOfClass:[CCMenuItemSprite class]])
{
[sender removeFromParentAndCleanup: YES];
}
}