触摸openGLES中的交互

时间:2011-11-19 15:11:49

标签: android opengl-es

我一直在Android上探索Nim Game。玩家将从堆中取出物品。我使用openGLES绘制对象和堆。我被困在哪里是如何“采取”。
正如official dev guide 上显示的示例一样,我可以覆盖onTouchEvent用于交互的类中的extends GLSurfaceView方法。但是,我怎么知道对象的绘制位置?或者我触摸的坐标处是否有任何物体? 有任何想法吗?
Thx提前!

2 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,听起来你想做一些简单的碰撞检测,看你的接触点是否在堆上的一个对象里面。您可以使用触摸点的坐标和用于绘制对象的中心坐标之间的一些基本数学运算来完成此操作。

例如,假设您的对象是矩形,这将是一般的想法:

boolean detectCollision(Object object, TouchPoint touch) {
      return object.x - object.width/2 <= touch.x &&
             object.x + object.width/2 >= touch.x &&
             object.y - object.height/2 <= touch.y &&
             object.y + object.height/2 >= touch y;
}

然后你可以遍历堆中的所有对象,如果对于它们中的任何一个返回true,那么你就知道你的接触点在那个对象里面,并且可以继续调用你需要调用它的任何东西。

请记住,系统给出的触摸坐标是屏幕坐标,因此您必须考虑屏幕坐标系与您使用视锥体定义的坐标系之间的任何差异。

答案 1 :(得分:1)

public class Main extends Activity implements OnTouchListener {
public boolean onTouch(View v, MotionEvent event) {
    synchronized (this) {
        if (!_isPaused) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                _touchedX               = event.getX();
            } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                float touchedX          = event.getX();
                float dx                = Math.abs(_touchedX - touchedX);
                _dxLowPassed            = lowPass(dx, _dxLowPassed);

                switch (_screenUsage) {
                    case HALF_SCREEN:
                        if (touchedX < _width / 2) {
                            if(touchedX < _touchedX) {
                                _zAngle                 = (2 * _dxLowPassed / _width) * TOUCH_SENSITIVITY * ANGLE_SPAN;
                                _zAngleLowPassed        = lowPass(_zAngle, _zAngleLowPassed);
                                GLES20Renderer._zAngle  = GLES20Renderer._zAngle + _zAngleLowPassed;
                            }
                        } else {
                            if( touchedX > _touchedX ) {
                                _zAngle                 = (2 * _dxLowPassed / _width) * TOUCH_SENSITIVITY * ANGLE_SPAN;
                                _zAngleLowPassed        = lowPass(_zAngle, _zAngleLowPassed);
                                GLES20Renderer._zAngle  = GLES20Renderer._zAngle - _zAngleLowPassed;
                            }
                        }
                        Log.d("TOUCH", new Float(_zAngleLowPassed).toString());
                    break;