2017-02-03 14 views
2

SKSpriteNodeは120ピクセル×120ピクセルです。 スプライトのデフォルトのテクスチャは、半径が60pxの円です。 私がとスプライトをアニメーション化したいと思います:SKSpriteNodeアニメーションの各フレームが中央に配置されていないアニメーション

SKAction.animate(with:timePerFrame:resize:restore:) 

問題は、アニメーションの一部として、各テクスチャのサイズが未満120ピクセルX 120ピクセルで、ということですので、私はこれを行うとするスプライトアンカーポイントを設定している場合

CGPoint(x: 0.5, y: 0.5) 

アニメーションフレームは、スプライトの中央に配置されます。これは、後の正しいアニメーションではありません。私は次のようにアニメーションがなりたい:、

enter image description here

を私は120ピクセルX 120ピクセルであることをスプライトアトラス内のすべてのアニメーションテクスチャを追加しなければならないことを意味することに私は修正するのですか?そうであれば、空のピクセルを持つ無駄なアトラススペースになります。これを達成するためのより良い方法はありますか?すなわち、アニメーション内の各テクスチャフレームの中心点を指定するか?

ありがとうございます。あなたも試すことができるはずです

答えて

0

場合

enter image description here

resize = true にご注意を集中

、スプライトは、それぞれの新しいテクスチャに一致するようにサイズ変更されます。 が偽の場合、スプライトのサイズは一定のままです。

さらに詳しい公式の詳細が必要な場合はhereをご覧ください。例えば、あなたが再作成することができますSKAction.animate以下のコメントにあなたの要求について


このように拡張します:

extension SKAction 
{ 
    static func animate(withMyTextures textures:[texture:SKTexture], timePerFrame:TimeInterval ,resize:Bool, restore:Bool) ->SKAction { 

     var originalTexture : SKTexture! 
     let duration = timePerFrame * Double(textures.count) 

     return SKAction.customAction(withDuration: duration) 
     { 
      node,elapsedTime in 
      guard let spriteNode = node as? SKSpriteNode 
      else 
      { 
        assert(false,"animateWithMyTextures only works on members of SKSpriteNode") 
        return 
      } 
      let index = Int((elapsedTime/CGFloat(duration)) * CGFloat(textures.count)) 
      //If we havent assigned this yet, lets assign it now 
      if originalTexture == nil 
      { 
       originalTexture = spriteNode.texture 
      } 
      if(index < textures.count) 
      { 
       spriteNode.texture = textures[index].texture 
      } 
      else if(restore) 
      { 
       spriteNode.texture = originalTexture 
      } 
      if(resize) 
      { 
       spriteNode.size = spriteNode.texture!.size() 
      } 
     } 
    } 
} 
+0

これは、サイズ変更の問題ではありませんが。これはアニメーションの各フレームを正しい位置に配置する問題です。 resize = trueを設定すると、スプライトはアニメーションの各フレームで単純にサイズが変更されます。上の図の2番目の行を見てください。アニメーション中に各フレームをどのように配置すべきかを示します。 – plawres

+0

これがサイズ変更の問題でない場合は、アニメーションを作成するのが間違っています。透明な環境に挿入した後で、あなたの好みで右または左のベースにシンプルな画像が配置されることを期待するにはどうすればよいですか?ここには2つの問題があります。あなたのスプライト(resize = trueによって解決されます)、もう一つはあなたが望む側面にあなたの作品を移動する必要があります、そうでなければ、単純な参照のピクセルを置くアニメーションをリメイクする必要があります。 (または背景色を変更する)領域 –

+0

問題のサイズが変更されていません。実際には、アニメーションの各テクスチャフレームを個別に配置する方法がありますか?たとえば、アニメーションテクスチャフレームごとに異なるアンカーポイントを設定するのですか?例えばフレーム01アンカーポイント(0.0,0.5)、第2フレームアンカーポイント(0.25,0.5)、第3フレームアンカーポイント(0.5,0.5)など。アトラスに空のピクセルを持つ各テクスチャがあると、それは空のピクセルを保持するためのメモリの無駄です。 – plawres

関連する問題