gpt4 book ai didi

iphone - Cocos2D removeChildByTag 崩溃?

转载 作者:行者123 更新时间:2023-12-03 21:08:08 32 4
gpt4 key购买 nike

问题总结:启动应用程序并按“新游戏”后,我使用 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];
}
}

基本上,当您点击 GamePiece 时,我添加其他GamePiece标签 = 18 的对象。然后我使用此标签删除"new"GamePiece对象,并添加其他对象..

我的问题?

录制 GamePiece 后,"new"游戏片段正常出现,但在我点击多次后它崩溃了!我的意思是,我点击 GamePiece ,新的游戏片段出现。然后,如果我点击另一个GamePiece ,我 Handlebars 放在心上等待崩溃。有时它会崩溃,有时则不会...第三次,第四次,第五次......等等。在崩溃之前我取得了 10 次点击的高分: P……太随意了……

我的理论:

参见评论行//<------THISCCLOG每次我点击屏幕时都会被调用任意次数,直到找到 GamePiece满足 if 语句,这很正常,因为我有很多 GamePiece同时加载的对象..

当它崩溃时(没有任何堆栈跟踪或消息),这个 CCLOG被调用了几次,但从未在 if 语句中出现!我认为这是因为它试图向 GamePiece 发送触摸消息。已被 removeChildWithTag: 删除..但我已经打电话[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];在dealloc中,这就引出了一个非常重要的事实:

如果我在录制 GamePiece 后等待几秒钟在我点击另一个之前,我不崩溃的机会更高!!

感觉就像我给它时间来调用 dealloc,并删除触摸委托(delegate)...

编辑:我想到添加一个 CCLOG在 dealloc 中,它从未被调用过......结束编辑

并且不确定这是否很明显,但如果我不删除新添加的 GamePieces,游戏永远不会崩溃......但我需要删除它们:P

请帮忙,我已经解决这个问题好几天了>。

最佳答案

这个!!:

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:-1 swallowsTouches:YES]; //Important...

这是有史以来最大的错误!!

这段简洁的代码:

[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];

实际上保留了委托(delegate)...并且我从未达到 dealloc,也从未从触摸调度程序中删除Delegate并导致灾难...

<小时/>

编辑:

好吧,有人想知道我最终在哪里删除了委托(delegate)!我很惊讶我没有提到这一点!

- (void)onExit {
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
// Never forget this!!
[super onExit];
}

关于iphone - Cocos2D removeChildByTag 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5120624/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com