2016-07-19 5 views
2

То, что я пытаюсь выполнить (должно быть как минимум ..) очень просто: я хочу представить SKScene данные, которые у меня есть в UIViewController, который представляет эту сцену. Другими словами, у меня есть переменная chapter объявлена ​​следующим образом:Передача данных в SKScene от UIVIewController

#import <UIKit/UIKit.h> 
#import <SpriteKit/SpriteKit.h> 

@interface ViewController : UIViewController 

@property (nonatomic) NSInteger chapter; 

@end 

Я испытал бревнами, что переменная глава является фактически объявленной (в моем случае я просто тестирование с ним, как 4).

Вот мой ViewController.m файл и как я представляю свою сцену:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    . 
    . 
    . 
    // Configure the view. 
    SKView *skView = (SKView *)self.view; 

    if (!skView.scene) { 
     skView.showsFPS = YES; 
     skView.showsNodeCount = YES; 

     // Create and configure the scene. 
     scene = [OLevel sceneWithSize:CGSizeMake(skView.bounds.size.width, skView.bounds.size.height)]; 
     scene.scaleMode = SKSceneScaleModeResizeFill; 

     // Set the SKScene chapter # 
     scene.chapter = self.chapter;  // <<<< NOT WORKING? 
     NSLog(@"CHAP TO PASS: %u", self.chapter); 
     NSLog(@"CHAP RECEIVED: %u", scene.chapter); 

     // Present the scene. 
     [skView presentScene:scene]; 

} 

С сцены определяется следующим образом, с viewDidLoad быть один показано выше: (я его подклассы)

@interface ViewController() { 
    OLevel *scene; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    . 
    . 
    . 

Вот мой OLevel.h класс:

#import <SpriteKit/SpriteKit.h> 
#import <GameplayKit/GameplayKit.h> 

@interface OLevel : SKScene <SKPhysicsContactDelegate, GKAgentDelegate> 

@property (nonatomic) NSInteger chapter; 

@end 

И мой OLevel.m *:

- (id)initWithSize:(CGSize)size { 

    if (self = [super initWithSize:size]) { 
     NSLog(@"Creating scene"); 

     NSLog(@"CHAP: %u", self.chapter); 

     [self setUpScene];  
    } 

    return self; 
} 

Я очень смущен, почему этот подход не работает. Я установил свойство в своем ViewController в нужное значение главы. Затем я сказал своему Olevel, какое значение это значение, и установить его собственное свойство главы для такого значения, а затем правильно представить сцену. Почему я продолжаю получать 0 ??

2016-07-18 23:52:32.189 TESTAPP[2038:684620] CHAP TO PASS: 4 
2016-07-18 23:52:32.193 TESTAPP[2038:684620] CHAP RECEIVED: 0 
2016-07-18 23:52:32.195 TESTAPP[2038:684620] Creating scene 
2016-07-18 23:52:32.195 TESTAPP[2038:684620] CHAP: 0 

Я знаю, что этот вопрос был дан ответ here с тем же подходом, который я первоначально использовались, прежде чем искать ответ, но я до сих пор, чтобы заставить его работать ..

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

ответ

1

Вы должны инициализировать сцену с неправильным синтаксисом, без типа:

...  
// Create and configure the scene. 
OLevel *scene = [OLevel sceneWithSize:CGSizeMake(skView.bounds.size.width, skView.bounds.size.height)]; 
scene.scaleMode = SKSceneScaleModeResizeFill; 

// Set the SKScene chapter # 
scene.chapter = self.chapter; 
... 

Если вы хотите, вы можете также подкласс инициализации метод с главой

OLevel.h:

@interface GameScene : SKScene <SKPhysicsContactDelegate, GKAgentDelegate> 

@property (nonatomic) NSInteger chapter; 

-(id)initWithSize:(CGSize)size chapter:(NSInteger)chapter; 
+(id)sceneWithSize:(CGSize)size chapter:(NSInteger)chapter; 

@end 

OLevel.m:

#import "GameScene.h" 
@implementation GameScene 

    -(id)initWithSize:(CGSize)size chapter:(NSInteger)chapter { 

    if (self = [super initWithSize:size]) { 
     self.chapter = chapter; 
     //some custom code here 
     NSLog(@"Creating scene"); 
     NSLog(@"CHAP: %ld", (long)self.chapter); 

    } 
    return self; 
    } 

    +(id)sceneWithSize:(CGSize)size chapter:(NSInteger)chapter { 
      return ((GameScene *)[[self alloc] initWithSize:size chapter:chapter]); 
    } 

    -(void)didMoveToView:(SKView *)view { 
     ... 
    } 
} 

В этом случае вы можете создать сцену, как:

// Create and configure the scene. 
    scene = [OLevel sceneWithSize:CGSizeMake(skView.bounds.size.width, skView.bounds.size.height) chapter:self.chapter]; 
    scene.scaleMode = SKSceneScaleModeResizeFill; 
+0

Я попытался настроить его таким, чтобы инициализировать сцену как «Olevel * scene», но, похоже, ничего не изменило. То, что я закончил, это запустить отдельную функцию, которая передавала данные непосредственно классу Olevel, который работал нормально. –

+0

Olevel * scene * scene позволяет вашему свойству сцены идентифицироваться как Olevel type и модифицировать его, чтобы вы могли видеть свойство главы. Фактически, если вы зарегистрируетесь в OLevel.m, в файле didMoveToView вы можете увидеть измененное значение раздела. –

+0

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

0

Вы также можете попытаться передать ваши данные, используя NSNotificationCenter

[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(receiveTestNotification:) 
     name:@"TestNotification" 
     object:nil]; 

NSDictionary *userInfo = [NSDictionary dictionaryWithObject:myObject forKey:@"someKey"]; 
    [[NSNotificationCenter defaultCenter] postNotificationName: @"TestNotification" object:nil userInfo:userInfo]; 
+0

Это будет работать, но решение должно быть гораздо более прямо вперед, учитывая имеющиеся варианты objc предлагает. –

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