2012-03-02 8 views
1

タッチが行われたときにアニメーションを実行し、その後に元のフレームにアニメーションを復元したいと思います。クリックが行われたときのみアニメーションを実行する(cocos2d iPhone)

.plistからクリックするとこのアニメーションを実行します。

私は、あなたがクリックを行うときだけアニメーションを実行しなければならず、アプリの起動時ではありませんでした。私のアニメーションは25フレームあります。これで私を助けてください

// HelloWorldLayer.h 

    #import "cocos2d.h" 

    // HelloWorldLayer 
    @interface HelloWorldLayer : CCLayer 
    { 
    CCSprite *_bear; 
    CCAction *_walkAction; 
    CCAction *_moveAction; 
    BOOL _moving; 

    } 

    +(CCScene *) scene; 

    @property (nonatomic, retain) CCSprite *bear; 
    @property (nonatomic, retain) CCAction *walkAction; 
    @property (nonatomic, retain) CCAction *moveAction; 

    @end 

    /////////////////////////////////////////////////////// 
    /////////////////////////////////////////////////////// 
    /////////////////////////////////////////////////////// 

    // HelloWorldLayer.m 

    #import "HelloWorldLayer.h" 

    // HelloWorldLayer implementation 
    @implementation HelloWorldLayer 

    @synthesize bear = _bear; 
    @synthesize moveAction = _moveAction; 
    @synthesize walkAction = _walkAction; 

    +(CCScene *) scene 
    { 
    // 'scene' is an autorelease object. 
    CCScene *scene = [CCScene node]; 

    // 'layer' is an autorelease object. 
    HelloWorldLayer *layer = [HelloWorldLayer node]; 

    // add layer as a child to scene 
    [scene addChild: layer]; 

    // return the scene 
    return scene; 
    } 

    // on "init" you need to initialize your instance 
    -(id) init 
    { 
    // always call "super" init 
    // Apple recommends to re-assign "self" with the "super" return value 
    if((self=[super init])) { 

    [[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"llamanim24fps.plist"]; 

    // Create a sprite sheet with the Happy Bear images 
    CCSpriteBatchNode *spriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"llamanim24fps.png"]; 
    [self addChild:spriteSheet]; 

    // Load up the frames of our animation 
    NSMutableArray *walkAnimFrames = [NSMutableArray array]; 
    for(int i = 1; i < 27; i++) { 
    [walkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"llamasinfondo00%02d.png", i]]]; 
    } 
    CCAnimation *walkAnim = [CCAnimation animationWithFrames:walkAnimFrames delay:0.2f]; 

    // Create a sprite for our bear 
    //CGSize winSize = [CCDirector sharedDirector].winSize; 
    self.bear = [CCSprite spriteWithSpriteFrameName:@"llamasinfondo0000.png"]; 
    _bear.position =ccp(391, 300); 
    self.walkAction = [CCRepeatForever actionWithAction: 
    [CCAnimate actionWithAnimation:walkAnim restoreOriginalFrame:NO]]; 
    //[_bear runAction:_walkAction]; 
    [spriteSheet addChild:_bear]; 

    self.isTouchEnabled = YES; 

    } 
    return self; 
    } 

    -(void) registerWithTouchDispatcher 
    { 
    [[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; 
    } 

    -(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event { 
    return YES; 
    } 

    -(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 
    CGPoint touchLocation = [touch locationInView: [touch view]]; 
    touchLocation = [[CCDirector sharedDirector] convertToGL: touchLocation]; 
    touchLocation = [self convertToNodeSpace:touchLocation]; 

    [_bear stopAction:_moveAction]; 

    if (!_moving) { 
    [_bear runAction:_walkAction]; 
    } 
    // [_bear runAction:_walkAction]; 
    self.moveAction = [CCSequence actions: 

    [CCCallFunc actionWithTarget:self selector:@selector(bearMoveEnded)], 
    nil]; 

    _moving = TRUE; 

    } 

    -(void)bearMoveEnded { 
    [_bear stopAction:_walkAction]; 
    _moving = FALSE; 
    } 
    // on "dealloc" you need to release all your retained objects 
    - (void) dealloc 
    { 
    // don't forget to call "super dealloc" 
    [super dealloc]; 
    } 
    @end 

    ////////////////////////// 

しかし、私は、画面をタッチするとアニメーションが永遠のために実行されます。..

これは私のコードです!

+0

をだから、あなたはあなたがスプライトをタッチすると、アニメーションを起動し、もう一度タッチすると、それをアニメーションを停止したいと思います? – Mazyod

答えて

0
[_bear stopAction:_moveAction]; 
[_bear stopAction:_walkAction]; 

if (_moving == TRUE) { 
[_bear runAction:_walkAction]; 
} 

私は他の方法をした

0

にこれを試してみてください。

  1. あなたはupdateメソッドを持っている場合、それが動いている場合determinするためのフラグを作成init
  2. であなたのアクションを実行します - trueの場合、アクションを再開します。 else pause

    if(player.isMarching){ [player resumeSchedulerAndActions]; } else { [player pauseSchedulerAndActions]; }

それは私のために働いています:)

関連する問題