首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Cocos2D中,如何让动画2等待动画1完成,然后再执行Objective-C

在Cocos2D中,如何让动画2等待动画1完成,然后再执行Objective-C
EN

Stack Overflow用户
提问于 2012-06-27 07:42:56
回答 2查看 1.8K关注 0票数 0

在我的程序中,当你在iOS SIM卡上点击屏幕时,就会使用CCMoveTo发牌。动画需要.4秒才能完成。再次轻拍屏幕,下一副牌就发完了。第二个动画也需要.4秒。我所要做的就是禁止我的程序在第一个动画完成之前分发第二套牌。尝试了sleep(),显然不能达到预期的效果。我也尝试了几种不同的方式使用Cocos2d的CCDelayTime,但是没有得到想要的结果。做这件事最简单和/或最节省内存的方法是什么?

编辑:@crackity_jones -这是我的HelloWorldLayer文件和我为CCSprite创建的允许移动的类别:

HelloWorldLayer.h

代码语言:javascript
复制
#import <GameKit/GameKit.h>
#import "CCSprite+MoveActions.h"
#import "cocos2d.h"

    // globals
CCSprite *card1;
...
CCSprite *card9;

@interface HelloWorldLayer : CCLayer {
    NSMutableArray *deck;
    ...
    int touchCount;
}

...

@end

HelloWorldLayer.m

代码语言:javascript
复制
...

-(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    touchCount++;
    [self nextRound];
}

// one method to handle all rounds dealt
-(void)nextRound {
    if (touchCount == 1) {
        [self removeAllCards];
        [deck shuffle];
        [self dealFirstRound];
    } else if (touchCount == 2) {
        [self dealSecondRound];
    } else if (touchCount == 3) {
        [self dealThirdRound];
    } else if (touchCount == 4) {
        [self dealFourthRound];
    touchCount = 0;
    }
}

-(NSMutableArray *)makeDeck {
    // create mutable array of 52 card sprites
}

-(void)dealFirstRound {
    ...
    // declare, define, add card objects to layer at start-point here
    …
    // the "moveToPositionX" methods contain the animation code
    [firstCard moveToPosition1];
    [secondCard …2];
    [third...3];
    [fourth...4];
    }

// Also methods for removing all rounds of cards
…
@end

CCSprite (MoveActions)

代码语言:javascript
复制
#import "CCSprite+MoveActions.h"
#define kCardTravelTime .1

@implementation CCSprite (MoveActions)

-(void)moveToPosition1 {
    CGSize size = [[CCDirector sharedDirector] winSize];
    [self runAction:[CCMoveTo actionWithDuration:kCardTravelTime
                                        position:CGPointMake(size.width/2 - card1.contentSize.width/4, card1.contentSize.height/2 + holeCard1.contentSize.height/5)]];
    CCDelayTime *waitTime = [CCDelayTime actionWithDuration:.4];
    [self runAction:waitTime];
}

-(void)moveToPosition2 {
    CGSize size = [[CCDirector sharedDirector] winSize];
    CCDelayTime *delay = [CCDelayTime actionWithDuration:.2];
    CCMoveTo *move = [CCMoveTo actionWithDuration:kCardTravelTime
                                        position:CGPointMake(size.width/2 + card1.contentSize.width/4, card1.contentSize.height/2 + holeCard1.contentSize.height/5)];
    [self runAction:[CCSequence actions:delay, move, nil]];
}
// rest of the methods 3-9 look like the above, essentially

@end
EN

回答 2

Stack Overflow用户

发布于 2012-07-02 22:54:36

你可以试试这个!如果需要,可以使用在CCSequence操作中插入一些CCDelaytime操作。

代码语言:javascript
复制
-(void)dealFirstRound {
    id card1Move = [CCCallBlock actionWithBlock:^{
        [firstCard moveToPosition1];
    }];
    id card2Move = [CCCallBlock actionWithBlock:^{
        [secondCard moveToPosition2];
    }];
    id card3Move = [CCCallBlock actionWithBlock:^{
        [thirdCard moveToPosition3];
    }];
    id card4Move = [CCCallBlock actionWithBlock:^{
        [fourthCard moveToPosition4];
    }];
    [self runAction:[CCSequence actions:
                     card1Move,
                     card2Move,
                     card3Move,
                     card4Move,
                     nil];
}
票数 1
EN

Stack Overflow用户

发布于 2012-06-27 07:53:24

像这样做一个CCSequence

代码语言:javascript
复制
[<<CCNode>> runAction:[[CCSequence actions:[deal hand],[CCDelayTime actionWithDuration:.4],[deal 2nd hand].. ,nil]];

这将执行第一个操作,delay for .4 s,执行第二个action..and,以便on..you可以添加您想要的操作数量

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11217484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档