Хобрук: Ваш путь к мастерству в программировании

Простая настройка сцены Sprite Kit происходит неправильно

Я пытаюсь настроить простую установку Sprite Kit. Все, что я делаю, это воссоздаю шаблон xCode по умолчанию «Игра Sprite Kit» из «Пустого приложения».

Постоянно происходит сбой в строке skView.showsFPS = YES;. Что я не могу объяснить. Не могли бы вы? Спасибо!

Некоторый код:

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (NSDictionary *)launchOptions
{
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  MenuController *menuController = [[MenuController alloc] init];
  self.window.rootViewController = menuController;
  [self.window makeKeyAndVisible];
  return YES;
}

MenuController.m

- (void)viewDidLoad
{
  [super viewDidLoad];

  SKView *skView = (SKView *)self.view;
  skView.showsFPS = YES;
  skView.showsNodeCount = YES;

  MultiplayerView *gameView = [MultiplayerView sceneWithSize:skView.bounds.size];
  gameView.scaleMode = SKSceneScaleModeAspectFill;

  [skView presentScene:gameView];
}

Когда я запускаю это, возникает следующая ошибка:

2013-11-10 13:08:01.605 ByS[9419:70b] -[UIView setShowsFPS:]: unrecognized selector sent to instance 0x10c00bc60
2013-11-10 13:08:01.608 ByS[9419:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIView setShowsFPS:]: unrecognized selector sent to instance 0x10c00bc60'

Ответы:


1

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

10.11.2013
  • Хороший намек на то, что это так, содержится в ошибке: в ней указан класс UIView, а не SKView. Кроме того, ошибка связана с тем, что селектор setShowFPS: не распознается (который реализован SKView, но не его родительским классом UIView). 10.11.2013
  • Спасибо, но здесь не используются раскадровки. Так что нет построителя интерфейса. В любом случае, чтобы сделать это в коде? Думал, что это строка SKView *skView = (SKView *)self.view;.. 11.11.2013
  • Воссоздал «MenuController» с помощью xib и изменил представление на SKView. Отлично работает, спасибо! Хотя было бы неплохо избежать xib .. 11.11.2013
  • Если вы делаете это с помощью кода, попробуйте создать SKView и назначить его свойству view контроллера представления в методе init контроллера представления. 12.11.2013

  • 2

    У меня была такая же проблема при запуске из одного представления или пустого приложения по сравнению с обычным шаблоном SpriteKit. Мой работал, когда я добавил некоторый код, который я нашел, чтобы перезаписать метод loadView. Попробуйте поместить его чуть выше вашего viewDidLoad в вашем контроллере представления.

    - (void)loadView {
        CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
        SKView *skView = [[SKView alloc] initWithFrame:applicationFrame];
        self.view = skView;
    }
    

    Файл .h — это обычный UIViewController. И не забудьте #import после того, как вы связали фреймворк!:

    @interface CharacterViewController : UIViewController
    

    Таким образом, полный код .m будет выглядеть примерно так:

    @implementation CharacterViewController
    
    - (void)loadView {
        CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
        SKView *skView = [[SKView alloc] initWithFrame:applicationFrame];
        self.view = skView;
    }
    
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"CharacterViewController viewDidLoad");
        // Do any additional setup after loading the view.
    
        // Configure the view.
        SKView * skView = (SKView *)self.view;
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;
    
    
        // Create and configure the scene.
        CharacterScene *character = [[CharacterScene alloc]initWithSize:CGSizeMake(skView.bounds.size.width, skView.bounds.size.height)];
    
        character.backgroundColor = [UIColor blueColor];
    
        [skView presentScene:character];
    
    }
    
    14.08.2014

    3

    Или вы можете исправить это быстро и грязно в prepareForSegue: или перед любой другой презентацией.

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
         UIViewController *destinationVC = segue.destinationViewController;
         SKView * skView = (SKView *)destinationVC.view;
    
        if (![skView isKindOfClass:[SKView class]]) {
            skView = [[SKView alloc] initWithFrame: skView.frame]; // self.view.bounds
            destinationVC.view = skView;
        }
    }
    
    17.09.2015

    4

    В MenuController.m замените свою инициализацию

    SKView *skView = (SKView *) self.view;

    с участием

    SKView *skView = [[SKView alloc initWithFrame : self.view.frame];
    
    • Вам просто нужно инициализировать объект SKView, предоставив фрейм self.view, а не назначив ссылочный объект self.view.
    21.12.2017
    Новые материалы

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

    React Hooks: основы деструктуризации массива
    Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

    Пакеты R, используемые в Tesla
    Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

    Сокращение и слияние токенов для эффективных моделей VL: обзор
    Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..