使用 SKActions 进行无尽的动作 Objective C

Endless Action with SKActions Objective C

我正在使用 sprite 工具包构建一个游戏,并且有一个 sprite 从左向右移动,动作无穷无尽。

SKAction *moveRight = [SKAction moveByX:3.0 y:0 duration:3.5];
SKAction *moveLeft = [SKAction moveByX:-3.0 y:0 duration:3.5];
SKAction *reversedMoveRight = [moveRight reversedAction];
SKAction *reversedMoveLeft = [moveLeft reversedAction];

SKAction *completion = [SKAction runBlock:^{

    SKAction *sequence = [SKAction sequence:@[moveRight, moveLeft, reversedMoveRight,reversedMoveLeft]];
    SKAction *endlessAction = [SKAction repeatActionForever:sequence];
    [snake runAction:endlessAction];
}];

[snake runAction:completion withKey:@"KeySnake"];

这可行,但在短时间后我的游戏速度变慢了。 CPU 和内存使用在 Xcode 的调试导航器中继续增长。我认为无休止的动作是导致问题的原因,但我不知道有什么其他方法可以像我想的那样不断移动它。

而不是让蛇(不管是什么蛇)调用你的无休止的动作(实际上 'sequence' 永远重复),你应该通过 CADisplayLink 调用 'sequence'(这是屏幕刷新),即以屏幕刷新频率驱动任何内容(例如游戏)的渲染。

根据你的评论我知道你是来电

[snake runAction:completion withKey:@"KeySnake"];

在更新方法中。这就是问题所在,事实上您正在创建 运行 每帧一个新动作。

将整个代码块(您在问题中展示的)移动到只调用一次的方法中。

Example: here I also refactored the construction of your action and changed the x value (in the action) from 3.0 to 100.0

#import "GameScene.h"

@implementation GameScene
{
    SKSpriteNode * _snake;
}

- (void)didMoveToView:(SKView *)view {
    [self addSnake];
    [self startSnakeMoving];
}

- (void)addSnake{
    _snake = [SKSpriteNode spriteNodeWithImageNamed:@"Snake"];
    _snake.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:_snake];
}

- (void)startSnakeMoving {
    SKAction * moveRight = [SKAction moveByX:100.0 y:0 duration:3.5];
    SKAction * sequence = [SKAction sequence:@[moveRight, moveRight.reversedAction, moveRight.reversedAction, moveRight]];
    SKAction * endlessAction = [SKAction repeatActionForever:sequence];
    [_snake runAction:endlessAction withKey:@"KeySnake"];
}
@end