2012-05-14 4 views
0

Мое приложение сделано с openGL ES 2.0 на Android, и у меня есть довольно серьезная проблема с обновлением положения объекта. Мой игровой цикл похож на это: нарисуйте все объекты -> обновите позиции игрового объекта -> итерации. Тем не менее, у меня есть 2 разных типа обновлений положения: один вид, который основан на расчете, что, когда значение низкое или достаточно высокое, оно изменит направление. Другой тип - сенсорный, когда пользователь прикасается к любой позиции и/или просматривает экран, объект будет следовать.Android openGL es 2.0 ошибка касания объекта и объекта ... clueless

Теперь проблема. Когда пользователь касается экрана и/или проверок, объекты, которые должны только реагировать на касание, также получают изменение значения x для объектов, основанных на вычислении, и я не знаю, почему это происходит, поскольку они используют совершенно разные переменные позиции ,

код, который следует здесь отрывок из GLsurfaceView, показывающий, как сенсорные значения позиции передаются в GL рендерер

public boolean onTouchEvent(MotionEvent e){ 
    if(e != null){ 
     if(e.getAction() == MotionEvent.ACTION_DOWN){ 
      x = e.getX(); 
      y = e.getY(); 
      if(_renderer != null){ 
       queueEvent(new Runnable(){ 

        @Override 
        public void run() { 

         _renderer.touchInput(x, y); 
        } 

       }); 
       return true; 
      } 
     } 
     if(e.getAction() == MotionEvent.ACTION_MOVE){ 
      x = e.getX(); 
      y = e.getY(); 
      if(_renderer != null){ 
       queueEvent(new Runnable(){ 

        @Override 
        public void run() { 

         _renderer.touchInput(x, y); 

        } 

       }); 


      } 

     } 

код, который следует здесь отрывок из GL рендерер, который показывает, как сенсорные значения входят в средство визуализации и преобразуются в мировые координаты.

public void touchInput(float x, float y){ 
    y = (float)_view[3] - y; 
    GLU.gluUnProject(x, y, -1.5f, _ModelMatrix, 0, _ProjectionMatrix, 0, _view, 0, touch_to_world_coords, 0); 

    _world_x = touch_to_world_coords[0] * touch_to_world_coords[3]; 
    _world_y = touch_to_world_coords[1] * touch_to_world_coords[3]; 
} 

Далее приведен код, который вычисляет новое положение без сенсорного объекта

public void updateObjectCoords(){ 
    _test_x += 0.05f; 
      _test_y += 0.05f; 
} 

и, наконец, onDrawFrame из визуализатора, который IM с использованием в качестве игрового цикла.

public void onDrawFrame(GL10 glContext) { 
    //Tell OpenGL to use this program when rendering. 
    GLES20.glUseProgram(_current_shaderProgramHandle); 

    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

    //Sets the active texture unit to texture unit 0 
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0); 
    //Bind the texture to current unit 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, _TextureDataHandle); 

    //Tells texture uniform sampler to use this texture in the shader by binding it to unit 0 
    GLES20.glUniform1i(_TextureUniformHandle, 0); 

    //Draw square, gets coordinates from gluUnproject method 
    Matrix.setIdentityM(_ModelMatrix, 0); 
    Matrix.translateM(_ModelMatrix, 0, _world_x, _world_y, -1.0f); 
    drawSquare(); 

    //Draw square, gets coordinates from updateObjectCoords method 
    Matrix.setIdentityM(_ModelMatrix, 0); 
    Matrix.translateM(_ModelMatrix, 0, _test_x, _test_y, -1.0f); 
    drawSquare(); 


    //GLES20.glUseProgram(_point_shaderProgramHandle); 
    //drawLight(); 
    updateObjectCoords(); 

} 

редактировать: заметили мои плохие explenations так им, добавив это вместо того, чтобы быть более ясно, что происходит, когда :)

(Когда кубик 1 получает сенсорный ввод и кубик 2 получает координаты из updateObjectCoords): запускается приложение : все работает так, как ожидалось, куб 2 (updateObjectCoords one) перемещается так, как ожидалось. Пользователь прикасается к экрану: cube2 продолжает двигаться, поскольку его предполагается, что данные координат cube1 (touch control), похоже, смешиваются с кубом2, поскольку его движения становятся кажущимися в два раза большими и в направлении того же направления, что и куб2, вы все равно можете манипулировать им но он не очень отвечает.

(cube2 сделан статичным, однако updateObjectCoords все еще активны и вызывается на каждом кадре, чтобы обновить значение _test_x и _test_y): начинается Применение: все так же, как ожидается, Пользователь касается экрана: все отлично работает

Так что, похоже, что это постоянное перемещение куба2, мешающего позиционированию куба1.

надеюсь, что это сделали вопросы более понятными! :)

Почему координаты одного объекта, которые будут нарисованы, влияют на все другие переводы translateM? Как все остальные объекты не срабатывают при помощи сенсорных координат?

+0

Я не так хорошо знаком с OpenGL ES 2.0, но я знаю, что в старых версиях OpenGL вы должны сохранить текущую матрицу просмотра (нажать ее в стек), прежде чем применять к ней преобразования модели. После того, как вы нажмете его в стек, примените ваши преобразования модели, затем нарисуйте модель. Как только вы закончите, вытащите матрицу из стека. Повторите для КАЖДОГО объекта. Раздражающий, но как и State Machine, который является OpenGL .. – dcow

+0

Спасибо ALOT за комментарий, очень приятно получить какой-то ответ :) Я не притворяюсь, что знаю точно, что вы имеете в виду, однако проблема кажется такой, как вы говорите, что что-то еще похоже, активен в любом деле translateM. В настоящее время вы смотрите, как взять что-то «со стека», что такое этот стек, и если это может помочь моему делу. Большое спасибо за товарища по направлению! :) – user1295313

+0

Теперь я посмотрел на несколько различных обучающих программ для Android openGL es 2.0 для Android. Кажется, все делают рисунок так, как я. Havent видел любое удаление из стеков или еще такое. Кроме того, теперь я попытался сделать разные объекты в разных местах с помощью метода расчета, и все работает отлично. Единственная проблема заключается в том, что при касании, как я уже упоминал ранее, объекты с сенсорным управлением идут баллистически. это должно быть что-то с самой реализацией касания, поскольку все работает отлично, пока вы не коснетесь экрана. Со статическими объектами прикоснитесь к тонкой работе. Это так странно :( – user1295313

ответ

0

Я исправил это, просто переключив чертеж куба1 на куб2. Кажется, это все решило. Предполагая, что нанесение объектов, управляемых касанием, в конце концов прекратит помехи: D

+0

Bah! его не решили :(после некоторого дополнительного возиться вокруг у меня все еще есть проблемы с этим – user1295313