►事件处理
在框架中,仅需要对触屏事件进行转换后交给子类处理。而按键事件可以直接由子类进行,框架内不需要对其进行处理后再交由子类。因此,GamesurfaceView仅对onTouchEvent()进行重写。
在onTouchEvent()中,需要创建一个新的Event并将系统获取的Event复制到新的Event中,然后改变其当前的触发位置。其位置的横坐标应如下计算:
新横坐标 = 原始横坐标 * renderWidth / actulWidth
即将屏幕坐标转换为缓冲屏幕(或称标准屏幕)坐标。纵坐标的操作与此类似。然后再将该新生成的Event分发给不同状态的处理方法并检查是否需要进行手势处理。
onTouchEvnet代码如下:
public boolean onTouchEvent(MotionEvent event) {
MotionEvent renderEvent = MotionEvent.obtain(event); renderEvent.setLocation(event.getX() * renderWidth / actulWidth, event.getY() * renderHeight / actulHeight); boolean isUsed = false; switch(gameState){ case GAMESTATE_LOADING: isUsed = loadingTouchEvent(renderEvent); break; case GAMESTATE_LOGO: isUsed = logoTouchEvent(renderEvent); break; case GAMESTATE_MENU: isUsed = menuTouchEvent(renderEvent); break; case GAMESTATE_PLAY: isUsed = playTouchEvent(renderEvent); break; case GAMESTATE_END: isUsed = endTouchEvent(renderEvent); break; } if (!isUsed && isUseGesture) { return gestureDetector.onTouchEvent(renderEvent); } return isUsed; } |
其中loadingTouchEvent()、logoTouchEvent()、menuTouchEvent()、playTouchEvent()、endTouchEvent()分别为不同状态下,子类需要进行事件处理的抽象方法。在其后讲解的抽象方法的定义中将会介绍这些方法的定义。