2012-12-08 5 views
4

Я сейчас работаю над заданием, когда мне нужно, чтобы создать игру в JOGL, это будет очень хорошо, но я столкнулся с проблемой:Показать изображение в JOGL

Я хочу создать функцию меню к которому можно получить доступ, нажав ESC ingame, когда ESC нажата, функция отображения должна прекратить отображать игру и начать отображать меню. Меню состоит из фонового изображения с некоторым наложением текста.

Это, как я пытался реализовать функцию меню, но мне не удалось дать ему показать что-нибудь еще, чем ясный цвет:

public class OptionsMenu 
{ 
    public void display(GL gl) { 

     gl.glMatrixMode(GL.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glOrtho(0, 300, 300, 0, 0, 1); 
     gl.glMatrixMode(GL.GL_MODELVIEW); 
     gl.glDisable(GL.GL_DEPTH_TEST); 
     gl.glClearColor(1f, 0.5f, 0.5f, 0.5f); 
     gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
     gl.glBlendFunc (GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); 
     gl.glEnable (GL.GL_BLEND); 
     BufferedImage bufferedImage = null; 
     int w = 0; 
     int h = 0; 
     try { 
      bufferedImage = ImageIO.read(OptionsMenu.class.getResource("menuBackground.jpg")); //The menu background 
      w = ceilingPow2(bufferedImage.getWidth()); 
      h = ceilingPow2(bufferedImage.getHeight()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     WritableRaster raster = 
       Raster.createInterleavedRaster (DataBuffer.TYPE_BYTE, 
         w, 
         h, 
         4, 
         null); 
     ComponentColorModel colorModel= 
       new ComponentColorModel (ColorSpace.getInstance(ColorSpace.CS_sRGB), 
         new int[] {8,8,8,8}, 
         true, 
         false, 
         ComponentColorModel.TRANSLUCENT, 
         DataBuffer.TYPE_BYTE); 
     BufferedImage img = 
       new BufferedImage (colorModel, 
         raster, 
         false, 
         null); 

     Graphics2D g = img.createGraphics(); 
     g.drawImage(bufferedImage, null, null); 

     DataBufferByte imgBuf = 
       (DataBufferByte)raster.getDataBuffer(); 
     byte[] imgRGBA = imgBuf.getData(); 
     ByteBuffer bb = ByteBuffer.wrap(imgRGBA); 
     bb.position(0); 
     bb.mark(); 

     gl.glBindTexture(GL.GL_TEXTURE_2D, 13); 
     gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); 
     gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); 
     gl.glTexEnvf(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE); 
     gl.glTexImage2D (GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, w, h, 0, GL.GL_RGBA, 
       GL.GL_UNSIGNED_BYTE, bb); 

     gl.glEnable(GL.GL_TEXTURE_2D); 
     gl.glBindTexture (GL.GL_TEXTURE_2D, 13); 
     gl.glBegin (GL.GL_POLYGON); 
     gl.glTexCoord2d (0, 0); 
     gl.glVertex2d (0, 0); 
     gl.glTexCoord2d(1,0); 
     gl.glVertex2d (w, 0); 
     gl.glTexCoord2d(1,1); 
     gl.glVertex2d (w, h); 
     gl.glTexCoord2d(0,1); 
     gl.glVertex2d (0, h); 
     gl.glEnd();  
     gl.glFlush(); 
    } 
    private static int ceilingPow2(int n) { 
     int pow2 = 1; 
     while (n > pow2) { 
      pow2 = pow2<<1; 
     } 
     return pow2; 
    } 
} 

Этот код основан этого урока: http://wiki.tankaar.com/index.php?title=Displaying_an_Image_in_JOGL_(Part_1)

Я звоню на OptionsMenu так:

public void display(GLAutoDrawable drawable) 
    { 
     GL gl = drawable.getGL(); 
     GLU glu = new GLU(); 

     if(state.equals("optionsMenu")) 
     { 
      if(menu == null) 
       menu = new OptionsMenu; 

      menu.display(gl); 
     } 
     else 
     { 
      // Calculating time since last frame. 
      Calendar now = Calendar.getInstance();  
      long currentTime = now.getTimeInMillis(); 
      int deltaTime = (int)(currentTime - previousTime); 
      previousTime = currentTime; 

      // Update any movement since last frame. 
      updateMovement(deltaTime); 
      updateCamera(); 

      gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
      gl.glLoadIdentity(); 
      glu.gluLookAt(camera.getLocationX(), camera.getLocationY(), camera.getLocationZ(), 
        camera.getVrpX(), camera.getVrpY(), camera.getVrpZ(), 
        camera.getVuvX(), camera.getVuvY(), camera.getVuvZ()); 

      // Display all the visible objects of MazeRunner. 
      for(Iterator<VisibleObject> it = visibleObjects.iterator(); it.hasNext();) { 
       it.next().display(gl); 
      } 

      gl.glLoadIdentity(); 
      gl.glFlush(); 
     } 
    } 

он не бросает какие-либо ошибки, он просто не будет отображать изображение. Однако он показывает четкий цвет gl.glClearColor (1f, 0.5f, 0.5f, 0.5f); определенная в функции дисплея OptionsMenu

Я довольно сильно озадачен, и я понятия не имею, как я это исправлю.

Извините за длинный пост, но я буду ДЕЙСТВИТЕЛЬНО благодарен, если кто-то мне поможет.

+0

еще нужна помощь? – elect

ответ

0

Я предполагаю, что цветные буферы gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); должны быть размещены в начале метода отображения OptionsMenu.

У меня есть несколько советов, например разместил код выше:

  • Изменить сферу GLU glu = new GLU();, потому что glu назначается каждый раз, когда дисплей OpenGL метод обратного вызова называется.
  • Также переместите команду gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); непосредственно перед тем, и не используйте метод отображения всех объектов (например, OptionsMenu.display()). Попытайтесь сохранить его в силе.
  • Используйте TextureIO для загрузки текстуры, и если его можно просто загрузить его один раз, то используйте эту текстуру в вашем методе отображения. Процесс загрузки текстур имеет большие накладные расходы.
Смежные вопросы