【问题标题】:Using cocos2D how do you create an animation using sprites from two sprite sheets?使用 cocos2D 如何使用来自两个精灵表的精灵创建动画?
【发布时间】:2011-08-30 14:41:49
【问题描述】:

我有一些星星闪烁的精灵,图像太大而无法放在一张精灵表上,所以我不得不将它们分布在两个精灵表上。我一直在寻找如何使用两个精灵表中的图像创建单个动画,但没有运气。

这是我尝试过的,它符合要求,但是当动画到达图像开始来自第二个精灵表的位置时崩溃。

        //=======================================================================================// 
    //Load Stars

    frameCache = [CCSpriteFrameCache sharedSpriteFrameCache];
    [frameCache addSpriteFramesWithFile:@"starsOne_01.plist"];
    [frameCache addSpriteFramesWithFile:@"starsOne_02.plist"];


    starSpriteNodeOne_01 = [CCSpriteBatchNode batchNodeWithFile:@"starsOne_01.png"];
    [self addChild:starSpriteNodeOne_01 z:-2];
    starSpriteNodeOne_02 = [CCSpriteBatchNode batchNodeWithFile:@"starsOne_02.png"];
    [self addChild:starSpriteNodeOne_02 z:-2];



     //Load frames
    starOneFrames_01 = [NSMutableArray array];
    for(int i = 1; i <= 12; ++i) {
    [starOneFrames_01 addObject:
    [[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
    [NSString stringWithFormat:@"starsOne_%d.png", i]]];
    }

    starOneAnim_01 = [CCAnimation animationWithFrames:starOneAnim_01 delay:0.5f];
    [[CCAnimationCache sharedAnimationCache] addAnimation:starOneAnim_01 name:@"starOneAnim_01"];


     //=======================================================================================//    
     //Add stars to the scene

    starsOne = [CCSprite spriteWithSpriteFrameName:@"starsOne_1.png"];
    starsOne.anchorPoint = ccp(0, 0.5);
    starsOne.position = ccp(0, size.height/2);
    [starSpriteNodeOne_01 addChild:starsOne];

   //animate
    starOneAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:starOneAnim_01 restoreOriginalFrame:YES]];
    [starsOne runAction:starOneAction];

任何想法我哪里出错了?提前致谢。

嗨@JorisMans, 我试过你的方法,它似乎一直工作到它试图将动画添加到第二个序列的地步。我试过以相反的顺序运行这些方法(所以首先是starAnimation_02),它仍然给出了相同的结果。第一种方法正常运行,然后当要调用的第二种方法运行时它崩溃。这是我的两种方法,我将 CCLOG 保存在其中一种中,以便您了解它在哪里崩溃。程序在崩溃前到达 REACHED3 CCLOG。

-(void)starAnimation_01
{

[starsOne_01 setVisible:YES];
[starsOne_02 setVisible:NO];
CCCallFunc* customCall = [CCCallFunc actionWithTarget:self selector:@selector(starAnimation_02)]; 
CCSequence* actionSeq = [CCSequence actions:[CCAnimate actionWithAnimation:starOneAnim_01 restoreOriginalFrame:NO],customCall,nil];

[starsOne_01 runAction:actionSeq];

}

-(void)starAnimation_02
{

[starsOne_02 setVisible:YES];
CCLOG(@"===================REACHED========================");
[starsOne_01 setVisible:NO];
CCLOG(@"===================REACHED2========================");
CCCallFunc* customCall2 = [CCCallFunc actionWithTarget:self selector:@selector(starAnimation_01)]; 
CCLOG(@"===================REACHED3========================");
CCSequence* actionSeq2 = [CCSequence actions:[CCAnimate actionWithAnimation:starOneAnim_02 restoreOriginalFrame:NO],customCall2,nil];
CCLOG(@"===================REACHED4========================");
[starsOne_02 runAction:actionSeq2]; 
}

【问题讨论】:

    标签: iphone cocos2d-iphone


    【解决方案1】:

    每个节点都有自己的精灵表。您不能将 spritesheet 图像从一个节点应用到另一个节点。

    一种可能的解决方案(抱歉没有给出代码,但也许你可以弄清楚):

    1. 创建 2 个 CCAnimations,每个 spritesheet 一个
    2. 将第一个星节点和第二个星节点添加为“self”的子节点
    3. 隐藏第二个星节点
    4. 将操作序列应用于 您播放的第一个星节点 你的精灵的动画 第一个 spritesheet,无需重复, 在你的动画结束时,你 做一个自定义回调
    5. 在您的自定义回调中,您隐藏 第一个星节点,取消隐藏第二个 一个
    6. 将操作序列应用于 您播放的第二个节点 你的精灵的动画 第二个精灵表,不重复, 在你的动画结束时,你 做一个自定义回调
    7. 在您的自定义回调中,您隐藏 第二个星节点,取消隐藏第一个 一个
    8. 转到第 4 步

    希望对你有所帮助。

    【讨论】:

    • 您能否举例说明如何将自定义调用“附加”回动画结尾?
    • CCCallFunc* customCall = [CCCallFunc actionWithTarget:self 选择器:@selector(myMethod)]; CCSequence* actionSeq = [CCSequence actions:[CCAnimate actionWithAnimation:currentAnimation restoreOriginalFrame:NO],customCall,nil];
    • 我一直在尝试实施您的解决方案,但遇到了问题,请参阅上面我的问题的编辑。请问您能帮忙吗?
    • 你确定starOneAnim_02 不为零吗?
    • 是的,因为如果我先运行 starAnimOne_02,它会工作,然后在尝试对 starAnimOne_01 执行相同操作时崩溃。正如我之前提到的,我可以先运行starAnimation_01,也可以先运行starAnimation_02,无论哪种方式,第一个调用的方法总是有效,而第二个方法调用崩溃。
    猜你喜欢
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多