2016-06-18 4 views
2

У меня есть SKSpriteNode создать с генератором уровня.Как создать CGPath из SKSpriteNode в SWIFT

square1

Мне нужно создать точно такую ​​же форму, используя CGPath.

self.firstSquare = childNodeWithName("square") as! SKSpriteNode 

    var transform = CGAffineTransformMakeRotation(self.firstSquare.zRotation) 
    let rect = CGRect(origin: self.firstSquare.position, size: self.firstSquare.size) 
    let firstSquareCGPath:CGPath=CGPathCreateWithRect(rect, &transform) 
    print(self.firstSquare.position) 

=> firstSquare положение (+52,8359451293945, -52,9375076293945)

Чтобы проверить, если мой CGPath был создан, как я хочу, я создал SKShapeNode с моим CGPath:

let shape:SKShapeNode=SKShapeNode(path:path) 
shape.fillColor = self.getRandomColor() 
addChild(shape) 
print(shape.position) 

=> (52.8359451293945, -52.9375076293945)

Результат не тот, который я ожидал.

enter image description here

Так что я не знаю, если мой CGPath неправильно, или если это когда я преобразовать его в SKShapeNode, что я теряю первоначальные свойства спрайтов.

Чтобы понять, почему мне нужно сделать это, пожалуйста, прочитайте this stack

EDIT 1,2

Я добавил:

shape.position = self.firstSquare.position 

И я получил:

enter image description here

EDIT 3:

Я обновил мои объяснения выше, узловая точка моей firstSquare теперь (0,5, 0,5)

ответ

0

Я нашел решение, мне нужно использовать SKShapeNode(path:, centered:), а затем применить преобразование и установить положение.

self.firstSquare = childNodeWithName("square") as! SKSpriteNode 

let firstSquareCGPath:CGPath=CGPath(rect: CGRect(origin: self.firstSquare.position, size: self.firstSquare.size), transform: nil) 

let shape:SKShapeNode=SKShapeNode(path: firstSquareCGPath, centered: true) //important 
shape.zRotation = self.firstSquare.zRotation 
shape.position = self.firstSquare.position 
shape.fillColor = SKColor.blue() 
addChild(shape) 

Он отлично работает!

Неподвижный вопрос, поскольку я задал преобразование и позицию в последнем (из-за свойств SKShapeNode), я не знаю, установлен ли мой CGPath выше правильно (например, мой SKSpriteNode).

1

Обычно я не использую .SKS файлы, я preefer писать только код, но здесь кажется, у вас просто два квадрата, один с исходной позицией .sks, второй - второй раз без какой-либо позиции.

Если вы хотите наложить свой первый квадрат просто:

shape.position = self.firstSquare.position 

EDIT:

Я также видел ваш anchorPoint был выставиться в (0.0,0.0), но точка привязки по умолчанию является (0,5 , 0,5). Попробуйте также исправить этот параметр, чтобы он соответствовал вашим sks.

You .sks макет размер может быть не такой же, как сцена, так:

scene.size = skView.bounds.size 

Пожалуйста, обратите внимание также на этот параметр, чтобы изменить, прежде чем представить свою сцену:

scene.scaleMode = .ResizeFill 

В факт, режим шкалы влияет также на позиционирование.

Что такое scaleMode?

ШкалаMode сцены определяет, как сцена будет обновляться, чтобы заполнить представление, когда устройство iOS повернуто. Существует четыре разных значения scaleModes:

SKSceneScaleModeFill - оси x и y масштабируются или уменьшаются, так что сцена заполняет вид. Содержание сцены не будет поддерживать текущее соотношение сторон. Это значение по умолчанию, если вы не указали scaleMode для своей сцены.

SKSceneScaleModeAspectFill - вычисляются коэффициенты масштаба x и y. Будет использоваться более крупный масштабный коэффициент. Это гарантирует, что представление будет заполнено, но обычно приводит к обрезанию частей сцены. Изображения в сцене, как правило, масштабируются, но сохраняют правильное соотношение сторон.

SKSceneScaleModeAspectFit - вычисляются коэффициенты масштаба x и y. Будет использоваться меньший масштабный коэффициент. Это гарантирует, что вся сцена будет видна, но будет обычным результатом в том, что сцена будет почтовой. Изображения в сцене обычно уменьшаются, но сохраняют правильное соотношение сторон.

SKSceneScaleModeResizeFill - Сцена не масштабируется. Он просто изменен так, чтобы он соответствовал виду. Поскольку сцена не масштабируется, изображения будут оставаться в исходном размере и соотношении сторон. Содержимое будет оставаться относительно источника сцены (внизу слева).

+0

Кажется, что не работает, см. Мое редактирование. – cmii

+0

Хорошо посмотри мой раздел редактирования –

+0

Хорошо, я обновил свои объяснения, установив опорную точку на (0,5, 0,5). Результат все еще не то, что мне нужно. – cmii

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