Анимация спрайта в cocos2d, box2d и Xcode - PullRequest
1 голос
/ 22 июня 2011

Пожалуйста, мне нужна помощь, чтобы этот код работал.Я собираюсь сделать анимацию со спрайтом, который я добавил с помощью cocos2d и box2d в xcode.Но по некоторым странным причинам я не могу заставить спрайт повторно оживлять.

Этот код успешно создается, но анимируется только один раз.Может кто-нибудь помочь и сказать мне, что я не делаю правильно?

Файл реализации выглядит следующим образом: #import "Mosquito.h" #import "Box2DHelpers.h"

@implementation Mosquito

@synthesize flyingAnim;

 - (void) dealloc{
 [flyingAnim release];

[super dealloc];
}




 -(void)initAnimations {

     flyingAnim = [self loadPlistForAnimationWithName:@"flyingAnim"
  andClassName:NSStringFromClass([self class])];
 [[CCAnimationCache sharedAnimationCache] addAnimation:flyingAnim
          name:@"flyingAnim"];

          }

    -(void)changeState:(CharacterStates)newState {
    [self stopAllActions];
    id action = nil;
    //  id flyingAction = nil;
    //CGPoint newPosition;
    [self setCharacterState:newState];
  switch (newState) {

            case kStateIdle:
                [self setDisplayFrame:
                 [[CCSpriteFrameCache sharedSpriteFrameCache]
                  spriteFrameByName:@"Mosquito_anim_1.png"]];
                break;
    case kStateFlying:

        action = [CCAnimate actionWithAnimation:flyingAnim
                           restoreOriginalFrame:NO];
        break;

    case kStateTakingDamage:
        action = [CCBlink actionWithDuration:1.0 blinks:3.0];
        break;

    default:
            //CCLOG(@"Unhandled state %d in Mosquito", newState);
        break;
  }
   if (action != nil) {
    [self runAction:action];
  }
    }




- (id)initWithWorld:(b2World *)theWorld atLocation:(CGPoint)location {
if ((self = [super init])) {
    world = theWorld;
    [self setDisplayFrame:[[CCSpriteFrameCache
                            sharedSpriteFrameCache]
    spriteFrameByName:@"Mosquito_anim_1.png"]];
    gameObjectType = kMosquitoType;
    characterHealth = 100.0f;
    [self createBodyAtLocation:location];
    [self initAnimations];
}
return self;
}


- (void) updateStateWithDeltaTime:(ccTime)deltaTime
         andListOfGameObjects:(CCArray *)listOfGameObjects {
    //CGPoint oldPosition = self.position;



if ((characterState == kStateDestroyed) &&
    ([self numberOfRunningActions] > 0)) {
    return;
}
if (characterState != kStateFlying &&
    [self numberOfRunningActions] == 0) {
    [self changeState:kStateFlying];
}


  }
   @end

Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Это может помочь вам. Один из самых простых способов анимации спрайтов.

https://sites.google.com/site/rajanallathambi1/cocos2d-tutorials/sprite-animation-without-plist-file

0 голосов
/ 22 июня 2011
id repeatAnimation = [CCRepeatForever actionWithAction:action];

Чтобы повторяться вечно, вам нужно сделать это, в противном случае вам нужно просто сделать:

[self runAction:action];

еще раз.

Кроме того, вы можете решить не переназначать действие на CCBlink, выполнить другое действие и вызвать

[self stopAllActions];
id blinkAction = [CCBlink actionWithDuration:1.0 blinks:3.0];
[self runAction:blinkAction];
...