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

Ktx框架中LoadingScreen内Label重复渲染问题咨询及修复方案

KTX框架中“Click to start game”标签重复渲染的原因与修复

问题现象

使用KTX框架开发LibGDX应用时,LoadingScreen中的“Click to start game”标签被渲染两次;移除add(loadingState)代码后,标签显示恢复正常,即使去掉修改loadingState文本的代码也无法解决该问题。

原因分析

核心问题出在loadingState的初始化方式结合KTX的DSL隐式行为:

  • 你在visTable的DSL块中使用scene2d.visLabel("Loading...")创建loadingState,KTX的该DSL函数会自动将创建的Label添加到当前的visTable容器中;
  • 随后你又调用add(loadingState)手动将同一个Label再次添加到visTable,虽然LibGDX会自动处理重复添加(先移除原有实例再添加),但该操作干扰了Table的布局逻辑,最终导致“Click to start game”标签被重复渲染。

修复方案

以下两种方案任选其一即可:

方案1:移除手动添加操作,依赖DSL自动添加

class LoadingScreen(game: PKGame): BaseScreen(game) {
    val loadingState by lazy { scene2d.visLabel("Loading...") }

    override fun show() {
        TextureAssets.entries.forEach { game.assets.load(it) }

        stage.actors {
            visTable {
                center()
                setFillParent(true)
                // 移除add(loadingState),scene2d.visLabel已自动将Label添加到Table
                row()
                visLabel("Click to start game")
            }
        }
    }

    // 其余代码保持不变
}

注意:需确保loadingState的初始化触发时机在visTable的DSL块内,否则Label不会被自动添加到容器。

方案2:直接构造Label实例,手动添加到容器

class LoadingScreen(game: PKGame): BaseScreen(game) {
    // 直接用构造函数创建Label,不依赖DSL自动添加
    val loadingState by lazy { VisLabel("Loading...") }

    override fun show() {
        TextureAssets.entries.forEach { game.assets.load(it) }

        stage.actors {
            visTable {
                center()
                setFillParent(true)

                add(loadingState) // 仅手动添加一次
                row()
                visLabel("Click to start game")
            }
        }
    }

    // 其余代码保持不变
}

该方式避免了DSL隐式添加的行为,逻辑更清晰,不易出现布局异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:24:54