首页 文章

SpriteKit动画问题

提问于
浏览
0

我在游戏中遇到精灵动画问题 .

在下面发布的当前代码中,精灵将显示在屏幕上,但不会执行步行动画;它只是步行周期中其中一个图像的静态帧 .

init函数:

-(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;
}

我玩了一些代码并且动画可以工作如果我忽略了图层的概念(背景/前景层)并且将玩家的创建粘贴到init函数中(基本上把什么放在createPlayer()中并将其粘贴在里面initWithSize()) .

我确实需要为我的游戏设置图层,一切看起来都应该有效;不知道将几行代码移动到自己的功能块中会产生这样的问题 . walkQueen()函数内部的检查没有返回任何错误,因此我假设我的数组已经填充了精灵图像 .

2 回答

  • 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;
    }
    

    基本上做上面建议的帖子,摆脱ivars,使用函数ONLY用适当的图像填充数组 . 然后,在init函数中,调用createPlayer(),将其添加到前景层,然后调用walkingQueen() .

  • 1
    _thePlayer = [self createPlayer];
    

    这意味着_thePlayer在createPlayer方法返回之前是nil . 因此在walkingQueen方法_thePlayer是nil并且动作不运行 .

    替换这个:

    SKSpriteNode *playerNode = [SKSpriteNode node];
    

    _thePlayer = [SKSpriteNode node];
    

    并使用_thePlayer而不是playerNode . 你也可以跳过返回并分配它,毕竟它是一个ivar .

相关问题