【问题标题】:Cocos2d: SIGABRT error with sprite sheetsCocos2d:精灵表的 SIGABRT 错误
【发布时间】:2013-08-27 16:46:44
【问题描述】:

您好,我正在制作 cocos2d 侧滚动条。我需要为我的游戏使用精灵表,当我使用它时,它给了我一个 SIGABRT 错误我使用了一个异常断点来查看导致问题的确切代码行并得到了这一行:

NSAssert(spriteFrame!=nil, @"Invalid spriteFrame for sprite");

输出是:

2013-08-24 15:51:28.410 App[2171:a0b] 精灵表名称是 characterssheet_poses 2013-08-24 15:51:28.419 应用程序 [2171:a0b] bruisedImage = (null) 2013-08-24 15:51:28.420 App[2171:a0b] cocos2d: CCSpriteFrameCache: 未找到帧'(null)' 2013-08-24 15:51:28.420 App[2171:a0b] bruisedPose = (null) 2013-08-24 15:51:28.421 App[2171:a0b] defaultImage = (null) 2013-08-24 15:51:28.421 App[2171:a0b] cocos2d: CCSpriteFrameCache: 未找到帧'(null)' 2013-08-24 15:51:28.422 App[2171:a0b] defaultPose = (null) 2013-08-24 15:51:28.422 App[2171:a0b] *** -[CCSprite initWithSpriteFrame:] 中的断言失败,

这是导致问题的代码并显示此输出:

    NSString* spriteSheetName = [theDictionary objectForKey:@"SpriteSheet"];
    CCLOG(@"sprite sheet name is %@", spriteSheetName);
    NSString* plistName = [NSString stringWithFormat:@"%@.plist", spriteSheetName ];
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:plistName ];

    NSString* bruisedImage = [theDictionary objectForKey:@"BruisedPose"];
    CCLOG(@"bruisedImage = %@",bruisedImage);
    bruisedPose = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:bruisedImage];
    CCLOG(@"bruisedPose = %@",bruisedPose);

    NSString* defaultImage = [theDictionary objectForKey:@"BasePose"];
    CCLOG(@"defaultImage = %@",defaultImage);
    defaultPose = [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:defaultImage];
    CCLOG(@"defaultPose = %@",defaultPose);

我正在使用精灵表和 .plist 文件来制作我的游戏。精灵表的 .plist 文件如下所示:

我用于游戏数据的 .plist 文件如下所示:

【问题讨论】:

  • 转储字典的内容,以确定它是否如图像所示。阅读日志和您的代码,PlayerProperties (theDictionary) 似乎与您预期的内容不完整。
  • ps:在 Xcode 中添加一个异常断点,以便您可以查看崩溃的确切行,并检查变量。
  • 2013-08-24 22:49:57.013 Zach 的应用程序[2488:a0b] key=AnimationBaseName value=thefinalcharacter 2013-08-24 22:49:57.013 Zach 的应用程序[2488:a0b] key= PlayerLocation value={301,384} 2013-08-24 22:49:57.014 Zach's App[2488:a0b] key=IsAnimated value=1 2013-08-24 22:49:57.015 Zach's App[2488:a0b] key=Gravity value =4 2013-08-24 22:49:57.015 Zach's App[2488:a0b] key=SpriteSheet value=characterssheet_poses 2013-08-24 22:49:57.016 Zach's App[2488:a0b] key=BruisedImage value=thefinalcharacter.png 2013-08-24 22:49:57.017 Zach 的应用程序[2488:a0b] key=FramesToAnimate value=4
  • 直接添加到上面的评论,这是新的输出。我希望 BaseImage 被更改characters.png 并且我希望 BruisedImage 被更改characters2.png。无论我做什么都不会改变。附言我遍历了字典。

标签: ios cocos2d-iphone plist side-scroller


【解决方案1】:

在字典的情况下你有一本字典。

您的 theDictionary 对象指向 plist 的根。第一个问题是:由于您有 2 个不同的 plist,您不能使用相同的字典对象从两个 plist 中读取信息。没有看到你如何初始化 theDictionary 我无法判断,但除非你合并两个 plist 的内容,否则只有两个 plist 的信息之一会在其中。

接下来,如果您想获取 PlayerProperties(或帧)字典,则必须执行以下操作(假设 theDictionary 表示游戏数据字典):

NSDictionary* characters = [theDictionary objectForKey:@"Characters"];
NSDictionary* player = [characters objectForKey:@"Player"];
NSDictionary* properties = [player objectForKey:@"PlayerProperties"];
NSString* spritesheet = [properties objectForKey:@"SpriteSheet"];

或者使用 KVC 更方便一些:

NSString* spritesheet = 
    [theDictionary objectForKey:@"Characters.Player.PlayerProperties.SpriteSheet"];

【讨论】:

    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    相关资源
    最近更新 更多