触摸事件,更改图像按钮

我知道这里已经有很多类似的问题和答案了,我已经完成了一些搜索,我想我应该把它作为一个新问题,因为我仍然找不到合适的答案。

所以,我写了一个简单的纸牌游戏,我从Mario Zechner的"Beginning Android Games 2nd edition"这本书中获得了90%的知识,我想知道你们有些人是否读过它。 我在编写游戏时遵循指南,甚至使用他在书中提供的框架(Mr.Nom游戏)。 我在他的论坛上问过,但没有回应,论坛反正也不太活跃。

本书提供了框架,其中有方法可以直接从代码中绘制Pixmap,绘制线等。所以我从不触摸布局,我也不使用XML。

本书使用类似于MVC(模型视图控制器)的模型,将世界和游戏分开。 演示和操作分层。 它根据游戏状态分离每个UI:Ready,paused,running,gameOver。

现在我被困在一些代码,因为我想改变我的按钮图像。 我提供2个图像(未压缩和按下),首先在所谓的(RunningUI)部分,我绘制未压缩的图像。 并且只需当用户触摸按钮(仅触摸下来)时我想将图像更改为按下的图像。 触摸释放后再次返回未压缩的图像。

 private void drawRunningUI() { Graphics g = game.getGraphics(); g.drawPixmap(Assets.buttonUnpressed, 70, 200); } 

updateRunning代码在这里:

 private void updateRunning(List touchEvents, float deltaTime) { Graphics g = game.getGraphics(); int len = touchEvents.size(); for(int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if (event.type == TouchEvent.TOUCH_UP) { if (event.x < 64 && event.y = 120 && event.x = 250 && event.y <= 380) { Assets.click.play(1); g.drawPixmap(Assets.buttonPressed, 70, 200); <-- nothing happened } } } world.update(deltaTime); } 

我修改了“一些在这里和那里”,但我仍然没有得到我想要的结果。

虽然我不知道这个框架并且只能猜测canvas绘制的方式,但我怀疑在updateRunning()之后立即调用updateRunning()并使用Assets.buttonPressed “覆盖”上一个绘制(取决于invalidation / redraw是如何进行的)处理)。

无论如何,你应该只在一个地方画画,然后它变得容易多了。 在事件处理代码中,您应该更新用于绘制UI的UI状态。 像这样的东西:

 private void updateRunning(List touchEvents, float deltaTime) { int len = touchEvents.size(); for(int i = 0; i < len; i++) { TouchEvent event = touchEvents.get(i); if(event.x < 64 && event.y < 64) { if(event.type == TouchEvent.TOUCH_UP) { // ... } else if (event.x >= 120 && event.x <= 180 && event.y >= 250 && event.y <= 380) { switch(event.type) { case TouchEvent.TOUCH_UP: uiState.updateButtonState(ButtonState.RELEASED); break; case TouchEvent.TOUCH_DOWN: Assets.click.play(1); uiState.updateButtonState(ButtonState.PRESSED); break; default: // nothing to do } } } world.update(deltaTime); // I suppose an invalidation has happened / a redraw will happen next } private void drawRunningUI() { Graphics g = game.getGraphics(); g.drawPixmap(uiState.getButtonState() == ButtonState.PRESSED ? Assets. buttonPressed : Assets.buttonUnpressed,70,200); } 

这还不够,但应该说明这个想法。