SpriteKit порождает объекты внутри рамки просмотра на устройствах - PullRequest
0 голосов
/ 02 сентября 2018

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

Проблема, с которой я сталкиваюсь, заключается в том, что координаты игрока и объектов относятся к сцене, которая по умолчанию имеет размер iPad pro 9.7. Теперь, когда я запускаю игру на iPhone 8, объекты также появляются вне поля зрения, и игрок также может немного перемещаться влево / вправо (я использую aspectFill в качестве режима масштабирования, поэтому стороны обрезаются).

Как правильно позиционировать игрока и объекты как дочерние элементы текущего вида, чтобы они правильно масштабировались и их координаты относились к нему?

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

player = Player(color: .red, size: CGSize(width: 40, height: 80))
player.position = CGPoint(x: frame.midX, y: frame.size.height/5)
player.zPosition = ZPosition.player
addChild(player)

Редактировать: чтобы уточнить, проблема в том, что midX составляет 384, но midX вида составляет 160 на iPhone8, таким образом, несоответствие координат

Вот изображение для уточнения https://imgur.com/a/0I8i5CX Предполагается, что игрок появляется только в центре, это не проблема, проблема в том, что в любой момент времени система координат касания отличается от системы игрока, что делает невозможным щелчок мышью.

Кроме того, мой центр в gamescene.sks - 0,0

.

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

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

    guard let viewWidth = view?.frame.width else {return}

    if viewWidth < frame.width { // scaled device
        leftMargin = (frame.width - viewWidth) / 2
        rightMargin = leftMargin - viewWidth
    }
0 голосов
/ 06 сентября 2018

Вам необходимо учитывать соотношение сторон при разработке в спрайтовом наборе. Если вы действительно используете «один размер», то независимо от того, на каком устройстве вы находитесь, ваш центр должен быть одинаковым. (0,0)

Из того, что вы мне говорите

проблема в том, что midX составляет 384, а midX в представлении 160 на iPhone8

- это то, что вы читаете со своего взгляда, а не со своей сцены.

Это плохо, потому что ваш обзор и ваша сцена будут двух разных размеров.

Первое, что вам нужно сделать, это определить игровую зону. Если вы хотите, чтобы ваше весло ударило по сторонам всех устройств, то вам нужно развивать соотношение сторон 18:39 (или 9:16, если вы планируете использовать безопасные зоны на iphone x)

Это означает, что на Ipads объект будет обрезан сверху экрана, потому что отсечение будет происходить в верхней части экрана, а не по бокам.

Теперь, если вы хотите, чтобы лопасти ударялись о боковые стороны экрана, а объект появлялся в верхней части экрана, вам нужно будет использовать режим .resizeScale и нормализовать все ваши юниты (обычно от 0 до 1).

Это означает, что вы в конечном итоге создадите другой игровой опыт для устройств с разными пропорциями изображения, в отличие от другого режима просмотра от простого отсечения.

0 голосов
/ 02 сентября 2018

Пожалуйста, поделитесь изображением, чтобы я мог правильно понять проблему, теперь похоже, что вы сталкиваетесь с проблемами в ограничениях, и вы хотите, чтобы ваша позиция игрока всегда была в середине каждого экрана, что довольно просто, вы должны установить значение x 0

player.position = CGPoint(x: 0, y: frame.size.height/5)
...