SpriteKit开发疑问:玩家左右移动时为何仅播放左侧行走动画?
问题分析与解决
你遇到的核心问题是纹理加载逻辑错误,导致左右行走的纹理数组实际指向了同一套资源,所以不管向左还是向右移动,都会播放同一个左侧行走动画。
问题根源
你在初始化纹理数组时,使用SKTexture(imageNamed: name)从全局资源池加载图片,而不是从你创建的textureAtlas或textureAtlas2中获取对应图集的纹理。如果两个图集里的图片文件名都是win_1.png、win_2.png这类同名格式,系统最后加载的图集资源会覆盖之前的,导致两个纹理数组内容完全一致,动画自然无法区分左右。
修复方案
修改纹理加载代码,直接从对应的纹理图集中获取纹理,替换掉imageNamed的用法:
override func didMove(to view: SKView) { intializeGame(); textureAtlas = SKTextureAtlas(named: "walkingAnimation") textureAtlas2 = SKTextureAtlas(named: "walkingAnimationLeft") // 加载向右行走的纹理(从textureAtlas中读取) for textureName in textureAtlas.textureNames.sorted() { textureArray.append(textureAtlas.textureNamed(textureName)) } // 加载向左行走的纹理(从textureAtlas2中读取) for textureName in textureAtlas2.textureNames.sorted() { textureArray2.append(textureAtlas2.textureNamed(textureName)) } }
额外优化建议
- 排序纹理名称:
textureNames返回的顺序不一定是动画帧的正确顺序,用sorted()可以保证帧按序号加载,避免动画播放顺序混乱。 - 先停旧动画再播新动画:播放新行走动画前,先移除节点上的所有旧动作,防止多个动画叠加导致的异常:
// 向右移动时的修改示例 playerAnimate.removeAllActions() playerAnimate.run(SKAction.repeat(SKAction.animate(with: textureArray, timePerFrame: 0.15), count: 1))
修改后,左右行走的纹理数组会正确加载对应图集的资源,动画就能正常区分方向了。
内容的提问来源于stack exchange,提问作者J smith




