La struttura di questa applicazione è simile al triangolo, ma è ora presente una semplice animazione: il rombo rosso si sposta verso destra alla pressione del tasto Start. La classe FPSAnimator viene utilizzata per realizzare l’animazione; il costruttore necessita di 3 parametri:
FPSAnimator(GLAutoDrawable drawable, int fps, boolean scheduleAtFixedRate)
Creates an FPSAnimator with a given target frames-per-second value, an initial drawable to animate, and a flag indicating whether to use fixed-rate scheduling.
Main.java
GLWindow window; FPSAnimator animator; GLRenderer renderer; public Main() { initComponents(); window = GLWindow.create(new GLCapabilities(GLProfile.getDefault())); window.setTitle("OpenGL prova - GLWindow"); window.setSize(800, 600); renderer = new GLRenderer(); window.addGLEventListener(renderer); animator = new FPSAnimator(window, 60, true); }
private void btnHideActionPerformed(java.awt.event.ActionEvent evt) { window.setVisible(false); } private void btnShowActionPerformed(java.awt.event.ActionEvent evt) { window.setVisible(true); } private void btnStartActionPerformed(java.awt.event.ActionEvent evt) { animator.start(); } private void btnStopActionPerformed(java.awt.event.ActionEvent evt) { animator.stop(); } private void btnFullscreenActionPerformed(java.awt.event.ActionEvent evt) { window.setFullscreen(btnFullscreen.isSelected()); }
GLRenderer.java
double a = 0.0; // posizione iniziale del rombo @Override public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glClear(GL2.GL_COLOR_BUFFER_BIT); gl.glBegin(GL2.GL_QUADS); // disegna i quadrati bianchi della scacchiera gl.glColor3f(1, 1, 1); for (int i = -4; i < 4; i++) { for (int j = -4; j < 4; j++) { if ((i + j) % 2 != 0) { gl.glVertex2d(i / 4.0, j / 4.0); gl.glVertex2d(i / 4.0 + 0.25, j / 4.0); gl.glVertex2d(i / 4.0 + 0.25, j / 4.0 + 0.25); gl.glVertex2d(i / 4.0, j / 4.0 + 0.25); } } } // disegna il rombo rosso gl.glColor3f(1, 0, 0); gl.glVertex2d(a - 0.1, 0.875); gl.glVertex2d(a, 0.875 - 0.1); gl.glVertex2d(a + 0.1, 0.875); gl.glVertex2d(a, 0.875 + 0.1); gl.glEnd(); a += 0.01; // incrementa l'ascissa del rombo }