В настоящее время я нарисовал две строки на экране, которые имеют один и тот же цвет, но оба имеют значение альфа меньше 1. Когда эти линии пересекаются, другой цвет, чем остальные строки. Был предыдущий пост, рассматривающий тот же вопрос: swift drawing translucent lines, how to make overlapping parts not getting darker? Однако на этот пост недостаточно ответов. Я рисую линии в настоящее время, как это:Swift: Сделать полупрозрачные перекрывающиеся линии одного цвета не меняют цвет при пересечении
var points = [CGPoint]()
points = [CGPoint(x: -100, y: 100), CGPoint(x: 100, y: -100)]
let FirstLine = SKShapeNode(points: &points, count: points.count)
FirstLine.strokeColor = UIColor.init(red: 0.25, green: 0.62, blue: 0.0, alpha: 0.5)
FirstLine.lineWidth = 30
addChild(FirstLine)
points = [CGPoint(x: 100, y: 100), CGPoint(x: -100, y: -100)]
let SecondLine = SKShapeNode(points: &points, count: points.count)
SecondLine.strokeColor = UIColor.init(red: 0.25, green: 0.62, blue: 0.0, alpha: 0.5)
SecondLine.lineWidth = 30
addChild(SecondLine)
Я понимаю, почему это происходит, но есть ли способ, чтобы сделать пересечение выглядят одинаково, так что выглядит гораздо лучше?
Редактировать: Я решил реализовать ответ @ Confused. Однако теперь проблема заключается в том, что текстура всегда центрируется до середины экрана. Это пример:
красный крест находится в правильном положении, как он соединяет указанные точки вместе. Однако, как только я делаю красный крест текстурой, он всегда центрируется к середине экрана (зеленый крест - красный крест в виде текстуры). Могу ли я использовать любой код, который мог бы переместить текстуру в правильное положение. Примечание: этот код не может работать только в этом примере, мне нужен тот, который работает все время независимо от положения красного креста.
FINAL ИЗМЕНИТЬ ДЛЯ ЛЮДЕЙ С ТЕМ ЖЕ ПРОБЛЕМА
Во-первых, установка все так:
var points = [CGPoint]()
let crossParent = SKNode()
addChild(crossParent)
Обратите внимание , что вы должны создать родительский SKNode для в противном случае все, что на экране станет текстурой, а не только узлом, который вы хотите. Затем добавьте этот родительский узел в сцену.
После, создать строки, которые вы хотите (в данном случае зеленый крест):
//The first line of the green cross
points = [CGPoint(x: -300, y: 300), CGPoint(x: -100, y: 100)]
let FirstLine = SKShapeNode(points: &points, count: points.count)
FirstLine.strokeColor = UIColor.init(red: 0.25, green: 0.62, blue: 0.0, alpha: 1.0)
FirstLine.lineWidth = 30
crossParent.addChild(FirstLine)
Помните к НЕ добавить первую строку, вы создаете на сцене, а в родительский SKNode, который вы создали в начале. Также установите значение alpha равным 1.0 для каждой линии, которую вы рисуете. Затем добавить другие строки:
//The second line of the green cross
points = [CGPoint(x: -100, y: 300), CGPoint(x: -300, y: 100)]
let SecondLine = SKShapeNode(points: &points, count: points.count)
SecondLine.strokeColor = UIColor.init(red: 0.25, green: 0.62, blue: 0.0, alpha: 1.0)
SecondLine.lineWidth = 30
FirstLine.addChild(SecondLine)
Обратите внимание, что вы должны добавить эту строку в первой строке, как это и не к месту. Если вы добавляете более одной строки после добавления первой строки, добавьте ее в первую строку, как я сделал здесь тоже для каждой последовательной строки , которую вы добавляете.
Теперь создадим текстуру, как это:
let tex = view?.texture(from: FirstLine)
let cross = SKSpriteNode(texture: tex, color: .clear, size: (tex?.size())!)
cross.alpha = 0.5
addChild(cross)
После этого, все, что вы называете крест будет ваша текстура, и вы можете изменить значение альфа, как я сделал здесь все, что вы хотите получить, а изображение не будет иметь разных цветов. Не забудьте добавить эту текстуру к сцене.
Наконец, вы можете заметить, что текстура находится не в том месте, где вы первоначально ставили точки. Вы можете поместить его обратно в том же положение, как это:
cross.position = CGPoint(x: (FirstLine.frame.midX), y: (FirstLine.frame.midY))
Надеется, что это помогает :) Спасибо вам @Confused для текстуры части программы: D
Это происходит потому, что в точке пересечения цвета превышены. Таким образом, вы можете справиться с этим, не используя Alpha <1. Выберите проданный цвет с альфа 1.0, и этого не произойдет. –
@UmairAfzal «Я понимаю, почему это происходит, но есть ли способ сделать пересечение одинаковым, так что он выглядит намного лучше?» Он хочет альфа, не хочет смешивания. – Confused
Являются ли эти линии статичными или движущимися? Есть ли способ объединить 2 SKShapeNodes в один узел, а затем перерисовать его как одну фигуру? Я знаю, что есть способ извлечь текстуру, созданную из спрайта и узла обрезки, и вы можете сгенерировать новый узел из этого. Возможно, поразительная производительность, особенно если это нужно делать много раз в секунду. –