2014-04-12 96 views
0

我在我的遊戲中出現了一個精靈動畫問題。SpriteKit動畫問題

在下面發佈的當前代碼中,精靈將顯示在屏幕上,但不會執行步行動畫;它只是步行週期中圖像之一的靜態幀。

初始化函數:

-(id)initWithSize:(CGSize)size { 
    if (self = [super initWithSize: size]) { 
     self.backgroundColor = [SKColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0]; 

     // Create the game nodes 
     // Background 
     _backgroundNode = [self createBackgroundNode]; 
     [self addChild: _backgroundNode]; 

     // Foreground 
     _foregroundNode = [SKNode node]; 
     [self addChild: _foregroundNode]; 

     // Add the Player 
     _thePlayer = [self createPlayer]; 
     [_foregroundNode addChild:_thePlayer]; 
     [self walkingQueen]; 

    } 
    return self; 
} 

功能創建播放器/動畫陣列中的填充:

-(SKSpriteNode *)createPlayer 
{ 
    SKSpriteNode *playerNode = [SKSpriteNode node]; 
    //SKSpriteNode *_player = [SKSpriteNode node]; 

    NSMutableArray *walkFrames = [NSMutableArray array]; 
    SKTextureAtlas *queenAnimatedAtlas = [SKTextureAtlas atlasNamed: @"QueenSprites"]; 

    SKTexture *walk1 = [queenAnimatedAtlas textureNamed:@"queen7"]; 
    SKTexture *walk2 = [queenAnimatedAtlas textureNamed:@"queen8"]; 
    SKTexture *walk3 = [queenAnimatedAtlas textureNamed:@"queen9"]; 

    walkFrames[0] = walk1; 
    walkFrames[1] = walk2; 
    walkFrames[2] = walk3; 

    _queenWalkingFrames = walkFrames; 

    /* 
    int numImages = 9; 
    for (int i = 7; i <= numImages; i++) { 
     NSString *textureName = [NSString stringWithFormat:@"queen%d", i]; 
     SKTexture *temp = [queenAnimatedAtlas textureNamed: textureName]; 
     [walkFrames addObject: temp]; 
    } 
    */ 
    //_queenWalkingFrames = walkFrames; 

    SKTexture *temp = _queenWalkingFrames[0]; 
    SKSpriteNode *_player = [SKSpriteNode spriteNodeWithTexture:temp]; 
    _player.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
    //[self addChild:_player]; 
    //[self walkingQueen]; 

    [playerNode addChild:_player]; 
    [self walkingQueen]; 

    return playerNode; 
} 

以及啓動行走動畫功能:

-(void)walkingQueen 
{ 
    for (int i = 0; i < _queenWalkingFrames.count; i++) { 
     if (_queenWalkingFrames[i] == NULL) { 
      NSLog(@"ERROR!"); 
     } 
    } 

    [_thePlayer runAction:[SKAction repeatActionForever: 
         [SKAction animateWithTextures:_queenWalkingFrames 
             timePerFrame:0.1f 
               resize:NO 
               restore:YES]] withKey:@"walkingInPlaceQueen"]; 

    //return; 
} 

我如果我忽略圖層的概念(backgro),動畫會起作用und /前景層),並將玩家創建到init函數中(主要考慮createPlayer()中的內容並將其粘貼到initWithSize()中)。

我確實需要爲我的遊戲設置圖層,並且一切看起來都應該起作用;不知道將幾行代碼移入自己的功能塊會產生這樣的問題。 walkingQueen()函數內部的檢查沒有返回任何錯誤,所以我假設我的數組已經填充了精靈圖像。

回答

1
_thePlayer = [self createPlayer]; 

這意味着_thePlayer是零,直到createPlayer方法返回後。因此,在WalkingQueen方法_thePlayer是零,並且行動不運行。

替換此:

SKSpriteNode *playerNode = [SKSpriteNode node]; 

_thePlayer = [SKSpriteNode node]; 

,並使用_thePlayer代替playerNode。您也可以跳過返回並分配它,畢竟它是一個伊娃。

+0

我嘗試了以下操作:代碼更改了您的建議,並且還刪除了createPlayer()內對walkingQueen()的調用。相反,它是在createPlayer()之後調用的,所以_thePlayer不是零。這兩個似乎並沒有解決問題。 – user1843954

0

重寫了createPlayer()函數。正確實施更簡單,如下:

-(SKSpriteNode *)createPlayer 
{ 
    NSMutableArray *walkFrames = [NSMutableArray array]; 
    SKTextureAtlas *queenWalkingAtlas = [SKTextureAtlas atlasNamed:@"QueenSprites"]; 

    SKTexture *walk1 = [queenWalkingAtlas textureNamed:@"queen7"]; 
    SKTexture *walk2 = [queenWalkingAtlas textureNamed:@"queen8"]; 
    SKTexture *walk3 = [queenWalkingAtlas textureNamed:@"queen9"]; 

    walkFrames[0] = walk1; 
    walkFrames[1] = walk2; 
    walkFrames[2] = walk3; 

    _queenWalkingFrames = walkFrames; 

    SKTexture *temp = _queenWalkingFrames[0]; 
    _thePlayer = [SKSpriteNode spriteNodeWithTexture:temp]; 
    _thePlayer.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 

    return _thePlayer; 
} 

基本上做如上建議後,擺脫了高德的,使用該功能只能填入適當的圖像陣列。然後,在init函數中,調用createPlayer(),將其添加到前景層,然後調用walkingQueen()。