Обработка событий пользовательского интерфейса с помощью mGLSurfaceView - PullRequest
2 голосов
/ 17 ноября 2010

Руководство довольно расплывчато даже для обычных представлений и даже не упоминает mGLSurfaceView на странице обзора событий пользовательского интерфейса.

Для начала, все примеры не будут работать, потому что они полагаются на Id для представления (например, Button button = (Button)findViewById(R.id.corky);). Я неудачно пытаюсь отправлять события пользовательского интерфейса туда и обратно. Я использовал решение для дробовика и прикрепил каждое входное событие из mGLSurfaceView к Activity ... Но я жажду чего-то лучшего.

Итак, кто-нибудь достаточно смелый, чтобы наколдовать простой пример с Activity, mGLSurfaceView и мероприятием onTouch, говоря, где был щелчок относительно размера экрана? (например, w = 50%, h = 50% для идеального щелчка по центру экрана)


public class GlClick extends Activity implements OnTouchListener {
    @Override
    public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
        mGLSurfaceView = new GLSurfaceView(this);
        mGLSurfaceView.setRenderer(new GlRenderer());
        setContentView(mGLSurfaceView);
        mGLSurfaceView.setOnTouchListener(this);
    }
    public boolean onTouch(View v, MotionEvent event) {
        Log.d(TAG, "example output: click was on 234x211 for a 800x600 screen.")
    }
}

class GlRenderer implements Renderer {
    // here be lots of messy beginner GL code ...
    // ... you'd have wished for dragons.
    public void onSurfaceChanged(GL10 gl, int w, int h) {
        screenWidth = w;
        screenHeight = h;
        //TODO: send that to the activity
    }
}

1 Ответ

1 голос
/ 17 ноября 2010

Я работаю над приложением ogl на android

Я не использую какой-либо сенсорный слушатель или что-либо заранее сделанное, потому что рано или поздно вы теряете время, пытаясь понять, как сделать что-то. Lol

то, что я нашел, чтобы работать хорошо, это просто

@Override
    public boolean onTouchEvent(MotionEvent event) {
        if(sr != null){
            /*if(event.getAction() == MotionEvent.ACTION_DOWN){
            }else if(event.getAction() == MotionEvent.ACTION_MOVE){
            }else if(event.getAction() == MotionEvent.ACTION_CANCEL){
            }else if(event.getAction() == MotionEvent.ACTION_UP){*/
            GameHandler.onTouchEvent(event);
            //}
        }
        return true;
    }

, и в GameHandler я сначала преобразовываю касание из экранных координат в координаты glworld.

в моих элементах пользовательского интерфейса, которые у меня естьположение и размер, и я добавляю метод "touch (...)" или "isTouched ()"

, по моим наблюдениям, это работает довольно хорошо, и я рекомендую вам попробовать его ^^

редактировать преобразование касанием

public static void convertTouchToWorldRef(Vect vect){
        vect.y = (SceneRenderer.Height-vect.y)/SceneRenderer.Height*SceneRenderer.GAME_DIMENSION_H;
        vect.x = (vect.x)/SceneRenderer.Width*SceneRenderer.GAME_DIMENSION_W;
    }
;

вам нужно на y, чтобы сделать высоту-y (у ogl и у андроида разное расположение источника)

GAME_DIMENSION_ * - размер мира oglплоскость проекции (800 * 600).

затем ее основные математические (я не помню английское название), но ее формула thales x1 / X1 = x2 / X2.

Редактировать: Вектор

public class Vector{
private float x = 0;
private float y = 0;
public Vector(float x, float y){
    this.x = x;
    this.y = y;
}
//add accessors get/set
...
}

Вы можете просматривать Интернет для лучших примеров, таких как http://www.gamedev.net/community/forums/topic.asp?topic_id=302771

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