Libgdx自定义Actor未触发clicked和touchedDown事件



我在自定义actor类上接收点击事件时遇到问题。我可以使用现有的UI组件(如按钮和标签(来做到这一点,但不能使用我的自定义actor。我把它添加到了stage,它被设置为inputProcessor,我在stage的render方法中在stage上调用act,我从控制台输出中知道,我的actor上的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与触摸点重叠后直接从Stage调用的。

我认为你的问题是你没有在Actor上设置位置和大小,所以它的hit方法总是返回false。

我还想建议您不要使用Sprite类,尤其是对于Actors。Sprite类不仅是一个图像资源(它扩展的TextureRegion(,而且是一组关于其大小、颜色旋转、比例等的数据。因此,从一般的角度来看,这个类在分离关注点方面做得很差,因为它将图像资源与游戏状态数据混为一谈。它在LibGDX中仅用于粒子,这是一种高度优化的情况,您永远不必单独检查单个粒子的绘制数据,而且粒子数量很大,因此类需要尽可能紧凑。

但尤其是当你把它和Actor结合在一起时,这是有问题的,因为现在你的游戏状态数据存在于两个地方。Actor和Sprite都包含位置、颜色、旋转、比例等数据,那么哪一个是true数据?这是模棱两可的,而且试图保持它们的同步会非常容易出错。

相反,应该使用TextureRegion而不是Sprite。那么你的演员的大小、位置和颜色只有一个可能的真相来源:演员的属性。

最新更新