2015-05-03 2 views
2

Я создаю игру с комплектом спрайтов и имею спрайт, перемещающийся слева направо с бесконечным действием.Бесконечное действие с SKActions Цель C

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. Я думаю, что бесконечное действие вызывает проблему, но я не знаю другого способа постоянно ее перемещать, как я хочу.

+1

Это не должно стать проблемой. Возможно, вы добавляете бесконечное действие более одного раза к змее? –

+0

Я использую его в методе обновления. есть ли способ использовать этот код без использования метода обновления? – Hunter23

+1

Действия и метод обновления не смешиваются. Вы либо делаете материал вручную в методе обновления, либо используете действия вне метода обновления, чтобы сделать это за вас. – Fogmeister

ответ

5

Ваш комментарий Я понимаю, что вы звоните

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

внутри метода обновления. Это проблема, которую вы создаете и запускаете новое действие в каждом кадре.

Переместите весь блок кода (вы указали в своем вопросе) внутри метода, который вызывается только один раз.

Пример: здесь я также переработан строительство ваших действий и изменил значение х (в действии) от 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 
+0

Привет. Я попробовал это, и он все еще не двигается. единственный способ, которым я могу заставить его двигаться, - это метод обновления. – Hunter23

+0

Проблема - это параметр x. Попробуйте заменить 3.0 на 100.0. Я не изменил его, потому что думал, что он преднамеренно низкий. –

+0

Я обновил код в своем ответе. –

0

Вместо того чтобы делать змею (независимо от змеи), называя бесконечное действие (это на самом деле «последовательность» повторяется навсегда), вы должны вызвать «последовательность» через CADisplayLink (это обновление экрана), то есть сделать управлять воспроизведением чего-либо (так игры) на частоте обновления экрана.

Смежные вопросы