2017-02-03 73 views
2

我有一个SKSpriteNode,它是120px x 120px。 精灵的默认纹理只是一个半径为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,则精灵将会简单地调整每个动画帧的大小。请看一下上图中的第二行。那就是在动画期间应该如何定位每个帧。 – plawres

+0

如果这不是调整大小的问题,那么制作动画就是错误的。您如何期望简单的图像根据您的口味定位在右侧或左侧,然后您已插入透明环境中?这里有两个问题:一个是由顶部/底部的透明区域引起的不同尺寸你的精灵(通过resize = true解决),另一个是你应该把你的棋子移动到你想要的一侧,否则你应该重新制作一个简单的参考像素到动画。区域以保持真实的宽度尺寸(或更改背景颜色) –

+0

问题不在调整大小。真正的问题是,是否有办法单独定位动画的每个纹理帧或者例如为每个动画纹理帧设置不同的定位点?例如第一帧定位点(0.0,0.5),第二帧定位点(0.25,0.5),第三帧定位点(0.5,0.5)等等。因为如果我在地图集中包含空像素的每个纹理,那么保留空像素会浪费内存。 – plawres