blob: 9d3b7cebe411a843f34f4d446e9a75228a590f2c [file] [log] [blame]
/* 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.awt.event.*;
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;
}
}