我理解这个错误提示指出,指定的帧编号超过了精灵图集(Sprite Sheet)的总帧数。但是,我的动画只指定了3帧,却被告知有5帧以上,这让我很困惑。
游戏运行时没有问题,是不是哪里缓存堆积了呢?
E 0:00:07:356 Sprite2D::set_frame: 索引 p_frame = 5 超出范围(vframes * hframes = 5)。
<C++ 源文件> scene\2d\sprite_2d.cpp:256 @ Sprite2D::set_frame()
我理解这个错误提示指出,指定的帧编号超过了精灵图集(Sprite Sheet)的总帧数。但是,我的动画只指定了3帧,却被告知有5帧以上,这让我很困惑。
游戏运行时没有问题,是不是哪里缓存堆积了呢?
E 0:00:07:356 Sprite2D::set_frame: 索引 p_frame = 5 超出范围(vframes * hframes = 5)。
<C++ 源文件> scene\2d\sprite_2d.cpp:256 @ Sprite2D::set_frame()
我认为我发现问题所在了。在你的动画中,帧轨道位于动画轨道的上方。轨道是从上到下应用的,因此帧值会先被设置,而此时之前的动画仍处于激活状态。如果之前的动画包含的帧数少于正在设置的帧数,你就会在动画轨道切换之前短暂地遇到越界错误。这就是为什么游戏仍然能正常运行,因为错误只持续了一帧。
解决方法是重新排列轨道,使动画轨道位于帧轨道的上方。你可以拖动轨道名称来移动它。这样,在应用帧索引之前,会先设置正确的动画(及其帧数)。
我注意到一个细节,错误提示中提到了 Sprite2D,但你的设置使用的是 AnimatedSprite2D。如果在重新排列轨道后错误仍然存在,它可能来自其他对象,因此请检查是否有任何其他动画具有相同的轨道顺序。
感谢您的回复。
我尝试将轨道顺序调换,把动画轨道置于帧轨道之上,但错误仍然存在。
我试着在仅放置玩家的测试地图中进行了测试,结果同样出现了相同的错误。
好吧,真糟糕。你能把项目文件发送到 pgmmv-support@gotchagotcha.jp 吗?这样我们也许可以查看一下,看看为什么会发生这种情况?
谢谢。请确认。
你好,我有时间下载了你在这里链接的文件,但那是导出后的游戏文件。为了进一步调查内部情况,我需要你把原始项目文件打包成 zip 格式,发送到 pgmmv-support@gotchagotcha.jp。如果你能发送一个包含项目文件的新链接,我们将很乐意为你检查!
谢谢。我已经通过邮件发送了项目文件的压缩包链接。
谢谢你发送项目文件,我找到原因了!
错误根本不是来自玩家的 07_walljump 动画。它来自墙跳特效对象 e_008_walljump_01.tscn。它的 effect 节点是一个普通的 Sprite2D,这与错误文本完全匹配。玩家使用的是 AnimatedSprite2D,所以玩家从来不是问题的根源。
情况是这样的。特效的纹理 Eyebeam_002.png 大小为 120x46,hframes = 5,所以有效的帧值范围是 0 到 4。但是 E_008_walljump_01.tres 中的 walljump_01 动画有一个帧轨道,包含六个关键帧,从 0 到 5。当最后一个关键帧设置为帧 5 时,Godot 会打印出越界错误。游戏看起来仍然正常,因为同一个动画在错误关键帧触发的那一刻将 alpha 值淡出为 0,所以无效帧从未被显示出来。每次进行墙跳时,这只是单帧的错误,仅此而已。
我认为这个动画最初是为 6 帧的纹理制作的。冲刺特效 e_008_dash_01.tscn 使用 Eyebeam_001.png,hframes = 6,并且同样使用 0 到 5 的关键帧,没有任何问题。看起来在墙跳版本中替换为 5 帧纹理时,没有调整最后一个关键帧。
修复方法:
打开墙跳特效的 walljump_01 动画,将 effect:frame 轨道上的最后一个关键帧从 5 改为 4,或者直接删除该关键帧。由于此时精灵已经完全透明,因此不会有任何视觉变化。我还检查了其他动画,它们的关键帧 0 到 5 都指向 AnimatedSprite2D,所以它们不会导致此错误。
谢谢。问题已经顺利解决。