You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpriteKit调用player.dodgeLeft()时精灵不播放动画是什么原因

问题根源

动画无法播放的核心原因是调用了错误的SKAction API:

  • 你使用的SKAction.animate(withNormalTextures:timePerFrame:resize:restore:)是专门用于动画修改精灵法线贴图(normalTexture属性)的方法,仅在配置了SpriteKit光照、法线效果时才会产生视觉变化,它不会修改精灵用于常规显示的主texture属性,因此精灵会一直停留在初始的"Rest"纹理状态,看不到任何闪避动画。
  • 你贴出的代码中循环区间写为1.. .3,区间运算符中间多了空格,属于语法错误,如果实际代码如此会直接编译失败;如果实际写的是半开区间1..<3,只会循环生成2个纹理,和你调试看到的3个纹理结果不符,推测是贴代码时的笔误,该问题不会导致动画完全不显示,仅会影响动画帧数量。
  • 额外逻辑问题:你在dodgeLeft()中使用repeatForever永久重复动画,同时restore参数设为true,即使修正API后,每轮动画结束都会瞬间切回初始Rest纹理,导致动画跳帧闪烁;且闪避属于一次性动作,通常不需要永久循环播放。
修复步骤
  1. 替换动画API参数标签,将两个闪避方法中的withNormalTextures:改为with:,使用正确的主纹理动画方法,同时调整不符合逻辑的重复和恢复设置:
func dodgeLeft() {
    // 使用主纹理动画API,关闭不必要的永久重复,避免跳帧将restore设为false
    let dodgeLeftAnimation = SKAction.animate(
        with: dodgeLeftTextures,
        timePerFrame: movementSpeed,
        resize: false,
        restore: false
    )
    currentSprite.run(dodgeLeftAnimation)
}

func dodgeRight() {
    // 使用主纹理动画API
    let dodgeRightAnimation = SKAction.animate(
        with: dodgeRightTextures,
        timePerFrame: movementSpeed,
        resize: false,
        restore: true
    )
    currentSprite.run(dodgeRightAnimation)
}
  1. 修正纹理加载的循环区间,确保加载3个纹理时使用闭区间运算符,不要在运算符中加多余空格:
func initializeAnimations() {
    // 1...3为闭区间,会遍历1、2、3三个值
    for i in 1...3 {
        dodgeLeftTextures.append(SKTexture(imageNamed: "Dodge Left \(i)"))
    }
    for i in 1...3 {
        dodgeRightTextures.append(SKTexture(imageNamed: "Dodge Right \(i)"))
    }
}

修正后运行即可正常看到闪避动画效果。

内容的提问来源于stack exchange,提问作者Hams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 16:03:34