0

編集4:CCSpriteFrameCache spriteFrameByNameメソッドにブレークポイントを追加しましたが、次のステップをステップオーバーできません(どういうわけか、spriteFramesがCCSpriteFrameCacheから削除されることは明らかです):

踏み越えられないステップ

編集3:質問を閉じるために投票する前に、Cocos2d 2.0と添付のファイルおよびplistファイルを使用して、以下のコード(EDIT2)を実際に試してください。

編集2:問題を試すことができるように、まったく新しいGameSceneテストクラスを作成しました。アニメーションが繰り返されるとすぐにクラッシュします。結果としてタイトルも更新します。

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

@interface GameScene2 : CCScene {

}
@end

//  GameScene2.m
//
#import "GameScene2.h"

@implementation GameScene2
-(id)init {
    self = [super init];
    if (self != nil) {
        [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"artfile.plist"];
        CCSpriteBatchNode* batchNode = [CCSpriteBatchNode batchNodeWithFile:@"artfile.png"];
        [self addChild:batchNode];

        CCSprite * test = [CCSprite spriteWithSpriteFrameName:@"frame0.png"];
        test.anchorPoint = CGPointMake(0.5f, 0.5f);
        test.position = CGPointMake(160.0f, 160.0f);
        [batchNode addChild:test z:1];


        NSMutableArray* frames = [[NSMutableArray alloc]initWithCapacity:2];
        CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:@"frame0.png"];
        [frames addObject:frame];
        CCSpriteFrame* frame2  = [[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:@"frame1.png"];
        [frames addObject:frame2];

        CCAnimation* anim = [CCAnimation animationWithSpriteFrames:frames delay:0.3f];
        [[CCAnimationCache sharedAnimationCache] addAnimation:anim name:@"test"];
        CCAnimate * animate = [CCAnimate actionWithAnimation:anim];
        CCRepeatForever * repeat = [CCRepeatForever actionWithAction:animate];
        //CCSequence * seq = [CCSequence actions:anim, nil];

        [test runAction:repeat];
    }
    return self;
}
@end

artfile.pngは次のようになります。 artfile.png

そして、plistファイルは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>frames</key>
    <dict>

        <key>frame0.png</key>
        <dict>
            <key>aliases</key>
            <array>

            </array>
            <key>spriteColorRect</key>
            <string>{{3, 40}, {76, 28}}</string>
            <key>spriteOffset</key>
            <string>{0, 0}</string>
            <key>spriteSize</key>
            <string>{150, 94}</string>
            <key>spriteSourceSize</key>
            <string>{150, 94}</string>
            <key>spriteTrimmed</key>
            <false/>
            <key>textureRect</key>
            <string>{{0, 96}, {150, 94}}</string>
            <key>textureRotated</key>
            <false/>
        </dict>

        <key>frame1.png</key>
        <dict>
            <key>aliases</key>
            <array>

            </array>
            <key>spriteColorRect</key>
            <string>{{10, 33}, {98, 32}}</string>
            <key>spriteOffset</key>
            <string>{0, 0}</string>
            <key>spriteSize</key>
            <string>{150, 94}</string>
            <key>spriteSourceSize</key>
            <string>{150, 94}</string>
            <key>spriteTrimmed</key>
            <false/>
            <key>textureRect</key>
            <string>{{0, 192}, {150, 94}}</string>
            <key>textureRotated</key>
            <false/>
        </dict>

        <key>frame2.png</key>
        <dict>
            <key>aliases</key>
            <array>

            </array>
            <key>spriteColorRect</key>
            <string>{{4, 17}, {146, 48}}</string>
            <key>spriteOffset</key>
            <string>{0, 0}</string>
            <key>spriteSize</key>
            <string>{150, 94}</string>
            <key>spriteSourceSize</key>
            <string>{150, 94}</string>
            <key>spriteTrimmed</key>
            <false/>
            <key>textureRect</key>
            <string>{{0, 0}, {150, 94}}</string>
            <key>textureRotated</key>
            <false/>
        </dict>

    </dict>
    <key>metadata</key>
    <dict>
        <key>version</key>
        <string>1.5.2</string>
        <key>format</key>
        <integer>3</integer>
        <key>size</key>
        <string>{1024, 1024}</string>
        <key>name</key>
        <string>artfile</string>
        <key>premultipliedAlpha</key>
        <false/>
        <key>target</key>
        <dict>
            <key>name</key>
            <string>default</string>
            <key>textureFileName</key>
            <string>artfile_default</string>
            <key>textureFileExtension</key>
            <string>.png</string>
            <key>coordinatesFileName</key>
            <string>artfile_default</string>
            <key>coordinatesFileExtension</key>
            <string>.plist</string>
            <key>premultipliedAlpha</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

編集の終わり2:

元の質問:

私は得る:

-[CCSprite setTexture:]、/ Users /.../ libs / cocos2d / CCSprite.m:934でのアサーションの失敗

それなしでは以前は機能していたので、それは明らかにbatchNodeと関係があります...

アニメーションのスプライトフレームは同じスプライトシートにある必要があることを私は知っています、そしてそれはそうです。バッチノードの使用と関係があるに違いないので、これをどのように解決するのかわかりません。

//
//  Navigator.h
@interface Navigator : CCLayer {

}
//Batch Nodes
@property(readwrite, nonatomic) CCSpriteBatchNode* batchNode;


//  Navigator.m
@implementation Navigator
@synthesize batchNode;

+(id) scene {
    CCScene *scene = [CCScene node];
    Navigator *layer = [Navigator node];//??
    [scene addChild:layer];
    return scene;
}

-(void) loadStuff{
    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"art1-hd.plist"];
    batchNode = [CCSpriteBatchNode batchNodeWithFile:@"art1-hd.png"];
    [self addChild:batchNode];

    CCSprite * test = [CCSprite spriteWithSpriteFrameName:@"emptyCircle0.png"];
    test.anchorPoint = CGPointMake(0.5f, 0.5f);
    test.position = CGPointMake(160.0f, 160.0f);
    [batchNode addChild:test z:1];


    NSMutableArray* frames = [[NSMutableArray alloc]initWithCapacity:2];
    CCSpriteFrame* frame = [[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:@"emptyCircle0.png"];
    [frames addObject:frame];
    CCSpriteFrame* frame2  = [[CCSpriteFrameCache sharedSpriteFrameCache]spriteFrameByName:@"emptyCircle1.png"];
    [frames addObject:frame2];

    CCAnimation* anim = [CCAnimation animationWithSpriteFrames:frames delay:0.3f];
    //[[CCAnimationCache sharedAnimationCache] addAnimation:anim name:@"test"];
    CCAnimate * animate = [CCAnimate actionWithAnimation:anim];
    CCRepeatForever * repeat = [CCRepeatForever actionWithAction:animate];
    //CCSequence * seq = [CCSequence actions:anim, nil];

    [test runAction:repeat];
}


-(id)init
{
    CCLOG(@"Navigator init");
    if((self=[super init])){
        CCLOG(@"%@: %@", NSStringFromSelector(_cmd), self);
        [self loadStuff];
        }
    return self;
}

編集:CCSpritesetTextureのソースコードを確認しました。これが表示されます。ただし、コンソールログには、問題のログメッセージが表示されず、NSAssertのみが示されます。ブレークポイントを追加すると、最初のNSAssertが失敗するように見えますが、アプリがすぐにこの画像に移動するため、100%確信が持てません。

画像

-(void) setTexture:(CCTexture2D*)texture
{
    // If batchnode, then texture id should be the same
    NSAssert( !batchNode_ || texture.name == batchNode_.texture.name , @"CCSprite: Batched sprites should use the same texture as the batchnode");  

    // accept texture==nil as argument
    NSAssert( !texture || [texture isKindOfClass:[CCTexture2D class]], @"setTexture expects a CCTexture2D. Invalid argument");

    if( ! batchNode_ && texture_ != texture ) {
        [texture_ release];
        texture_ = [texture retain];

        [self updateBlendFunc];
    }
}
4

2 に答える 2

0

リソースに-hdサフィックスが付いた.plistファイルと.pngファイルが1つだけありますか?すべてのフレーム名がplistに含まれていることを確認しますか?リソースをプロジェクトに正しく追加したことを確認しますか?

また、通常、次のようにアニメーションにフレームを追加できます。

         animFrames = [[NSMutableArray alloc] init];
         for(int i =1; i<7; i++){

              [animFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName: [NSString stringWithFormat:@"anim-00%d.tif", i]]];
        }
         CCAnimation *animAnimation = [CCAnimation animationWithSpriteFrames:animFrames delay:0.04f];
于 2013-01-15T05:55:01.983 に答える
0

これが発生した理由を見つけました...前のシーンから[selfstartGame]メソッドを呼び出してから、テクスチャキャッシュからスプライトを削除するコードも呼び出してcleanupメソッドを呼び出していました。

私がこれについてきちんと考えていなかったことを私は愚かでした。オブジェクトナビゲータシーンが作成され、テクスチャがロードされますが、その間(アニメーションが実際に開始される前)、前のシーンクリーンアップ呼び出しが [CCSpriteFrameCachepurgeSharedSpriteFrameCache]を実行します。電話。

愚かな私!

-(void) startGame
{
    [[CCDirector sharedDirector] replaceScene:[CCTransitionFade transitionWithDuration:1.0 scene:[Navigator scene] withColor:ccc3(255, 255, 255)]];
}

-(void) cleanup
{
//    [[CCSpriteFrameCache sharedSpriteFrameCache] removeSpriteFrames];
    [super cleanup];


    [CCTextureCache purgeSharedTextureCache];
    [CCSpriteFrameCache purgeSharedSpriteFrameCache];
    [CCAnimationCache purgeSharedAnimationCache];

    //Remove music
}
于 2013-01-16T09:47:29.100 に答える