问题总结:启动应用后,按“新游戏”,我使用CCDirector
过渡到GameScene。在那里,我添加了 32 个GamePiece
对象,这些对象按如下方式处理触摸事件:
@interface GamePiece : NSObject <CCTargetedTouchDelegate>{
CCSprite* sprite;
NSInteger row;
NSInteger column;
}
//-(void)moveToRow:(NSInteger)newRow column:(NSInteger)newColumn;
-(id)initWithRow:(NSInteger)aRow column:(NSInteger)aColumn tag:(NSInteger)tag parent:(CCNode*)parent;
+(id)gamePieceWithRow:(NSInteger)aRow column:(NSInteger)aColumn tag:(NSInteger)tag parent:(CCNode*)parent;
@end
GamePiece.m:
...
- (BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [GameScene locationFromTouch:touch];
CCLOG(@"(%i, %i)", row, column); //<-----THIS!!!
//Crash never makes it here....
// Check if this touch is on the Spider's sprite.
BOOL isTouchHandled = CGRectContainsPoint([sprite boundingBox], touchLocation);
if (isTouchHandled){
id parent = sprite.parent;
[parent gamePieceSelected:self inRow:row column:column];
}
return isTouchHandled;
}
...
- (void)dealloc {
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self]; //Important...
[super dealloc];
}
@end
好的,所以在加载 32 件后,我使用以下方法加载更多件:
[parent gamePieceSelected:self inRow:row column:column];
如下:(GameScene.m)
-(void)gamePieceSelected:(GamePiece*)aGamePiece inRow:(NSInteger)row column:(NSInteger)column{
[self removeChildByTag:18 cleanup:YES];
//Array of index Path!!! row = row, section = column
NSArray* moves = [self availableMovesForRow:row column:column];
for(NSIndexPath* index in moves){ //Please forgive me for using NSIndexPath!!
[GamePiece gamePieceWithRow:[index row] column:[index section] tag:18 parent:self];
}
}
所以基本上,当你点击 a 时GamePiece
,我添加其他GamePiece
带有 tag = 18 的对象。然后我使用这个标签删除“新”GamePiece
对象,并添加其他对象..
我的问题?
敲击后GamePiece
,“新”游戏片段会适当出现,但在我多次敲击后它会崩溃!我的意思是,我点击 a GamePiece
,新的 gamePieces 出现了。然后,如果我点击另一个GamePiece
,我把手放在心上等待崩溃。有时它会崩溃,有时它不会……第三次,第四次,第五次……等等。我取得了高分在它崩溃之前点击 10 次:P ......如此随机......
我的理论:
请参阅注释行//<------THIS
,CCLOG
每次我点击屏幕时都会调用任意次数,直到找到GamePiece
满足 if 语句的,这很正常,因为我GamePiece
同时加载了许多对象..
当它崩溃时(没有任何堆栈跟踪或消息),它CCLOG
会被调用几次,并且永远不会在 if 语句中出现!我认为这是因为它试图向GamePiece
已被删除的a 发送触摸消息removeChildWithTag:
。但我已经调用[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
了 dealloc,这导致了一个非常重要的事实:
如果我在点击一个之后等待几秒钟,GamePiece
然后再点击另一个,我就有更高的机会不崩溃!!
感觉就像我在给它时间调用 dealloc,并删除触摸委托......
编辑:
我CCLOG
突然想到在 dealloc 中添加一个,但它从未被调用过......
结束编辑
并且不确定这是否明显,但如果我不删除新添加的 GamePieces,游戏永远不会崩溃......但我需要删除它们:P
请帮忙,我已经解决这个问题好几天了>。