2012-05-14 50 views
0

我的應用程序是用android上的openGL ES 2.0製作的,我的對象位置更新有一個相當嚴重的問題。我的遊戲循環是這樣的,繪製所有對象 - >更新遊戲對象位置 - >迭代。然而,我有兩種不同類型的頭寸更新:一種是基於計算的,當價值低或足夠高時,它會改變方向。另一種是基於觸摸的,當用戶觸摸任何位置和/或輕掃屏幕時,對象將隨之而來。Android openGL es 2.0觸摸和對象位置bug ...無能

現在來解決問題。當用戶觸摸屏幕和/或輕掃時,應該只響應觸摸的對象也獲得基於計算的對象的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的新位置的代碼。

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這樣的IM加入這個反而更清晰:)時會發生什麼

(當立方體1獲得觸摸輸入和立方體2會從updateObjectCoords座標): 應用程序啓動: 一切按預期工作,多維數據集2(updateObjectCoords之一)按預期方式移動。 用戶觸摸屏幕: 立方體2繼續移動,因爲它的假想立方體1(觸摸控制)座標數據似乎與立方體2混合,因爲它的移動看起來像是立方體2的兩倍一樣大,仍然可以操縱它但它不是很響應。

(CUBE2由是靜態的,但是updateObjectCoords依然活躍,被稱爲每一幀更新_test_x和_test_y的值): 應用程序啓動: 一切都只是預期 用戶觸摸屏幕: 一切完美的作品

所以它似乎是具體不斷地重新定位cube2干擾cube1的定位。

希望這個事情更加明確! :)

爲什麼要繪製一個對象的座標影響所有其他translateM的?所有其他物體如何不受觸摸座標影響?

+0

我不熟悉OpenGL ES 2。0,但我知道在舊版本的OpenGL中,在將模型轉換應用於它之前,您必須保存當前的View Matrix(將其推入堆棧)。將其推入堆棧後,應用模型轉換,然後繪製模型。完成後,將矩陣從堆疊中彈出。重複每個對象。令人討厭,但作爲國家機器是OpenGL .. – dcow

+0

感謝ALOT的評論,真的很高興得到一些迴應:)我不會假裝我確切地知道你指的是什麼,但問題似乎是像你說的東西仍然似乎在任何翻譯工作中都很活躍。目前正在研究如何採取一攬子措施,該堆棧是什麼,以及它是否可以幫助我的案例。非常感謝方向伴侶! :) – user1295313

+0

我現在看了一些不同的Android的OpenGL ES 2.0教程爲Android。每個人似乎都在和我一起畫畫。沒有看到任何刪除堆棧或類似的東西。此外,我現在試圖使不同的對象與計算方法去不同的地方,一切都很完美。唯一的問題是觸摸,就像我之前提到的那樣,觸摸控制物體會變得彈道。它必須是觸摸實現本身的東西,因爲一切都很完美,直到你觸摸屏幕。使用靜態對象時,觸摸工作正常。這是非常奇怪的:( – user1295313

回答

0

我解決了這個問題,只需將立方體1的圖形與立方體2切換即可。這似乎解決了一切。假設最後繪製觸摸控制對象將結束干涉:D

+0

Bah!它沒有解決:(經過一些額外的擺弄我仍然有這個問題 – user1295313