[英]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.