无尽的动作——使用SKActions Objective C

3
我正在使用Sprite Kit构建一个游戏,其中一个精灵正在从左到右移动,具有无尽的动作。
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"];

这个方法可以实现功能,但是过了一段时间后我的游戏开始变慢。在Xcode的调试导航器中,CPU和内存使用量持续增长。我认为无限循环的操作是问题的根源,但是我不知道其他方法来实现我想要的连续移动。


1
这不应该成为问题。你是否可能将无尽的动作添加到蛇上超过一次了? - Rob Sanders
我正在update方法中使用它。有没有一种方法可以在不使用update方法的情况下使用这段代码? - Hunter23
1
动作和更新方法不要混合使用。你可以在更新方法中手动执行操作,也可以在更新方法之外使用动作来代替你执行操作。 - Fogmeister
1
使用另一种方法,例如-(void)didMoveToView:(SKView *)view来设置您的节点、动作等。 - sangony
2个回答

6

从您的评论中,我了解到您正在调用

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

在update方法内部。事实上,您每帧都创建并运行新的操作,这就是问题所在。

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

例如: 这里我还重构了您的Action构建,并将x值(在Action中)从3.0更改为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

嗨。我尝试了这个,但它仍然不动。唯一的方法似乎是在更新方法中让它移动。 - Hunter23
问题出在 x 参数上。尝试将 3.0 替换为 100.0。我没有更改它,因为我认为它是故意设置得很低。 - Luca Angeletti

0

与其让蛇(不知道是什么)调用您无休止的动作(实际上是无限重复的“序列”),您应该通过 CADisplayLink 调用“序列”(这是屏幕刷新),使其驱动任何东西(如游戏)以屏幕刷新频率进行渲染。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接