4

私は現在、JOGLでゲームを作成する必要がある割り当てに取り組んでいます。それはかなりうまくいっていますが、問題が発生しました。

ゲーム内でESCを押してアクセスできるメニュー機能を作成したいのですが、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の表示機能で定義されます

私はかなり困惑していて、これをどのように修正するのかわかりません。

長い投稿で申し訳ありませんが、誰かが私を助けてくれたら本当にありがたいです。

4

1 に答える 1

0

gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT ); OptionsMenu の表示メソッドの先頭に、クリア カラー バッファを配置する必要があると思います。

上記の投稿されたコードの例について、いくつかのアドバイスがあります。

  • のスコープを変更します。これは、 opengl ディスプレイ コールバック メソッドが呼び出されるたびに割り当てられるGLU glu = new GLU();ためです。glu
  • またgl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);、if ステートメントの直前に移動し、すべてのオブジェクトの表示メソッド (例: OptionsMenu.display()) を使用しないでください。シングルにしてみてください。
  • TextureIO を使用してテクスチャをアップロードします。可能であれば一度だけアップロードしてから、表示方法でそのテクスチャを使用します。テクスチャの読み込みプロセスには大きなオーバーヘッドがあります。
于 2015-02-11T12:34:38.470 に答える