SKEffectNodeの子としてSKLabelNodeをワープしようとしていますが(ドキュメントではそうすることができます)、ラベルノードを逆さまにしてからワープ。これはバグかもしれないが、私はそれを提出する前に、私はここにお願いしたいと思った...ここでSKEffectNodeの子としてSKLabelNodeのSKWarpGeometryがラベルを逆さまに反転します
は私のコードです:
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)
このコードがダウンして、ラベルの上部を押しつぶしすべきです(ボールや何かを押した場合のように)元の位置に戻しますが、逆さまに反転させた後、上端(単語の一番下にある)を押し下げて元のサイズに戻しますと位置(rightside-up)。
EDIT:0x141Eのコメントに基づいて、SKLabelnodeをSKTextureに変換し、そのSKUriteNodeにそのテクスチャを追加しました。 effectNodeでwarpNode関数を使用した場合、単語を逆さにしてスキームを適用するのと同じ効果があります。しかし、新しいSKSpriteNodeでwarpNode関数を直接使用した場合、正しく動作します。
以下の新しいコード:
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部分を排除して、新しいスプライトを追加し、その上のワープをしました。
これはバグのようです。あるいは、 'SKView'の' texture() 'メソッドを使ってラベルをテクスチャに変換し、テクスチャから' SKSpriteNode'を作成し、スプライトをワープすることもできます。 – 0x141E
これを数時間稼働させようとしてきましたが、テクスチャアトラスでうまくいきません...残念ながら、これは新しいSpriteKit機能のトレンドです。 – CloakedEddy