使用 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
我正在使用 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