Why this label is rendered twice?

59 Views Asked by At

I use ktx.

I have the code below:

abstract class BaseScreen(val game: PKGame) : KtxScreen {
    val stage: Stage

    init {
        stage = PStage(ScreenViewport())
        Gdx.input.inputProcessor = stage
    }

    override fun render(delta: Float) {
        stage.act()
        stage.draw()
    }

    override fun resize(width: Int, height: Int) {
        stage.viewport.update(width, height, true)
    }

    override fun dispose() {
        stage.dispose()
    }
}
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)
                row()
                visLabel("Click to start game")
            }
        }
    }

    override fun render(delta: Float) {
        game.assets.update()

        if (Gdx.input.isTouched && game.assets.isFinished) {
            game.addScreen(MainMenu(game))
            game.setScreen<MainMenu>()
            game.removeScreen<LoadingScreen>()
            dispose()
        }

        if (game.assets.isFinished) {
            loadingState.setText("Finished")
        }
        debug { stage.actors.toString() }

        super.render(delta)
    }
}

Why it showed twice? And how can I fix this problem?

图片.png

It is expected that the label "Click to start game" show just once.

I hove tried removing the code

if (game.assets.isFinished) {
    loadingState.setText("Finished")
}

but it still happened.

Then, I tried removing add(loadingState) and it rendered as expected.

0

There are 0 best solutions below