2012-05-14 42 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