You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SpriteKit开发疑问:玩家左右移动时为何仅播放左侧行走动画?

问题分析与解决

你遇到的核心问题是纹理加载逻辑错误,导致左右行走的纹理数组实际指向了同一套资源,所以不管向左还是向右移动,都会播放同一个左侧行走动画。

问题根源

你在初始化纹理数组时,使用SKTexture(imageNamed: name)从全局资源池加载图片,而不是从你创建的textureAtlastextureAtlas2中获取对应图集的纹理。如果两个图集里的图片文件名都是win_1.pngwin_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

火山引擎 最新活动