簡體   English   中英

Libgdx 自定義 Actor 未觸發 clicked 和 touchedDown 事件

[英]Libgdx custom Actor not firing clicked and touchedDown events

我無法在我的自定義演員 class 上接收點擊事件。 我可以使用現有的 UI 組件(如按鈕和標簽)來做到這一點,但不能使用我的自定義角色。 我將它添加到設置為inputProcessor的舞台,我在舞台的render方法中調用舞台上的act ,並且我從控制台 output 知道,正在調用對我的演員的act 然而,事件永遠不會被解雇。 我還應該看什么? 我的演員:

class TowerActor(val sprite: Sprite, val unit: Tower) : Actor() {

    init {
        touchable = Touchable.enabled
        addListener(TestListener())
        sprite.updatePosition(unit.position)
    }

    override fun draw(batch: Batch, parentAlpha: Float) {
        super.draw(batch, parentAlpha)
        sprite.draw(batch)
    }

    class TestListener : InputListener() {
        override fun touchUp(event: InputEvent?, x: Float, y: Float, pointer: Int, button: Int) {
            super.touchUp(event, x, y, pointer, button)
            println("touchUp")
            exitProcess(0)
        }

        fun clicked(event: InputEvent?, x: Float, y: Float) {
            println("clicked2")
            exitProcess(0)
        }
    }
}

我的舞台(刪除了不重要的部分):

class GameStage(
        val game: GameController,
        result: MapParser.Result,
        levelId: String? = null

) : Stage() {
    val level: Level = game.loadLevel(levelId ?: result.levelTypes.first().id)
    val gameRenderer: GameRenderer

    init {
        gameRenderer = GameRenderer(batch = batch as SpriteBatch, level = level, textureRepository = TextureRepository.fromTiles(result.tiles))
    }

    fun render(delta: Float) {
        act(delta)
        draw()
    }

    val towerActors: MutableMap<String, Actor> = mutableMapOf()
    val textureRepository = TextureRepository.fromTiles(result.tiles)

    override fun draw() {
        super.draw()
        level.container.towersForRead.forEach { unit ->
            val tower = towerActors.getOrPut(unit.id) {
                println("created tower")
                val sprite = Sprite(textureRepository.getRegion(unit.type))
                val t = TowerActor(sprite = sprite, unit = unit)
                addActor(t)
                t
            }
        }
    }
}

在我的主要游戲render方法中,我只是直接調用GameStage.render (我在這里有更復雜的屏幕結構,但我直接調用它只是為了確保結構不會導致問題)。

這種方法有問題嗎? 還有什么問題?

Actor 的輸入偵聽器不是從它們自己的act方法調用的,而是在調用 Actor 層次結構中的hit方法之后直接從舞台調用以確定哪些 Actor 與觸摸點重疊。

我認為您的問題是您沒有在您的 Actor 上設置 position 和大小,因此它的hit方法將始終返回 false。

我還想建議您不要使用 Sprite class,尤其是與 Actor 一起使用。 Sprite class 不僅是一個圖像資產(它擴展自 TextureRegion),而且還是一堆關於其大小、顏色旋轉、縮放等的數據。所以從一般的角度來看,這個 class 在關注點分離方面做得很差,因為它將圖像資產與游戲 state 數據混為一談。 它在 LibGDX 中僅用於粒子,這是一種高度優化的情況,您無需單獨檢查單個粒子的繪制數據,並且它們的數量很大,因此 class 需要盡可能緊湊。

但尤其是當你將它與 Actor 結合使用時,它會出現問題,因為現在你的游戲 state 數據存在於兩個地方。 Actor和Sprite都包含position、顏色、旋轉、縮放等數據,那么哪一個是真實數據呢? 這是模棱兩可的,嘗試使它們保持同步很容易出錯。

相反,您應該使用 TextureRegion 而不是 Sprite。 那么對於 Actor 的尺寸 position 和顏色只有一個可能的事實來源:Actor 的屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM