2015-05-05 2 views
0

Я новичок в разработке iOS и SpriteKit, и я хочу сделать небольшую игру с прокручивающимся фоном только в ландшафтном режиме. До сих пор я получил свой фон для прокрутки, но моя проблема заключается в том, что я не знаю, чтобы фоновое изображение правильно соответствовало виду/сцене.Адаптация фона к экрану с помощью SpriteKit

У меня есть фоновое изображение 2040x768, но я могу изменить его на любой размер; Я просто понятия не имел, какой размер подходит для того, чтобы сделать его пригодным. Он находится в Images.xcassets как 1x. Я добавил его к моему мнению следующим образом.

class GameScene: SKScene { 
    override func didMoveToView(view: SKView) { 
     let backgroundTexture = SKTexture(imageNamed: "Background") 
     let background = SKSpriteNode(texture: backgroundTexture) 
     background.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)) 
     self.addChild(background) 
    } 
} 

Результатом является то, что фоновое изображение заполняет экран, но что нижняя и верхняя часть изображения обрезана - или, вернее, «снаружи» экрана. Фоновое изображение имеет траву внизу, но это не видно. В поле scaleMode установлена ​​AspectFill. Если я установил его на AspectFit, будет видна полная высота изображения, но тогда ширина сцены уменьшится (в случае, если я использую неправильную терминологию здесь, черное пространство отображается как слева, так и справа от фона образ).

Кроме того, в моем коде я добавил 1px высокий прямоугольник без какого-либо спрайта, чтобы быть землей. Я добавил объект с физикой, который должен упасть на землю. Проблема в том, что прямоугольник земли добавляется «ниже» экрана. Объект прекращается, когда он попадает на землю; это просто не видно. Я тестировал это с помощью нескольких падающих предметов, и они складываются друг на друга, и после добавления пары они становятся видимыми, что означает, что земля действительно там; это просто не на экране. Таким образом, земля находится внизу фонового изображения, которое находится вне экрана. Я думал, что эта информация может помочь объяснить ситуацию. Вот как я добавляю наземный узел.

var ground = SKNode() 
ground.position = CGPointMake(0, 0) 
ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1)) 
ground.physicsBody!.dynamic = false 
self.addChild(ground) 

Как сделать полное фоновое изображение видимым и адаптировать его к размеру экрана устройства? Я попытался добавить background.size = self.frame.size, что делает все меньше, но результат по существу тот же. Должен ли я делать несколько копий фона разных размеров? Если да, то какие размеры и как выбрать, какой из них отображается? Я бы предпочел динамическое решение, но я просто хочу, чтобы это работало.

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

Там могут быть ресурсы, объясняющие это, но я действительно искал дни и не нашел решения. Предоставьте как можно больше информации и подробностей. Заранее большое спасибо!

ответ

0

Это просто, укажите размер вашего узла в вашей сцене.

background.size = CGSizeMake(self.frame.size.width, self.frame.size.height) 

Вы можете изменить свой размер узла в CGSizeMake.

ground = CGSizeMake(self.frame.size.width, self.frame.size.height/10) 

EDIT:

Установить фон узел, чтобы быть в середине

background.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2) 
+0

Разве это не первый такой же, как 'background.size = self.frame.size' как в вопросе? Позиция моего фона уже должна быть в центре с кодом в вопросе. В любом случае, я пробовал ваши варианты, и, к сожалению, результат такой же. – Andy0708

+0

Вам нужно изменить это: ** если пусть сцена = GameScene.unarchiveFromFile ("GameScene") как? GameScene {** Чтобы что-то вроде этого В Objective-C это выглядит следующим образом: (я не знаю, сейчас в скор) ** MainMenuScene * сцена = [MainMenuScene sceneWithSize: skView.bounds.size]; ** – Darvydas

+0

Большое вам спасибо, это сработало! Я сделал это в Swift: 'scene.size = skView.bounds.size' после создания экземпляра сцены. – Andy0708

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