使用尺寸与原始尺寸不同的纹理为SKSpriteNode设置动画

时间:2016-06-01 22:24:39

标签: swift sprite-kit skspritenode skaction sktexture

我想使用SKAction.animateWithTextures(textures,timePerFrame,resize,restore)使用SKTextureAtlas中的纹理为SKSpriteNode设置动画。然而,地图集中的纹理的大小略大于原始纹理(它基本上是一个移动的角色)。当动作运行时,纹理要么被压缩以适应精灵的原始大小,要么在我将resize设置为false时重新定位,这会改变角色的位置。但是,我想要的是将纹理锚定在左下角(或者右下角,取决于方向),这样角色的位置就不会与纹理的额外部分分开。

我已经尝试在运行动作之前更改精灵的锚点,但显然也适用于原始纹理。此外,我想改变原始纹理的大小会对物理行为产生影响,我想避免这种影响。

有没有人有关于如何做到这一点的建议?

谢谢!

大卫

1 个答案:

答案 0 :(得分:1)

这样可行

  1. 编辑所有纹理以匹配最大尺寸纹理的大小。
  2. 只需使用Alpha通道为较小的纹理添加一些填充,即可为您提供透明背景。

    E.g。注意第一个纹理有多少负空间 (来自CartoonSmart.com)

    enter image description here

    1. 创建具有特定大小的物理主体。例如。您可以在没有填充的情况下加载纹理并获得大小。然后根据需要将其放置到带有填充的新的和改进的纹理上。因此,在使用新调整大小的纹理创建Sprite后,您可以

      /// load a texture to be a template for the size
      let imageTextureSizeTemplate = SKTexture(imageNamed: textureWithoutPadding)
      
      let bodySize = imageTextureSizeTemplate.size()
      
       /// position template texture physics body on texture that will be used  
      let bodyCenter = CGPointMake(0.5, 0.5)
      
      // create physics body
      let body:SKPhysicsBody = SKPhysicsBody(rectangleOfSize: bodySize, center: bodyCeneter)
      
          self.physicsBody = body
      
    2. 在为纹理设置动画时设置resize:false。