/* AnimationApplet.java -- An example of an old-style AWT applet Copyright (C) 2006 Free Software Foundation, Inc. This file is part of GNU Classpath examples. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package gnu.classpath.examples.awt; import java.awt.*; import java.applet.*; /** * AnimationApplet demonstrates the need for Xflush calls in * GdkGraphics.c. To see how this demo can fail in their absence, * remove the contents of schedule_flush in GdkGraphics.c. The * animation will be so choppy that it is effectively stopped. */ public class AnimationApplet extends Applet implements Runnable { boolean going = false; Thread animThread = null; int SPEED = 5; int circleX = 0; int circleY = 0; int circleXold = 0; int circleYold = 0; int circleXdelta = 0; int circleYdelta = 0; int circleDiameter = 0; int autoCircleX = 0; int autoCircleY = 0; int autoCircleXold = 0; int autoCircleYold = 0; int autoCircleXdelta = (int) (0.66 * SPEED); int autoCircleYdelta = (int) (1.33 * SPEED); int boardWidth = 0; int boardHeight = 0; int CIRCLE_SIZE = 5; private Graphics appletGraphics; // Update the circles' location values. private void moveCircles() { circleX += circleXdelta; if (circleX < 0) circleX = 0; if (circleX > boardWidth - circleDiameter) circleX = boardWidth - circleDiameter; circleY += circleYdelta; if (circleY < 0) circleY = 0; if (circleY > boardHeight - circleDiameter) circleY = boardHeight - circleDiameter; autoCircleX += autoCircleXdelta; if (autoCircleX < 0) { autoCircleX = 0; autoCircleXdelta = -autoCircleXdelta; } if (autoCircleX > boardWidth - circleDiameter) { autoCircleX = boardWidth - circleDiameter; autoCircleXdelta = -autoCircleXdelta; } autoCircleY += autoCircleYdelta; if (autoCircleY < 0) { autoCircleY = 0; autoCircleYdelta = -autoCircleYdelta; } if (autoCircleY > boardHeight - circleDiameter) { autoCircleY = boardHeight - circleDiameter; autoCircleYdelta = -autoCircleYdelta; } } // Clear the circle in the old location and paint a new circle // in the new location. private void paintCircles() { appletGraphics.setColor(Color.BLUE); appletGraphics.fillOval(circleXold, circleYold, circleDiameter, circleDiameter); appletGraphics.setColor(Color.YELLOW); appletGraphics.fillOval(circleX, circleY, circleDiameter, circleDiameter); appletGraphics.setColor(Color.BLUE); appletGraphics.fillOval(autoCircleXold, autoCircleYold, circleDiameter, circleDiameter); appletGraphics.setColor(Color.WHITE); appletGraphics.fillOval(autoCircleX, autoCircleY, circleDiameter, circleDiameter); } // Override Applet.run. public void run() { while (animThread != null) { circleXold = circleX; circleYold = circleY; autoCircleXold = autoCircleX; autoCircleYold = autoCircleY; moveCircles(); paintCircles(); if (animThread != null) { try { Thread.sleep(20); } catch (InterruptedException e) { } } } } // Override Applet.paint. public void paint(Graphics g) { boardWidth = this.getSize().width; boardHeight = this.getSize().height; g.setColor(Color.BLUE); g.fillRect(0, 0, boardWidth, boardHeight); if (!going) { FontMetrics fm = appletGraphics.getFontMetrics(); appletGraphics.setColor(Color.WHITE); String msg = "Click to Start"; appletGraphics.drawString(msg, (boardWidth >> 1) - (fm.stringWidth(msg) >> 1), (boardHeight >> 1) - (fm.getHeight() >> 1)); } } // Override Applet.destroy. public void destroy() { // animThread.stop(); animThread = null; } // Override Applet.init. public void init() { boardWidth = this.getSize().width; boardHeight = this.getSize().height; going = false; appletGraphics = getGraphics(); appletGraphics.setFont(new Font(appletGraphics.getFont().getName(), Font.BOLD, 15)); } // Override Component.preferredSize for when we're run standalone. public Dimension preferredSize () { return new Dimension (400, 400); } // Override Applet.handleEvent, the old-style AWT-event handler. public boolean handleEvent(Event event) { switch (event.id) { case Event.MOUSE_DOWN: if (!going) { going = true; circleDiameter = boardWidth / CIRCLE_SIZE; circleX = (boardWidth - circleDiameter) >> 1; circleY = (boardHeight - circleDiameter) >> 1; circleXdelta = 0; circleYdelta = 0; repaint(); animThread = new Thread(this); animThread.start(); } break; case Event.KEY_ACTION: case Event.KEY_PRESS: if (event.key == Event.LEFT) circleXdelta = -SPEED; else if (event.key == Event.RIGHT) circleXdelta = SPEED; else if (event.key == Event.UP) circleYdelta = -SPEED; else if (event.key == Event.DOWN) circleYdelta = SPEED; break; case Event.KEY_ACTION_RELEASE: case Event.KEY_RELEASE: if (event.key == Event.LEFT && circleXdelta < 0) circleXdelta = 0; else if (event.key == Event.RIGHT && circleXdelta > 0) circleXdelta = 0; else if (event.key == Event.UP && circleYdelta < 0) circleYdelta = 0; else if (event.key == Event.DOWN && circleYdelta > 0) circleYdelta = 0; break; default: break; } return false; } }