Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在纹理贴图集动画之间平滑切换_Ios_Swift_Sprite Kit - Fatal编程技术网

Ios 在纹理贴图集动画之间平滑切换

Ios 在纹理贴图集动画之间平滑切换,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,如何在同一角色的多个动画之间毫不延迟地平滑过渡? 我正在开发一款iOS Swift游戏,里面有一个跳跃角色。该角色有一些动画,如基本动画、跳跃动画和着陆动画 我为每个动画设置纹理图集,如下所示: // Basic let surferBasicAnimatedAtlas = SKTextureAtlas(named: "surfer_basic.atlas") let numImages = surferBasicAnimatedAtlas.textureNames.c

如何在同一角色的多个动画之间毫不延迟地平滑过渡?

我正在开发一款iOS Swift游戏,里面有一个跳跃角色。该角色有一些动画,如基本动画、跳跃动画和着陆动画

我为每个动画设置纹理图集,如下所示:

    // Basic
    let surferBasicAnimatedAtlas = SKTextureAtlas(named: "surfer_basic.atlas")

    let numImages = surferBasicAnimatedAtlas.textureNames.count

    for var i=0; i<numImages; i++ {
        let surferBasicTextureName = "surfer_basic_000\(i)"
        self.surferBasicFrames.append(surferBasicAnimatedAtlas.textureNamed(surferBasicTextureName))
    }

    // Jump
    let surferJumpAnimatedAtlas = SKTextureAtlas(named: "surfer_jump.atlas")

    let numJumpImages = surferJumpAnimatedAtlas.textureNames.count

    for var i=0; i<numJumpImages; i++ {
        let surferJumpTextureName = "surfer_jump_000\(i)"
        self.surferJumpFrames.append(surferJumpAnimatedAtlas.textureNamed(surferJumpTextureName))
    }

    // Landing
    let surferLandingAnimatedAtlas = SKTextureAtlas(named: "surfer_landing.atlas")

    let numLandingImages = surferLandingAnimatedAtlas.textureNames.count

    for var i=12; i<numLandingImages; i++ {
        let surferLandingTextureName = "surfer_landing_000\(i)"
        self.surferLandingFrames.append(surferLandingAnimatedAtlas.textureNamed(surferLandingTextureName))
    }

    // Pick textures
    self.surferWalkingFrames = surferBasicFrames

    let firstFrame = surferWalkingFrames[0]
    self.character = SKSpriteNode(texture: firstFrame)

    self.character.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(surferWalkingFrames, timePerFrame: (1 / 30), resize: false, restore: true)), withKey:"surferBasic")
//基本
让surferBasicAnimatedAtlas=SKTextureAtlas(命名为:“surfer\u basic.atlas”)
让numImages=surferbasicanimatedatals.textureNames.count

对于var i=0;我可能错了,但看起来(1/30)是你的罪魁祸首,原因有两个

  • 1/30将返回一个整数,它将为0
  • 如果你做1.0/30.0,你会得到一个很好的浮动,就像你想要的,但是它会是0.03333,你要求它两次,每秒30次切换纹理。这相当快,你甚至可能看不到它的变化
  • 我会先试试。2,看看这会不会改变什么,如果会的话,那只是找到你需要多快改变纹理的问题


    希望这会有所帮助。

    这确实让过渡更加顺利。过渡期之间不再有“冻结”。但是,实际的跳跃动画仍然会延迟一秒开始。所以你的回答有一定的帮助!你还有其他想法吗?@NGAFD当你说它开始晚了一秒时,是意味着你看基本动画的时间长了一点,还是一秒钟都没有动画?我唯一能想到的另一件事是将restore设置为false。我看到基本动画的时间延长了一秒钟@NGAFD您提供的代码其他一切看起来都很好。我会再次检查,以确保您在Touch begin或update中没有任何其他可能导致此问题的内容。其他问题可能是跳转数组中的第一对纹理看起来类似于basic,还原为false可能会有所帮助,或者与使用self不同。但这不太可能有什么不同。
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    
        self.character.removeActionForKey("surferBasic")
    
        self.surferWalkingFrames = surferJumpFrames
        self.character.runAction(SKAction.repeatActionForever(SKAction.animateWithTextures(surferWalkingFrames, timePerFrame: (1 / 30), resize: false, restore: true)), withKey:"surferJump")
    }