JOGL: Fensterinhalt verschwindet sofort wieder

1337iceskater

Aktives Mitglied
Hallo Leute,

gleich vorab möchte ich mich als absoluter Neuling in Puncto JOGL outen. Mein Problem ist, dass ich ein statisches Fenster habe, auf dem ein Mensch ärgere dich nicht-Feld abgebildet ist. Das sieht man auch, zumindest ganz kurz. Danach verschwindet es sofort und ich habe ein graues JFrame.

Das seltsame daran ist, dass wenn ich die App oft genug minimiere und wiederherstelle, bleibt das Spielfeld irgendwann auch dauerhaft da, allerdings auch wieder nur, bis ich es wieder minimiere oder die Größe des Fensters verändere.

Hat jemand ne Idee woran es liegen könnte?
Ich denke übrigens nicht, dass es am Code liegt, da ich den von nem Kollegen 1zu1 kopiert habe und es bei ihm total toll läuft...

Ich hoffe ihr könnt mir helfen.

LG Stefan
 
Also bei mir sieht das ganze so aus (wie gesagt: ich habe das Projekt 1 zu 1 von nem Kollegen übernommen und weiß nicht wirklich was der da gemacht hat 😉:

Beispielszene.java:

Java:
package BeispielTexturen;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;
import net.java.games.jogl.*;

/**
 * @author Melanie Klein & Stefan Jouaux
 */

public class Beispielszene extends JFrame
{
    
	private static final long serialVersionUID = 1L;

	public Beispielszene()
    {
       GLCapabilities glcaps = new GLCapabilities();
       GLCanvas canvas = GLDrawableFactory.getFactory().createGLCanvas(glcaps);
       
       BeispielszeneView view = new BeispielszeneView();
       canvas.addGLEventListener(view);

       
       setSize(500,500);
       setTitle("CAV-Projekt: JOGL - Beispielszene");
       
       setResizable(true);
       
       getContentPane().add(canvas,BorderLayout.CENTER);
       centerWindow(this);
       
       addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
               System.exit(0);
            }
        }

        );
    }
    
    public void centerWindow(Component frame) 
    {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = frame.getSize();
        
        if (frameSize.width > screenSize.width )
            frameSize.width = screenSize.width;
        
        if (frameSize.height > screenSize.height)
            frameSize.height = screenSize.height;
        
        frame.setLocation(
                (screenSize.width - frameSize.width ) >> 1,
                (screenSize.height - frameSize.height) >> 1
        );
    }  
    
    public static void main(String[] args)
    {
        final Beispielszene app=new Beispielszene();       
      
        SwingUtilities.invokeLater(
                new Runnable()
                {
                 public void run()
                 {
                     app.setVisible(true);
                    
                 }
                }        
        );       
    }
}

BeispielszeneView:
Java:
package BeispielTexturen;
import java.awt.image.BufferedImage;

import net.java.games.jogl.*;


/**
 * @author Melanie Klein & Stefan Jouaux
 */

public class BeispielszeneView implements GLEventListener
{

    /*
     * (non-Javadoc)
     * 
     * @see net.java.games.jogl.GLEventListener#init(net.java.games.jogl.GLDrawable)
     */
    public void init(GLDrawable arg0)
    {
        GL gl = arg0.getGL();
        GLU glu = arg0.getGLU();

        setCamera(gl, glu);
        setLight(gl);
        defineTexture(gl,glu);

        gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        gl.glMatrixMode(GL.GL_MODELVIEW);       

    }

    /**
     * @param gl
     */
    private void setCamera(GL gl, GLU glu)
    {
        int w = 500, h = 500;

        gl.glViewport(0, 0, w, h);

        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();

        glu.gluPerspective(50.0, 1, 2.0, 40.0);
    }

    /*
     * (non-Javadoc)
     * 
     * @see net.java.games.jogl.GLEventListener#display(net.java.games.jogl.GLDrawable)
     */
    public void display(GLDrawable arg0)
    {
        GL gl = arg0.getGL();
        GLU glu = arg0.getGLU();

        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();
        
        glu.gluLookAt(0,12, 19,
                	  0, 0, 0, 
                	  0, 1, 0);

        gl.glTranslated(0, 1, 0);       
       
        drawField(gl, glu);        
     
        setMaterial(gl,0);
        drawFigure(gl,glu,0,0); 
        setMaterial(gl,1);
        drawFigure(gl,glu,-4,2);
        setMaterial(gl,2);
        drawFigure(gl,glu,3,-5);
        setMaterial(gl,3);
        drawFigure(gl,glu,3,2); 
    }
    /*
     * (non-Javadoc)
     * 
     * @see net.java.games.jogl.GLEventListener#reshape(net.java.games.jogl.GLDrawable,
     *      int, int, int, int)
     */
    public void reshape(GLDrawable arg0, int arg1, int arg2, int arg3, int arg4)
    {
//    	display(arg0);
    }

    /*
     * (non-Javadoc)
     * 
     * @see net.java.games.jogl.GLEventListener#displayChanged(net.java.games.jogl.GLDrawable,
     *      boolean, boolean)
     */
    public void displayChanged(GLDrawable arg0, boolean arg1, boolean arg2)
    {
//    	display(arg0);
    }

    public void drawField(GL gl, GLU glu)
    {
        gl.glEnable(GL.GL_TEXTURE_2D);
        gl.glBindTexture(GL.GL_TEXTURE_2D, texture);       

        gl.glBegin(GL.GL_QUADS);
	        gl.glTexCoord2f(0f,0f);
	        gl.glVertex3f(-6.5f, -1.5f, -6.5f);
	        
	        gl.glTexCoord2f(1f,0f);
	        gl.glVertex3f(-6.5f, -1.5f, 6.5f);
	        
	        gl.glTexCoord2f(1f,1f);
	        gl.glVertex3f(6.5f, -1.5f, 6.5f);
	        
	        gl.glTexCoord2f(0f,1f);
	        gl.glVertex3f(6.5f, -1.5f, -6.5f);
        gl.glEnd();
        
        gl.glDisable(GL.GL_TEXTURE_2D);
    }
    
    int slices=30;
    int stacks=30;
    
    public void drawFigure(GL gl, GLU glu, float x,float z)
    { 
        gl.glPushMatrix();
        gl.glTranslated(x, 0, z);
        GLUquadric qobj = glu.gluNewQuadric();
        glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
        glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
        glu.gluSphere(qobj, .36f, slices, stacks);

        gl.glRotated(90, 1, 0, 0);
        glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
        glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
        glu.gluCylinder(qobj, .1, .4, 1.2, 30, 30);

        gl.glTranslated(0, 0, 1.2f); 
        glu.gluQuadricDrawStyle(qobj, GLU.GLU_FILL);
        glu.gluQuadricNormals(qobj, GLU.GLU_SMOOTH);
        glu.gluCylinder(qobj, .4, .4, .2, 30, 30);
        gl.glPopMatrix();
    }
    
    private void setLight(GL gl)
    {
        float light_pos[] = { 0, 2f, 5, 0f };
        float light_color_am[] = { 1, 1, 1, 1 };
        float light_color_diff[] = { 1, 1, 1, 1 };
        float light_color_spec[] = { 1f, 1, 1, 1 };

        gl.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_pos);
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, light_color_am);
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, light_color_diff);
        gl.glLightfv(GL.GL_LIGHT0, GL.GL_SPECULAR, light_color_spec);

        gl.glEnable(GL.GL_LIGHTING);
        gl.glEnable(GL.GL_LIGHT0);
        gl.glEnable(GL.GL_DEPTH_TEST);
        gl.glEnable(GL.GL_SMOOTH);
    }
    
    private void setMaterial(GL gl, int i)
    {
        if(i==0)
        {
        float mat_ambient[] = { 0.2f, 0f, 0f, 1.0f };
        float mat_diffuse[] = { 0.7f, 0f, 0, 1.0f };
        float mat_specular[] = { 0.50f, 0.50f, 0.50f, 1.0f };
        float mat_shininess = 32f;

        gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT, mat_ambient);
        gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_DIFFUSE, mat_diffuse);
        gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_SPECULAR, mat_specular);
        gl.glMaterialf(GL.GL_FRONT_AND_BACK, GL.GL_SHININESS,mat_shininess);
        }
        
        if(i==1)
        {
            float mat_ambient[] = { .2f, 0f, 0f, 1.0f };
            float mat_diffuse[] = { 1f, 1f, 0.5f, 1.0f };
            float mat_specular[] = { 0.5f, 0.5f, 0.5f, 1.0f };
            float mat_shininess = 32f;

            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT, mat_ambient);
            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_DIFFUSE, mat_diffuse);
            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_SPECULAR, mat_specular);
            gl.glMaterialf(GL.GL_FRONT_AND_BACK, GL.GL_SHININESS,mat_shininess);

        }
        
        if(i==2)
        {
            float mat_ambient[] = { 0.2f, 0f, 0f, 1.0f };
            float mat_diffuse[] = { 0.25f, 1f, .0f, 1.0f };
            float mat_specular[] = { 0.50f, 0.50f, 0.50f, 1.0f };
            float mat_shininess = 32f;

            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT, mat_ambient);
            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_DIFFUSE, mat_diffuse);
            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_SPECULAR, mat_specular);
            gl.glMaterialf(GL.GL_FRONT_AND_BACK, GL.GL_SHININESS,mat_shininess);
        }
        
        if(i==3)
        {
            float mat_ambient[] = { .1f, .1f, .1f, 1.0f };
            float mat_diffuse[] = { 0f, 0f, .7f, 1.0f };
            float mat_specular[] = { 0.50f, 0.50f, 0.50f, 1.0f };
            float mat_shininess = 32f;

            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_AMBIENT, mat_ambient);
            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_DIFFUSE, mat_diffuse);
            gl.glMaterialfv(GL.GL_FRONT_AND_BACK, GL.GL_SPECULAR, mat_specular);
            gl.glMaterialf(GL.GL_FRONT_AND_BACK, GL.GL_SHININESS,mat_shininess);
        }        
       
    }
    
    private int texture;
    public void defineTexture(GL gl,GLU glu)
    {      
      gl.glShadeModel(GL.GL_SMOOTH);              // Enable Smooth Shading
      
      gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);	// Really Nice Perspective Calculations
      texture = TextureGenerator.genTexture(gl);
      gl.glBindTexture(GL.GL_TEXTURE_2D,texture);
      BufferedImage img = TextureGenerator.readPNGImage("spielfeld2.png");
      TextureGenerator.makeRGBTexture(gl, glu, img, GL.GL_TEXTURE_2D, false);
  	  gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MIN_FILTER,GL.GL_LINEAR);
  	  gl.glTexParameteri(GL.GL_TEXTURE_2D,GL.GL_TEXTURE_MAG_FILTER,GL.GL_LINEAR);
  	  gl.glTexEnvf(GL.GL_TEXTURE_ENV,GL.GL_TEXTURE_ENV_MODE,GL.GL_REPLACE);
    }
}

TextureGenerator:
Java:
/*
 * Created on 24.09.2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package BeispielTexturen;

import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt;
import java.io.IOException;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import javax.imageio.ImageIO;

import net.java.games.jogl.GL;
import net.java.games.jogl.GLU;
import net.java.games.jogl.util.BufferUtils;

/**
 * @author Administrator
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class TextureGenerator
{	
    public static BufferedImage readPNGImage(String resourceName)
    {
      try
      {
        URL url = getResource(resourceName);
        if (url == null)
        {
          throw new RuntimeException("Error reading resource " + resourceName);
        }
        BufferedImage img = ImageIO.read(url);
        java.awt.geom.AffineTransform tx = java.awt.geom.AffineTransform.getScaleInstance(1, -1); 
        tx.translate(0, -img.getHeight(null)); 
        AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR); 
        img = op.filter(img, null); 
        return img;
      }
      catch (IOException e)
      {
        throw new RuntimeException(e);
      }
    }
    
    public static void makeRGBTexture(GL gl, GLU glu, BufferedImage img, int target, boolean mipmapped)
    {
      ByteBuffer dest = null;
      switch (img.getType())
      {
        case BufferedImage.TYPE_3BYTE_BGR:
        case BufferedImage.TYPE_CUSTOM:
        {
          byte[] data = ((DataBufferByte) img.getRaster().getDataBuffer()).getData();
          dest = ByteBuffer.allocateDirect(data.length);
          dest.order(ByteOrder.nativeOrder());
          dest.put(data, 0, data.length);
          break;
        }
        case BufferedImage.TYPE_INT_RGB:
        {
          int[] data = ((DataBufferInt) img.getRaster().getDataBuffer()).getData();
          dest = ByteBuffer.allocateDirect(data.length * BufferUtils.SIZEOF_INT);
          dest.order(ByteOrder.nativeOrder());
          dest.asIntBuffer().put(data, 0, data.length);
          break;
        }
        default:
          throw new RuntimeException("Unsupported image type " + img.getType());
      }
      
      if (mipmapped)
      {
        glu.gluBuild2DMipmaps(target, GL.GL_RGB8, img.getWidth(), img.getHeight(), GL.GL_RGB, GL.GL_UNSIGNED_BYTE, dest);
      }
      else
      {
        gl.glTexImage2D(target, 0, GL.GL_RGB, img.getWidth(), img.getHeight(), 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, dest);
      }
    }

    public static int genTexture(GL gl)
    {
      final int[] tmp = new int[1];
      gl.glGenTextures(1, tmp);
      return tmp[0];
    }
  

  /** Retrieve a URL resource from the jar.  If the resource is not found, then
   * the local disk is also checked.
   * @param filename Complete filename, including parent path
   * @return a URL object if resource is found, otherwise null.
   */  
  public final static URL getResource(final String filename)
  {
    // Try to load resource from jar
    URL url = ClassLoader.getSystemResource(filename);
    // If not found in jar, then load from disk
    if (url == null)
    {
      try
      {
        url = new URL("file", "localhost", filename);
      }
      catch (Exception urlException){} // ignore
    }
    return url;
  }
}

Das ist der Code, den ich habe. Ihr könnt das ja damit auch mal versuchen.

LG Stefan
 

Zurück
Oben