我在游戏中遇到精灵动画问题 .
在下面发布的当前代码中,精灵将显示在屏幕上,但不会执行步行动画;它只是步行周期中其中一个图像的静态帧 .
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 回答
重写了createPlayer()函数 . 正确的实现更简单,如下:
基本上做上面建议的帖子,摆脱ivars,使用函数ONLY用适当的图像填充数组 . 然后,在init函数中,调用createPlayer(),将其添加到前景层,然后调用walkingQueen() .
这意味着_thePlayer在createPlayer方法返回之前是nil . 因此在walkingQueen方法_thePlayer是nil并且动作不运行 .
替换这个:
同
并使用_thePlayer而不是playerNode . 你也可以跳过返回并分配它,毕竟它是一个ivar .