2014-08-31 3 views
0

Я работаю над проектом в Objective-C/Sprite Kit и не могу заставить действия Sprite Kit работать, я пробовал все, что видел, но ничего не сработало.Sprite Kit SKActions не срабатывает

Вот код:

myscene.h

@property (strong, nonatomic) SKAction *jumpAction; 
@property (strong, nonatomic) SKAction *kneelAction; 
@property (strong, nonatomic) SKAction *runAction; 

myscene.m (INIT ж/Метод размер)

[self setupCharacter]; 
[self createDpad]; 
[self spawnStartupClouds]; 
//self.physicsWorld.gravity = CGVectorMake(0.2,-2); 
self.physicsWorld.gravity = CGVectorMake(0.2 ,-2); 
self.physicsWorld.contactDelegate = self; 

[self setupActions]; 

myscene.m (метод setupActions)

-(void) setupActions{ 
    SKTextureAtlas *jumpAtlas = [SKTextureAtlas atlasNamed:@"jump"]; 
    SKTexture *jumpTex1 = [jumpAtlas textureNamed:@"jump1.png"]; 
    SKTexture *jumpTex2 = [jumpAtlas textureNamed:@"jump2.png"]; 
    SKTexture *jumpTex3 = [jumpAtlas textureNamed:@"jump3.png"]; 

    NSArray *jumpAtlasTexture = @[jumpTex1, jumpTex2, jumpTex3]; 

    SKAction* jumpAtlasAnimation = [SKAction animateWithTextures:jumpAtlasTexture timePerFrame:0.1]; 
    SKAction* wait = [SKAction waitForDuration:0.5]; 


    jumpAction = [SKAction sequence:@[jumpAtlasAnimation, wait]]; 

    BBCharacter* leader = (BBCharacter*)[self childNodeWithName:@"character1"]; 

} 


-(void)setupCharacter{ 
    NSLog(@"Setup character"); 
    leader = [BBCharacter node]; 
    leader.position = CGPointMake(100, 230); 
    [self addChild:leader]; 

} 

Это также кажется (в setupActions) он не может «видеть» SKActionjumpAction ...

+2

Попробуйте self.jumpAction вместо jumpAction. – 0x141E

+0

Это хорошее видео, охватывающее то, что вы хотите https://www.youtube.com/watch?v=6eAwWDje7ks – DogCoffee

+0

@ michaelD33 мой ответ вам полезен или нет. –

ответ

1

При объявлении свойства в Objective-C в любом классе интерфейса, вам необходимо получить к нему доступ в реализации с использованием self.propertyName. Вы также можете получить доступ к переменной экземпляра, связанной с этим свойством, с помощью _propertyName. Таким образом, свойство jumpAction можно получить, используя либо self.jumpAction, либо просто _jumpAction.

Это потому, что свойство на самом деле не является переменной экземпляра, а является инкапсуляцией по данным класса. Пожалуйста, посмотрите на documentation для правильного объяснения.

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

@implementation MyScene //synthesize properties below this. 

@synthesize jumpAction, kneelAction, runAction; 

После этого вы можете получить доступ к свойствам напрямую, как это уже делается в вашем коде.

A предложение: Вам не нужно использовать свойства для объектов SKAction, если они не требуют доступа к другим классам.

+2

Нет необходимости синтезировать свойство, это делается автоматически. В этом случае iVar поддержки имеет имя свойства с префиксом подчеркивания, например _jumpAction. – Pierre

+0

Да, но если вы хотите использовать точное имя как свойство, вам придется явно его синтезировать. – ZeMoon

+0

Правильно, я хотел пояснить, что нет необходимости в @synhtesize. Для меня ваш ответ читается так, как вам нужно, если вы хотите напрямую обратиться к iVar, что просто неправильно. – Pierre

1

надеюсь, что это поможет вам

нормально, Увидев код, я могу понять, что у вас есть номер изображения на папку jump.atlas и Вы хотите, чтобы оживить ваш плеер к тем текстуре, когда игрок спрыгивает ,

поэтому, прежде всего добавить эту строку

[_playerNode runAction: jumpAction]; 

я не вижу эту строку в коде.

0

У вас есть все настроенные действия, теперь вам просто нужно сообщить узлу о выполнении действия с помощью метода runAction. Если вы выполняете действие, будьте наиболее конкретными, когда говорите, что не можете заставить действия работать.