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纹理,导致动画跳帧闪烁;且闪避属于一次性动作,通常不需要永久循环播放。
修复步骤
- 替换动画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) }
- 修正纹理加载的循环区间,确保加载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
相关产品推荐
相关产品推荐

