动画无法正常工作(Cocos2d)

时间:2011-10-12 07:03:25

标签: cocos2d-iphone

我的问题是在精灵移动期间动画无法正常工作。 以下是我正在使用的代码

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event {    

    [selSprite resumeSchedulerAndActions];
    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    [self selectSpriteForTouch:touchLocation];   
    return TRUE;    
}

- (void)selectSpriteForTouch:(CGPoint)touchLocation  
{
 CCSprite * newSprite = nil;

    for (CCSprite *sprite in movableSprite) {
        if (CGRectContainsPoint(sprite.boundingBox, touchLocation)) {            
            newSprite = sprite;
            break;
        }
    }    
    if (newSprite != selSprite) {
        [selSprite stopAllActions];

        selSprite = newSprite;

        _MoveableSpritetouch = TRUE;
    }

    if(_MoveableSpritetouch==TRUE)
    {
      movement=0;
CGRect selRect=CGRectMake((SpriteX)-20.0,(SpriteY)-20.0,40.0,40.0);
        if(CGRectContainsPoint(selRect, touchLocation))
        {  
            [selSprite stopAllActions];


        }
 if((selSprite==MarshallCar)&& (!(CGRectContainsPoint(selRect, touchLocation)))) 
        {
            movement=1;
            [self reorderChild:selSprite z:5];


            NSMutableArray *MarshallCarWalkAnimFrames = [NSMutableArray array];
            for(int i = MarshallCarTouchStartFrameIndex; i <= MarshallCarTouchEndFrameIndex; ++i) {
                [MarshallCarWalkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"mcar_move_%d.png", i]]];
            }
            MarshallCarWalkAnim = [CCAnimation animationWithFrames:MarshallCarWalkAnimFrames delay:MarshallCarTouchFrameDelay];
            walkMarshallCar = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:MarshallCarWalkAnim restoreOriginalFrame:NO]];


            [selSprite runAction:walkMarshallCar];
        }
}
}

- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event {       


    if(gameState == TRUE){


        CGPoint point = [touch locationInView:[touch view]];
        point = [[CCDirector sharedDirector] convertToGL:point];
        if (moveDifference.x>0)
                    { 
                        selSprite.flipX = YES;
                    } 

                    else {
                        selSprite.flipX = NO;
                    } 
         [selSprite setPosition:point];


     }
  }

-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event
{   
    movement=0;
if(selSprite==MarshallCar)
    { 
        [selSprite setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:@"mcar_idle.png"]];

    }
[selSprite pauseSchedulerAndActions];
}

移动的动画帧不会在每次移动时播放,有时它会播放或有时不播放。当你第一次触摸并移动你的精灵时,它会正常播放,但是如果触摸另一个精灵然后再移动上一个精灵,则无法播放动画的动画。

有人知道为什么会这样吗? 请告诉我删除此错误的正确代码。 感谢!!!

2 个答案:

答案 0 :(得分:0)

我相信你的问题是if / else if结构:

if (_MoveableSpritetouch==TRUE)
{
        CGRect selRect = CGRectMake(SpriteX - 20, SpriteY - 20, 40, 40);
        if(CGRectContainsPoint(selRect, touchLocation))
        {  
            [selSprite stopAllActions];
        }
        else if(...) 
        {
            ...
            [selSprite runAction:walkMarshallCar];
        }
}

如果您没有立即看到它:如果触摸位置在selRect内部,则在所选(新)精灵上调用stopAllActions而不执行任何其他操作。仅当触摸位置不在该矩形内时,您才会运行动画操作。

我认为“矩形”检查是多余的,因为你已经在上面几行调用了stopAllActions。

请允许我对您的代码进行一些一般性评论:

方法“selectSpriteForTouch”告诉我你正在选择一个新的精灵。功能就是这样。但它没有宣传播放动画。您可能希望将其重构为单独的“playAnimationOnSelectedSprite”方法。

您多次写了20.0和40.0。这意味着您实际上将一个double(8字节浮点数据类型)传递给CGPoint,它接受浮点数(4字节浮点数)。严格地说,使用带有后缀“f”的20.0f将其表示为浮点数据类型,或者使用整数,因为您不使用浮点部分。

为什么你把(SpriteX)放在括号中我不清楚,如果你想提高可读性,你可以通过在逗号和操作数之后添加空格来实现更多。

在Objective-C中,使用YES和NO宏而不是TRUE和FALSE。

bool变量_MoveableSpritetouch似乎是多余的,除非在其他地方需要。在任何情况下,您应该将以下if(_MoveableSpritetouch == TRUE)块移动到您将_MoveableSpritetouch变量设置为TRUE的位置,因为它只是通过设置变量使您的代码更难读取,留下您所在的代码块(if(selSprite) != newSprite))只是为了跳转到另一个代码块(if(_MoveableSpritetouch == TRUE)),你已经知道你将要运行。

答案 1 :(得分:0)

if((selSprite==MarshallCar)&& (!(CGRectContainsPoint(selRect, touchLocation)))) 
        {
            movement=1;
            [self reorderChild:selSprite z:5];


            NSMutableArray *MarshallCarWalkAnimFrames = [NSMutableArray array];
            for(int i = MarshallCarTouchStartFrameIndex; i <= MarshallCarTouchEndFrameIndex; ++i) {
                [MarshallCarWalkAnimFrames addObject:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"mcar_move_%d.png", i]]];
            }
            MarshallCarWalkAnim = [CCAnimation animationWithFrames:MarshallCarWalkAnimFrames delay:MarshallCarTouchFrameDelay];
            walkMarshallCar = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:MarshallCarWalkAnim restoreOriginalFrame:NO]];


            [selSprite runAction:walkMarshallCar];
        }

我添加了[selSprite stopAllActions]; 并且它开始正常工作,因为在触摸结束方法我暂停了行动 但是没有恢复它们所以当我第二次触摸精灵时它没有播放动画,因为动作暂停了。