0

こんにちは、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 App[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 ファイルは次のようになります。 ここに画像の説明を入力

4

1 に答える 1

0

あなたは辞書の状況で辞書を持っています。

オブジェクトはplisttheDictionaryのルートを指します。最初の問題は、2 つの異なる plist があるため、同じ辞書オブジェクトを使用して両方の plist から情報を読み取ることができないことです。初期化方法を見ないとわかりtheDictionaryませんが、両方の plist の内容をマージしない限り、2 つの plist の情報のうちの 1 つだけが含まれます。

次に、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"];
于 2013-08-24T23:19:03.997 に答える