SKWarpGeometry на SKLabelNode как дочерний элемент SKEffectNode переворачивает метку вверх дном
Я пытаюсь деформировать SKLabelNode как дочерний элемент SKEffectNode (в документации сказано, что вы можете это сделать), но он переворачивает узел метки вверх ногами, прежде чем применить деформацию. Это может быть ошибкой, но прежде чем подать ее, я подумал, что я должен спросить здесь...
Вот мой код:
func warpNode(_ node: SKEffectNode)
{
if #available(iOS 10.0, *)
{
let sourcePositions: [vector_float2] =
[
vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object
vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object
vector_float2(0, 1), vector_float2(0.5, 1), vector_float2(1, 1) //top row of object
]
let destinationPositions: [vector_float2] =
[
vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object
vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object
vector_float2(0, 0.8), vector_float2(0.5, 0.8), vector_float2(1, 0.8) //top row of object
]
let warpGeometryGrid = SKWarpGeometryGrid(columns: 2, rows: 2, sourcePositions: sourcePositions, destinationPositions: destinationPositions)
let warpGeometryGridNoWarp = SKWarpGeometryGrid(columns: 2, rows: 2)
node.warpGeometry = warpGeometryGridNoWarp
let warpAction = SKAction.animate(withWarps: [warpGeometryGridNoWarp, warpGeometryGrid, warpGeometryGridNoWarp], times: [0.25, 0.5, 0.75], restore: true)
node.run(warpAction!)
}
else
{
print("Need iOS >= iOS 10 to warp!!!")
}
}
let effectNode = SKEffectNode()
effectNode.shouldEnableEffects = true
addChild(effectNode)
let labelNode = SKLabelNode(fontNamed: "Chalkduster")
labelNode.text = "Label"
effectNode.addChild(labelNode)
warpNode(effectNode)
Этот код должен сдавить верхнюю часть метки вниз, а затем вернуть его в исходное положение (как если бы вы нажали на мяч или что-то в этом роде), однако он переворачивает его вверх ногами, а затем раздавливает верх (который теперь является нижней частью слово), а затем возвращает его к исходному размеру и положению (права вверх).
РЕДАКТИРОВАТЬ: Основываясь на комментарии 0x141E, я преобразовал SKLabelnode в SKTexture и добавил новый SKSpriteNode с этой текстурой. Если бы я использовал функцию warpNode для effectNode, это имело тот же эффект, что перевернуло слово "вверх ногами", а затем применил "squish". Однако, если я использовал функцию warpNode непосредственно на новом SKSpriteNode, он работал правильно.
Новый код ниже:
func warpNode(_ node: SKSpriteNode)
{
if #available(iOS 10.0, *)
{
let sourcePositions: [vector_float2] =
[
vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object
vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object
vector_float2(0, 1), vector_float2(0.5, 1), vector_float2(1, 1) //top row of object
]
let destinationPositions: [vector_float2] =
[
vector_float2(0, 0), vector_float2(0.5, 0), vector_float2(1, 0), //bottom row of object
vector_float2(0, 0.5), vector_float2(0.5, 0.5), vector_float2(1, 0.5), //middle row of object
vector_float2(0, 0.8), vector_float2(0.5, 0.8), vector_float2(1, 0.8) //top row of object
]
let warpGeometryGrid = SKWarpGeometryGrid(columns: 2, rows: 2, sourcePositions: sourcePositions, destinationPositions: destinationPositions)
let warpGeometryGridNoWarp = SKWarpGeometryGrid(columns: 2, rows: 2)
node.warpGeometry = warpGeometryGridNoWarp
let warpAction = SKAction.animate(withWarps: [warpGeometryGridNoWarp, warpGeometryGrid, warpGeometryGridNoWarp], times: [0.25, 0.5, 0.75], restore: true)
node.run(warpAction!)
}
else
{
print("Need iOS >= iOS 10 to warp!!!")
}
}
let labelNode = SKLabelNode(fontNamed: "Chalkduster")
labelNode.text = "Label"
let labelNodeTexture = SKView().texture(from: labelNode)!
let labelNodeSprite = SKSpriteNode(texture: labelNodeTexture)
addChild(labelNodeSprite)
warpNode(labelNodeSprite)
Я просто удалил всю часть EffectNode в коде, добавил новый спрайт и сделал с этим перекос.
1 ответ
Отредактировал мой вопрос как ответ на основании комментария 0x141E.
Если вы всегда деформируете свой узел метки (либо непрерывно его анимируете, либо изначально применяете деформацию), вы можете упреждающе перевернуть свой узел метки, используя labelNode.yScale = -1
. Тогда, когда вы деформируете, он будет правильной стороной вверх. Немного глупо, но для моих целей это работает.