Cocos2d 如何暂停一个动作

来源:互联网 发布:关闭135 445端口漏洞 编辑:程序博客网 时间:2024/04/29 11:08

这也是群里问的一个问题。。。。

第一反应 [node stopActionByTag: ];

后来发现 不对吖。。。。这样是 stop 而不是 暂停吖。。

然后想暂停和继续是什么东西呢? 是 pause 和 resume

然后去看ccnode的头文件,你会发现 只有 pauseAllScheduleAndActions 这个选项 可没有 by tag了。。

这不就神奇了么。。。。这么简单的问题 居然没有接口来实现它。。。。

 

那么就去看了下CCAction 的头文件

里面有:

+(id) action;

-(id) init;

-(id) copyWithZone: (NSZone*) zone;

-(BOOL) isDone;

-(void) startWithTarget:(id)target;

-(void) stop;

-(void) step: (ccTime) dt;

-(void) update: (ccTime) time;

也没有 pause。。那么 有没有可能 stop 后 在通过 update 或者 step 重新运行呢。。。

试了半天 无果

然后就又去试了一下 stop 之后的 isDone。。

结果发现返回的仍然是NO

也就是说 如果我的动作没有完全运行到底的话 他是不会认为已经结束了。。。

那么 既然 isDone 返回的是no  那么再runaction 一次 不就好了么。。。

然后就崩溃了。。throw出来的信息是 这个动作已经在这个node中运行

于是就好奇了吖。。。。然后又去看了一下头文件:

在stop 那里写着

//! called after the action has finished. It will set the 'target' to nil.

//! IMPORTANT: You should never call "[action stop]" manually. Instead, use: "[target stopAction:action];"

不去管它 语法,分析虚拟语气什么的 好无聊的。。

说的就是 这么个意思。。。不要手动用action stop 用 target stop。。。

然后就改成了target stop   再target runaction。。。问题解决了。。

测试用demo

if( (self=[super init])) {

        CCSprite* sprite = [CCSprite spriteWithFile:@"Icon.png"];

        sprite.position = ccp(100, 100);

        CCMoveBy *move = [CCMoveBy actionWithDuration:10position:ccp(300,300)];

        [sprite runAction: move];

        [self addChild:sprite];

        flag = true;        

        CCMenuItemImage* button = [CCMenuItemImageitemFromNormalImage:@"Icon.png" selectedImage:@"Icon.png"block:^(id sender) {

            if (flag

            {

                [sprite stopAction:move];

            }

            else

            {

                [sprite runAction:move];

            }

            flag = !flag;

        }];

        button.position = ccp(50, 50);

        CCMenu *menu = [CCMenu menuWithItems:button,nil];

        menu.position = CGPointZero;

        [self addChild:menu];

}

return self;