Как применить градиент к SKShapeNode, созданному из пути - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь применить градиентную текстуру к узлу SKShapeNode, созданному из контура, чтобы линия переходила от сплошного цвета к прозрачному. Это работает на SKSpriteNode, но я не могу заставить его работать на SKShapeNode. Кто-нибудь знает решение этой проблемы? Наверняка что-то простое, как это должно быть возможно?

Я пробовал все виды вещей. Наиболее очевидным является то, что я пытался применить его как strokeTexture (см. Код ниже). Этот код демонстрирует градиент, работающий над узлом SpriteNode, но та же текстура дает разные результаты для узла ShapeNode.

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

Итак, вернемся к исходной точке. Я уверен, что что-то такое простое должно быть возможным. Может быть, я что-то пропускаю?

Возьмите этот упрощенный код, например:

// create gradient texture (with help of https://github.com/maximbilan/SKTextureGradient/blob/master/SKTextureGradient.swift)
var testTexture = SKTexture(size: CGSize(width: 200, height: 1), color1: CIColor(red: 1.0, green: 0.0, blue: 1.0, alpha: 1.0), color2: CIColor(red: 1.0, green: 0.0, blue: 1.0, alpha: 0.0), direction: GradientDirection.Left)
// create path for shape node
var testPath = CGMutablePath()
testPath.move(to: CGPoint(x: 50, y: 200))
testPath.addLine(to: CGPoint(x: 250, y: 200))
testPath.closeSubpath()
// assign path to shape
var testLine = SKShapeNode()
testLine.path = testPath
testLine.lineWidth = 1
self.addChild(testLine)
// add gradient as strokeTexture
testLine.strokeColor = UIColor.white
testLine.strokeTexture = testTexture
// apply gradient to SKSpriteNode
var testSprite = SKSpriteNode()
testSprite.size = CGSize(width: 200, height: 1)
testSprite.position = CGPoint(x: 50 + (testSprite.frame.width / 2), y: 150)
testSprite.texture = testTexture
self.addChild(testSprite)

Который выводит что-то вроде этого:

Как получить, чтобы первая строка (SKShapeNode) выглядела как вторая строка (SKSpriteNode)?

1 Ответ

0 голосов
/ 15 января 2019

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

testLine.isAntialiased = false

решит вашу проблему.

...