Размер фонового изображения Sprite Kit Game

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

Я хочу создать приложение только для своего iPhone 5S. Таким образом, размер экрана составляет 1136x640. Я создал фоновое изображение 1136x640 для своего приложения. Но когда я добавляю изображение в свое приложение, его waaay к большому! IOS Simulator отображает только среднюю часть изображения.

Может кто-нибудь сказать мне, какой размер экрана я должен использовать и почему?

Спасибо большое!

Вот код, который я скопировал из учебника. Код находится в файле myScene.m в методе initWithSize

        SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
    background.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame));

    [self addChild:background];

ИЗМЕНИТЬ

Я искал в google и нашел это:

Метод viewDidLoad должен быть изменен с помощью "viewWillLayoutSubviews".

Вот этот метод:

    - (void)viewWillLayoutSubviews
    {
    [super viewWillLayoutSubviews];

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

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

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

Сначала строка scene = MySceneWithSize была следующей:

SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];

Но тогда это была только половина размера экрана iPhone 5 (568x320). Поэтому мне пришлось удвоить размер. Кто-нибудь знает, почему?

+30
19 окт. '13 в 22:15
источник поделиться
9 ответов

Короткий ответ на вашу ближайшую проблему:

background.size = self.frame.size;

Длинный ответ и обсуждение других методов...

Сцена работает в логических единицах, а не в физических пикселях (как упоминалось в других сообщениях).

1 Логическое устройство обычно составляет 1 пиксель на более старом наборе и 2 пикселя на новом наборе /iPad. Это может быть 4 пикселя через 5 лет.

Работа в логических единицах защищает вас от изменений размеров в будущем и должна помочь программисту - хотя это часто путает новичков.

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

Это лучше, чем использование SKActions (потому что пользователь может их увидеть, и любые вычисления, основанные на размерах node, нельзя полагаться до завершения действия), и это лучше, чем масштабирование, потому что масштабирование требует, чтобы вы знали исходные размеры изображения.

Вы можете сделать это через свойство размера или через действие, если вы действительно хотите сделать анимацию.

В сцене просто....

-(void)didMoveToView:(SKView *)view
{
    [super didMoveToView:view];

    SKSpriteNode* background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground"];
    background.size = self.frame.size;
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    [self addChild:background];
} 

В качестве альтернативы, если ваше изображение работает хорошо, как и при более высоких разрешениях, вы можете переименовать свое изображение на myBackground@2x.png, добавить его в свой проект, и вам, вероятно, не придется изменять размер вообще, Также необходимо уменьшить его на 50% для устройств с более низким разрешением и сохранить это как myBackground.png.

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

+29
05 окт. '14 в 9:35
источник

Я обнаружил, что если изображение не того же размера, что и node, которое вы хотите создать, размер становится немного забавным (скажем, используя изображение сетчатки на устройстве без сетчатки или неправильное именование изображений). Вы можете масштабировать изображение для заполнения, если вы создаете текстуру с изображения и устанавливаете текстуру и размер node, используя что-то вроде следующего:

SKTexture *backgroundTexture = [SKTexture textureWithImageNamed:@"MyImage.png"];
SKSpriteNode *background = [SKSpriteNode spriteNodeWithTexture:backgroundTexture size:self.view.frame.size];
background.position = (CGPoint) {CGRectGetMidX(self.view.frame), CGRectGetMidY(self.view.frame)};
[scene addChild:background];

Я не уверен на 100%, если это исправит вашу проблему или нет, но это может стоить того.

+9
30 нояб. '13 в 21:19
источник

Эта строка возвращает размер в точках, а не в пикселях. Это сделано потому, что разные устройства имеют разные разрешения, но будут иметь одинаковые размеры в точках. На устройствах без сетчатки 1 точка - 1 пиксель, а на сетчатых устройствах 1 точка - два пикселя. Вот почему вы получаете этот размер от

SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];

Вы не хотите удваивать размер сцены, так как это будет просто границами вашего экрана, невидимым.

+8
02 нояб. '13 в 19:38
источник

Вы пытались добавить "@2x" в конец имени вашего изображения?

+7
09 нояб. '13 в 5:30
источник

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

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    if (!skView.scene) {
        skView.showsFPS = YES;
        skView.showsNodeCount = YES;

        CGSize tmpSize;
        tmpSize.width = 640;
        tmpSize.height = 1136;
        // Create and configure the scene
        SKScene * scene = [CreationScene sceneWithSize:tmpSize];

        scene.scaleMode = SKSceneScaleModeAspectFill;

        // Present the scene.
        [skView presentScene:scene];
    }
}
+3
24 мар. '14 в 0:42
источник

Это сработало для меня. Это нормально делать?

//Set background image.
    SKSpriteNode *background = [SKSpriteNode spriteNodeWithImageNamed:@"myBackground.png"];
    background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));
    background.xScale = 0.5;
    background.yScale = 0.5;

    [self addChild:background];
+2
14 янв. '14 в 16:40
источник

Решение:

Поместите этот код в свой viewWillLayoutSubviews вместо этого в viewDidLoad UIViewController, который загружает спрайт.

  - (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    if (!skView.scene) {
      skView.showsFPS = YES;
      skView.showsNodeCount = YES;

      // Create and configure the scene.
      SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
      scene.scaleMode = SKSceneScaleModeAspectFill;

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

Объяснение: Это создает сцену с размером в качестве границ представления. Однако, когда вызывается viewDidLoad, это до того, как представление было добавлено в иерархию представления и, следовательно, оно еще не отреагировало на изменения макета. Таким образом, границы представления могут быть неверными, и это, вероятно, не лучшее время для запуска сцены.

Этот ответ копируется из: http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners Кредит принадлежит Рэй:).

Я использовал тот же код в своем SKScene, как вы, но без этого решения Ray, предлагаемого в UIViewController, который представляет сцену, он не будет работать.

+2
14 мар. '14 в 13:30
источник

Я использовал и спрайты для фона.

    double escalax =        self.size.width/ sprite.size.width  ;
    double escalay =        self.size.height/ sprite.size.height  ;


    SKAction *mostrar = [SKAction scaleXTo:escalax y:escalay duration:0];

Надеюсь, что это поможет!

+2
05 мая '14 в 17:48
источник

У меня такая же проблема. После нескольких дней поиска в Google и, наконец, я получил ключ от этой проблемы. Вы можете несколько раз изменить свой scene.scaleMode, пока не получите нужный вам размер. Я только что нашел это прошлой ночью, поэтому, если вы хотите узнать больше, вот ссылка

https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKScene_Ref/Reference/Reference.html#//apple_ref/doc/uid/TP40013024-CH1-DontLinkElementID_3

+1
29 авг. '14 в 2:29
источник

Посмотрите другие вопросы по меткам или Задайте вопрос