📄 animator.java
字号:
/* * @(#)Animator.java 1.5 99/07/12 * * Copyright (c) 1997 Sun Microsystems, Inc. All Rights Reserved. * * Sun grants you ("Licensee") a non-exclusive, royalty free, license to use, * modify and redistribute this software in source and binary code form, * provided that i) this copyright notice and license appear on all copies of * the software; and ii) Licensee does not utilize the software in a manner * which is disparaging to Sun. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE * POSSIBILITY OF SUCH DAMAGES. * * This software is not designed or intended for use in on-line control of * aircraft, air traffic, aircraft navigation or aircraft communications; or in * the design, construction, operation or maintenance of any nuclear * facility. Licensee represents and warrants that it will not use or * redistribute the Software for such purposes. */import java.awt.*;import java.awt.event.*;import java.applet.Applet;import java.applet.AudioClip;import java.util.Vector;import java.util.Hashtable;import java.util.Enumeration;import java.net.URL;import java.net.MalformedURLException;import java.util.List;import java.util.ArrayList;import java.util.Iterator;/** * An applet that plays a sequence of images, as a loop or a one-shot. * Can have a soundtrack and/or sound effects tied to individual frames. * See the <a href="http://java.sun.com/applets/applets/Animator/">Animator * home page</a> for details and updates. * * @author Herb Jellinek * @version 1.5, 07/12/99 */public class Animator extends Applet implements Runnable, MouseListener { int appWidth = 0; // Animator width int appHeight = 0; // Animator height Thread engine = null; // Thread animating the images boolean userPause = false; // True if thread currently paused by user boolean loaded = false; // Can we paint yet? boolean error = false; // Was there an initialization error? Animation animation = null; // Animation this animator contains String hrefTarget = null; // Frame target of reference URL if any URL hrefURL = null; // URL link for information if any static final String sourceLocation = "http://java.sun.com/applets/applets/Animator/"; static final String userInstructions = "shift-click for errors, info"; static final int STARTUP_ID = 0; static final int BACKGROUND_ID = 1; static final int ANIMATION_ID = 2; /** * Applet info. */ public String getAppletInfo() { return "Animator v1.10 (02/05/97), by Herb Jellinek"; } /** * Parameter info. */ public String[][] getParameterInfo() { String[][] info = { {"imagesource", "URL", "a directory"}, {"startup", "URL", "image displayed at start-up"}, {"backgroundcolor", "int", "background color (24-bit RGB number)"}, {"background", "URL", "image displayed as background"}, {"startimage", "int", "index of first image"}, {"endimage", "int", "index of last image"}, {"namepattern", "URL", "generates indexed names"}, {"images", "URLs", "list of image indices"}, {"href", "URL", "page to visit on mouse-click"}, {"target", "name", "frame to put that page in"}, {"pause", "int", "global pause, milliseconds"}, {"pauses", "ints", "individual pauses, milliseconds"}, {"repeat", "boolean", "repeat? true or false"}, {"positions", "coordinates", "path images will follow"}, {"soundsource", "URL", "audio directory"}, {"soundtrack", "URL", "background music"}, {"sounds", "URLs", "list of audio samples"}, }; return info; } /** * Show a crude "About" box. Displays credits, errors (if any), and * parameter values and documentation. */ void showDescription() { DescriptionFrame description = new DescriptionFrame(); description.tell("\t\t"+getAppletInfo()+"\n"); description.tell("Updates, documentation at "+sourceLocation+"\n\n"); description.tell("Document base: "+getDocumentBase()+"\n"); description.tell("Code base: "+getCodeBase()+"\n\n"); Object errors[] = animation.tracker.getErrorsAny(); if (errors != null) { description.tell("Applet image errors:\n"); for (int i = 0; i < errors.length; i++) { if (errors[i] instanceof Image) { AnimationFrame frame = (AnimationFrame) animation.frames.get(i); URL url = frame.imageLocation; if (url != null) { description.tell(" "+url+" not loaded\n"); } } } description.tell("\n"); } if (animation.frames == null || animation.frames.size() == 0) description.tell("\n** No images loaded **\n\n"); description.tell("Applet parameters:\n"); description.tell(" width = "+getParameter("WIDTH")+"\n"); description.tell(" height = "+getParameter("HEIGHT")+"\n"); String params[][] = getParameterInfo(); for (int i = 0; i < params.length; i++) { String name = params[i][0]; description.tell(" "+name+" = "+getParameter(name)+ "\t ["+params[i][2]+"]\n"); } description.show(); } /** * Local version of getParameter for debugging purposes. */ public String getParam(String key) { String result = getParameter(key); return result; } /** * Get parameters and parse them */ public void handleParams() { try { String param = getParam("IMAGESOURCE"); animation.imageSource = (param == null) ? getDocumentBase() : new URL(getDocumentBase(), param + "/"); String href = getParam("HREF"); if (href != null) { try { hrefURL = new URL(getDocumentBase(), href); } catch (MalformedURLException e) { showParseError(e); } } hrefTarget = getParam("TARGET"); if (hrefTarget == null) hrefTarget = "_top"; param = getParam("PAUSE"); if (param != null) animation.setGlobalPause(Integer.parseInt(param)); param = getParam("REPEAT"); animation.repeat = (param == null) ? true : (param.equalsIgnoreCase("yes") || param.equalsIgnoreCase("true")); int startImage = 1; int endImage = 1; param = getParam("ENDIMAGE"); if (param != null) { endImage = Integer.parseInt(param); param = getParam("STARTIMAGE"); if (param != null) { startImage = Integer.parseInt(param); } param = getParam("NAMEPATTERN"); animation.prepareImageRange(startImage, endImage, param); } else { param = getParam("STARTIMAGE"); if (param != null) { startImage = Integer.parseInt(param); param = getParam("NAMEPATTERN"); animation.prepareImageRange(startImage, endImage, param); } else { param = getParam("IMAGES"); if (param == null) { showStatus("No legal IMAGES, STARTIMAGE, or ENDIMAGE "+ "specified."); error = true; return; } else { animation.parseImages(param, getParam("NAMEPATTERN")); } } } param = getParam("BACKGROUND"); if (param != null) animation.backgroundImageURL = new URL(animation.imageSource, param); param = getParam("BACKGROUNDCOLOR"); if (param != null) animation.backgroundColor = decodeColor(param); param = getParam("STARTUP"); if (param != null) animation.startUpImageURL = new URL(animation.imageSource, param); param = getParam("SOUNDSOURCE"); animation.soundSource = (param == null) ? animation.imageSource : new URL(getDocumentBase(), param + "/"); param = getParam("SOUNDS"); if (param != null) animation.parseSounds(param); param = getParam("PAUSES"); if (param != null) animation.parseDurations(param); param = getParam("POSITIONS"); if (param != null) animation.parsePositions(param); param = getParam("SOUNDTRACK"); if (param != null) animation.soundTrackURL = new URL( animation.soundSource, param); } catch (MalformedURLException e) { showParseError(e); } catch (ParseException e) { showParseError(e); } } private Color decodeColor(String s) { int val = 0; try { if (s.startsWith("0x")) { val = Integer.parseInt(s.substring(2), 16); } else if (s.startsWith("#")) { val = Integer.parseInt(s.substring(1), 16); } else if (s.startsWith("0") && s.length() > 1) { val = Integer.parseInt(s.substring(1), 8); } else { val = Integer.parseInt(s, 10); } return new Color(val); } catch (NumberFormatException e) { return null; } } /** * Initialize the applet. Get parameters. */ public void init() { //animation.tracker = new MediaTracker(this); appWidth = getSize().width; appHeight = getSize().height; animation = new Animation(this); handleParams(); animation.init(); addMouseListener(this); Thread me = Thread.currentThread(); me.setPriority(Thread.MIN_PRIORITY); userPause = false; } public void destroy() { removeMouseListener(this); } void tellLoadingMsg(String file, String fileType) { showStatus("Animator: loading "+fileType+" "+file); } void tellLoadingMsg(URL url, String fileType) { tellLoadingMsg(url.toExternalForm(), fileType); } void clearLoadingMessage() { showStatus(""); } void loadError(String fileName, String fileType) { String errorMsg = "Animator: Couldn't load "+fileType+" "+ fileName; showStatus(errorMsg); System.err.println(errorMsg); error = true; repaint(); } void loadError(URL badURL, String fileType) { loadError(badURL.toExternalForm(), fileType); } void showParseError(Exception e) { String errorMsg = "Animator: Parse error: "+e; showStatus(errorMsg); System.err.println(errorMsg); error = true; repaint(); } /** * Run the animation. This method is called by class Thread. * @see java.lang.Thread */ public void run() { Thread me = Thread.currentThread(); if (animation.frames == null) return; if ((appWidth <= 0) || (appHeight <= 0)) return; try { while (engine == me) { // Get current frame and paint it, play its sound AnimationFrame thisFrame = (AnimationFrame) animation.frames.get(animation.currentFrame); repaint(); if (thisFrame.sound != null) thisFrame.sound.play(); animation.currentFrame++; // Check if we are done if (animation.currentFrame >= animation.frames.size()) { if (animation.repeat) animation.currentFrame = 0; else return; } // Pause for duration or longer if user paused try { Thread.sleep(thisFrame.duration); synchronized(this) { while (userPause) { animation.stopPlaying(); wait(); } } } catch (InterruptedException e) { } } } finally { synchronized(this) { if (engine == me) animation.stopPlaying(); } } } /** * No need to clear anything; just paint. */ public void update(Graphics g) { paint(g); } /** * Paint the current frame */ public void paint(Graphics g) { if (error || ! loaded) { if (animation.startUpImage != null) { if (animation.tracker.checkID(STARTUP_ID)) { if (animation.backgroundColor != null) { g.setColor(animation.backgroundColor); g.fillRect(0, 0, appWidth, appHeight); } g.drawImage(animation.startUpImage, 0, 0, this); } } else { if ((animation.backgroundImage != null) && (animation.tracker.checkID(BACKGROUND_ID))) g.drawImage(animation.backgroundImage, 0, 0, this); else g.clearRect(0, 0, appWidth, appHeight); } } else { animation.paint(g); } } /** * Start the applet by forking an animation thread. */ public void start() { engine = new Thread(this); engine.start(); showStatus(getAppletInfo()); } /** * Stop the insanity, um, applet. */ public synchronized void stop() { engine = null; animation.stopPlaying(); if (userPause) { userPause = false; notify(); } } /** * Pause the thread when the user clicks the mouse in the applet. * If the thread has stopped (as in a non-repeat performance), * restart it. */ public synchronized void mousePressed(MouseEvent event) { event.consume(); if ((event.getModifiers() & InputEvent.SHIFT_MASK) != 0) { showDescription(); return; } else if (hrefURL != null) { //Let mouseClicked handle this. return; } else if (loaded) { userPause = !userPause; if (!userPause) { animation.startPlaying(); notifyAll();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -