【发布时间】:2020-07-22 13:09:20
【问题描述】:
我无法在我的自定义 Actor 类上接收点击事件。
我可以使用现有的 UI 组件(例如按钮和标签)来做到这一点,但不能使用我的自定义角色。我将它添加到舞台,设置为inputProcessor,我在舞台上的render 方法中调用act,并且我从控制台输出中知道,正在调用我的演员上的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(我在这里有更复杂的屏幕结构,但我直接调用它只是为了确保结构不会导致问题)。
这种方法有问题吗?还有什么问题?
【问题讨论】: