сенсорное взаимодействие в openGLES - PullRequest
1 голос
/ 19 ноября 2011

Я изучал Nim Game на Android.Игроки собираются брать предметы из кучи.Я использую openGLES для рисования объектов и куч.Где я застрял, это как "взять".Как показывают примеры, приведенные в официальном руководстве разработчика , я могу переопределить метод onTouchEvent в классе extends GLSurfaceView для взаимодействия.Тем не менее, как я мог сказать, где объекты были нарисованы?Или есть какие-то объекты в координатах, где я касаюсь?
Есть идеи?Спасибо заранее!

Ответы [ 2 ]

1 голос
/ 03 августа 2012
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;
1 голос
/ 23 ноября 2011

Если я правильно понимаю ваш вопрос, похоже, что вы хотите сделать простое обнаружение столкновений, чтобы увидеть, находится ли ваша точка касания внутри одного из объектов в куче. Вы можете сделать это с помощью некоторой базовой математики между координатами точки касания и координатами центра, которые вы использовали для рисования объекта.

Например, если предположить, что ваши объекты являются прямоугольниками, это будет общей идеей:

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 для любого из них, то вы знаете, что ваша точка касания находится внутри этого объекта и можете продолжать вызывать все, что вам нужно для вызова.

Имейте в виду, что координаты касания, которые система дает вам, будут координатами экрана, поэтому вы должны учитывать любые расхождения между системой координат экрана и системой координат, которую вы определили с помощью усеченного вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...