gpt4 book ai didi

iphone - Cocos2d 游戏在替换场景时崩溃(包含代码)

转载 作者:行者123 更新时间:2023-11-29 04:17:02 24 4
gpt4 key购买 nike

所以我的 Cocos2d 游戏出了问题。我最近添加了一些代码,这些代码允许我在游戏中的某些级别开始时显示对话消息。每当我重新启动将对话框 cclayer 添加到当前场景的关卡(替换场景)时,我都会通过 iPhone 模拟器收到 BAD ACCESS 错误,然后如果我在 iPhone 4S 上运行它,我就会收到错误消息。我收到一个 SIGARBT 错误,内容为

*由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“子项已添加。无法再次添加””

这是我制作的第一个 cocos2d 游戏。我对 cocos2d 进行了很多尝试,并且对 cocos2d 有一个基本的了解。我有很多其他语言的编程经验,但我大约 3 个月前才开始学习 Objective-C。

这是我的代码。

GameDialog.h

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "GameData.h"

@interface GameDialogLayer : CCLayer {
NSString *dialogText;
}

@property (nonatomic, retain) NSString *dialogText;

+(CCScene *) scene;
-(void) addDialogWithText: (NSString *)text;

@end

游戏对话框.m

#import "GameDialogLayer.h"


@implementation GameDialogLayer

@synthesize dialogText;

+(CCScene *) scene
{
CCScene *scene = [CCScene node];
GameDialogLayer *layer = [GameDialogLayer node];
[scene addChild: layer];
return scene;
}

-(id) init
{
if( (self=[super init]) ) {
// init the bg overlay
CCLayerColor *backgroundLayer = [CCLayerColor layerWithColor:ccc4(0, 0, 0, 175)];
[self addChild:backgroundLayer z:0];

// init the dialog box
CCSprite *dialogBox = [CCSprite spriteWithFile:@"dialog.png"];
dialogBox.position = ccp([[CCDirector sharedDirector] winSize].width / 2, [[CCDirector sharedDirector] winSize].height / 2);
[self addChild:dialogBox];

// init the dialog menu
CCMenuItemImage *dialogOkay = [CCMenuItemImage itemWithNormalImage:@"dialogOkayButton.png" selectedImage:@"dialogOkayButtonPressed.png" target:self selector:@selector(okayButton)];

CCMenu *dialogMenu = [CCMenu menuWithItems:dialogOkay, nil];
dialogMenu.position = ccp(dialogMenu.position.x, dialogMenu.position.y - 118);
[self addChild:dialogMenu];
}

return self;
}

-(void) okayButton
{
[GameData sharedGameData].isPaused = 0;
[[self parent] schedule:@selector(startCountdown:) interval:1];
[[self parent] removeChild:self cleanup:YES];
}

-(void) addDialogWithText: (NSString *)text
{
CCLabelTTF *dialogTextLabel = [CCLabelTTF labelWithString:text dimensions:CGSizeMake(180, 250) hAlignment:kCCTextAlignmentLeft fontName:@"MarkerFelt-Thin" fontSize:20];
dialogTextLabel.color = ccBLACK;
dialogTextLabel.position = ccp([[CCDirector sharedDirector] winSize].width / 2, [[CCDirector sharedDirector] winSize].height / 2);
[self addChild:dialogTextLabel];
}

- (void) dealloc
{
[super dealloc];
}

@end

然后该对话框将被添加到我的 levelData 类中的对话框属性中,该类为每个级别进行实例化并保存该级别的属性。

这是持有它的属性(property)

@property (nonatomic, retain) GameDialogLayer *dialog;

这是我将对话框添加到 levelData 对话框属性的方法

-(void) addDialog: (NSString *)dialogText
{
dialog = [GameDialogLayer node];
[dialog addDialogWithText:dialogText];
}

最佳答案

您以某种方式向场景添加了一个节点两次,我查看了您的代码,但无法发现它,但它们很容易找到。只需为所有 Objective C 异常添加一个断点即可。调试器将停止在导致问题的线路上。

参见 here了解如何添加断点。如果您正在使用 CocosDenhesion,您可以将“Exception: All”更改为“Exception: Objective C”以避免出现异常。

关于iphone - Cocos2d 游戏在替换场景时崩溃(包含代码),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13548712/

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