Размер фонового изображения 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). Поэтому мне пришлось удвоить размер. Кто-нибудь знает, почему?
Ответы
Ответ 1
Короткий ответ на вашу ближайшую проблему:
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];
}
В качестве альтернативы, если ваше изображение работает хорошо, как и при более высоких разрешениях, вы можете переименовать свое изображение на [email protected], добавить его в свой проект, и вам, вероятно, не придется изменять размер вообще, Также необходимо уменьшить его на 50% для устройств с более низким разрешением и сохранить это как myBackground.png.
Я всегда устанавливаю размер импортированного изображения точно в логические единицы, которые я хочу (или процент от размеров экрана), чтобы сохранить разумность.
Ответ 2
Я обнаружил, что если изображение не того же размера, что и 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%, если это исправит вашу проблему или нет, но это может стоить того.
Ответ 3
Эта строка возвращает размер в точках, а не в пикселях. Это сделано потому, что разные устройства имеют разные разрешения, но будут иметь одинаковые размеры в точках. На устройствах без сетчатки 1 точка - 1 пиксель, а на сетчатых устройствах 1 точка - два пикселя. Вот почему вы получаете этот размер от
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
Вы не хотите удваивать размер сцены, так как это будет просто границами вашего экрана, невидимым.
Ответ 4
Вы пытались добавить "@2x" в конец имени вашего изображения?
Ответ 5
Я в основном делаю как ответы выше, но я иду вперед и устанавливаю ширину и высоту напрямую, чтобы мне не пришлось беспокоиться о том, правильно ли они установлены или нет, конечно, мне также нужно будет проверить, есть ли используя 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];
}
}
Ответ 6
Это сработало для меня. Это нормально делать?
//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];
Ответ 7
Решение:
Поместите этот код в свой 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, который представляет сцену, он не будет работать.
Ответ 8
Я использовал и спрайты для фона.
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];
Надеюсь, что это поможет!
Ответ 9
У меня такая же проблема. После нескольких дней поиска в 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