2012-08-05 55 views
0

好的,這裏是代碼。我想要它做什麼翻譯屏幕跟隨對象l2rArrow。它的確如此,但l2rArrow仍然飛過了屏幕。即使我將翻譯設置爲l2rArrow的x,y,當它應該保持死點時,l2rArrow仍然最終會從屏幕上移開。OPENGL ES glTranslatef問題

當我將camX乘以25時,它似乎跟隨它略微更好,但只是略微。箭頭仍然飛離屏幕。

public void Render(GL10 gl, float deltaTime) { 

    //Log.d("Game", "Render"); 
    gl.glViewport(0, 0, Screen.SCREEN_WIDTH, Screen.SCREEN_HEIGHT); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthof(0, Screen.WIDTH_SCALE, 0, Screen.HEIGHT_SCALE, 1, -1); 


    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    gl.glEnable(GL10.GL_BLEND); 
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); 


    gl.glEnable(GL10.GL_TEXTURE_2D); 
    MeshRect mRect; // this holds all of our rectangles 



    // draw the sky/backdrop************************************************************ 
    texture.bind(gl, Texture.TEXTURE_SKY1); 
    mRect = new MeshRect(Sky.getMyRect()); 
    mRect.Draw(GL10.GL_TRIANGLES, gl); 

    //draw clouds*********************************************************************** 
    clouds.Update(); 
    Vector<Cloud> vClouds = clouds.getClouds(); 
    for (int i = 0; i < vClouds.size(); i++){ 
     vClouds.get(i).Update(deltaTime); 

     texture.bind(gl, Texture.TEXTURE_CLOUDS1); 
     mRect = new MeshRect(vClouds.get(i).getMyRect()); 
     mRect.Draw(GL10.GL_TRIANGLES, gl); 

     if (vClouds.get(i).hasRunCourse()){ 
      clouds.RemoveCloud(vClouds.get(i).getID()); 
     } 
    } 
    // draw arrows and applied power ups*********************************************************************** 
    boolean hasTranslated = false; 
    if (!l2rArrow.isFired) { 
     gl.glPushMatrix(); //save our state 

      gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0 
      gl.glRotatef(LBow.getAngle(), 0f, 0f, 1f); //rotate 
      gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f); // translate to where we want to draw it 

      texture.bind(gl, Texture.TEXTURE_L2RARROW); 
      mRect = new MeshRect(l2rArrow.getMyRect()); 
      mRect.Draw(GL10.GL_TRIANGLES, gl); 

     gl.glPopMatrix(); //return to saved state 

    } else { 
     l2rArrow.Update(deltaTime); 
     texture.bind(gl, Texture.TEXTURE_L2RARROW); 
     mRect = new MeshRect(l2rArrow.getMyRect()); 
     mRect.Draw(GL10.GL_TRIANGLES, gl); 



     hasTranslated = true; 
     gl.glPushMatrix(); 
      float camX = (float) ((l2rArrow.startX - l2rArrow.PosX)); 
      camX = camX * 25; 
      float camY = (float) ((l2rArrow.startY - l2rArrow.PosY)); 
      if (camY > 0) { camY = 0;} 

      gl.glTranslatef(camX, camY,0f); 


     if (l2rArrow.hasCollided) { 
      //run collision code for detecting a hit and ending turn 
     } 
    } 
    /**======================================================================================================= 
    * Everything between here should be effected by translate | | gl.gltranslatef(x,y,z) x = Xoffset 
    *=======================================================================================================*/ 


    /**======================================================================================================= 
    * gl.glPopMatrix(); back to origin 
    *=======================================================================================================*/ 

    if (hasTranslated){ 
     gl.glPopMatrix(); 
    } 

    //finish drawing other non translated 

} 

回答

0

這是我的操作順序,看起來像這樣

boolean hasTranslated = false; 
    if (!l2rArrow.isFired) { 
     gl.glPushMatrix(); //save our state 

      gl.glTranslatef(l2rArrow.GetToOriginX, l2rArrow.GetToOriginY, 0f); // translate to origin 0,0,0 
      gl.glRotatef(LBow.getAngle(), 0f, 0f, 1f); //rotate 
      gl.glTranslatef(-l2rArrow.GetToOriginX, -l2rArrow.GetToOriginY, 0f); // translate to where we want to draw it 

      texture.bind(gl, Texture.TEXTURE_L2RARROW); 
      mRect = new MeshRect(l2rArrow.getMyRect()); 
      mRect.Draw(GL10.GL_TRIANGLES, gl); 

     gl.glPopMatrix(); //return to saved state 

    } else { 
     l2rArrow.Update(deltaTime); 

     hasTranslated = true; 
     gl.glPushMatrix(); 
     gl.glLoadIdentity(); 
      float camX = (float) ((l2rArrow.startX - l2rArrow.PosX)); 
      //Log.d("cam X =" + Float.toString(camX),"Y="); 
      float camY = (float) ((l2rArrow.startY - l2rArrow.PosY)); 
      if (camY > 0) { camY = 0;} 
      if (camX < -4800) { camX = -4800;} 

      gl.glTranslatef(camX, camY,0f); 

      texture.bind(gl, Texture.TEXTURE_L2RARROW); 
      mRect = new MeshRect(l2rArrow.getMyRect()); 
      //Log.d("arrow X =" + Float.toString(l2rArrow.getMyRect().BottomLeftCorner.x),"Y="); 
      mRect.Draw(GL10.GL_TRIANGLES, gl); 


     if (l2rArrow.hasCollided) { 
      //run collision code for detecting a hit and ending turn 
     } 
    } 
1

我沒有看到​​爲GL_MODELVIEW。你確定你是從身份矩陣開始模型視圖嗎?否則,翻譯將與前一幀保持連接。我也看不到gl.glMatrixMode調用切換到GL_MODELVIEW,在這種情況下,所有矩陣變換都將進入投影矩陣。

+0

OK,所以我要來結束它有一些東西需要與那些需要的,正要研究更進了。兩者有什麼區別?爲什麼我應該打電話給另一個呢? – WIllJBD 2012-08-05 04:49:35

+1

我建議你閱讀下面的內容:http://www.songho.ca/opengl/gl_transform.html – 2012-08-05 04:54:09

+0

好吧,我閱讀它,我試圖看看這是否是我的問題,它似乎不是。我更新了問題和代碼。 – WIllJBD 2012-08-05 05:40:47