AnimNav.java
上传用户:maggie0758
上传日期:2007-01-07
资源大小:232k
文件大小:14k
源码类别:

Applet

开发平台:

Java

  1. /*
  2. AnimNav.java
  3. Version 1.0.0
  4. Written by Elijah Dean Meeker 1/4/96
  5. Clicking it navagates to the given URL. It
  6. uses off-screen buffering to avoid flicker. Here is a valid applet tags:
  7. [Optional params are in brackets][Second brackets contain defaults]
  8. <APPLET
  9. codebase="classes"
  10. CODE="AnimNav.class" WIDTH=75 HEIGHT=75>      SIZE of button images
  11. [<PARAM NAME="spriteX" VALUE="10">]      LEFT pos. to draw sub-images[0]
  12. [<PARAM NAME="spriteY" VALUE="10">]      TOP pos. to draw sub-images [0]
  13. [<PARAM NAME="sleeptime" VALUE="500">]   TIME between images[autorun off]
  14. <PARAM NAME="imageCount" VALUE="8">     Image Count
  15. <PARAM NAME="translation" VALUE="0|0|1|1|2|2|3|3"> Which URL goes with which frame of animation
  16. <PARAM NAME="URLcount" VALUE="4">     URL count
  17. <PARAM NAME="dest0" VALUE="http://www.realtime.net/~elijah/"> URL to navigate to
  18. <PARAM NAME="dest1" VALUE="http://www.mel.dit.csiro.au/~brendan/">URL to navigate to
  19. <PARAM NAME="dest2" VALUE="http://198.3.117.222"> URL to navigate to
  20. <PARAM NAME="dest3" VALUE="http://www.sun.com/"> URL to navigate to
  21. [<PARAM NAME="desc0" VALUE="Homepage of Elijah Dean Meeker">]     URL description
  22. [<PARAM NAME="desc1" VALUE="Homepage of Brendan Hills">]          URL description
  23. [<PARAM NAME="desc2" VALUE="BreakFast Cereal Hall Of Fame">]      URL description
  24. [<PARAM NAME="desc3" VALUE="Sun Microsystems">]                   URL description
  25. [<PARAM NAME="target0" VALUE="_jmainview">]                       target window for URL[_parent]
  26. [<PARAM NAME="background" VALUE="images/cub_bg.jpg"> ]BACKGROUND image(offset from codebase)
  27. <PARAM NAME="prefix" VALUE="images/nav">     Prefix of images(offset from codebase)
  28. [<PARAM NAME="imagetype" VALUE="jpg">]               Image type-WITHOUT '.'[jpg]
  29. </APPLET>
  30. Please feel free to improve this code. It would not be here but for the
  31. freely given help of others. I would love to see your improvements.
  32. Elijah.
  33. elijah@bga.com
  34. http://www.realtime.net/~elijah/
  35. */
  36. import java.applet.Applet;
  37. import java.applet.AudioClip;
  38. import java.awt.Dimension;
  39. import java.awt.Event;
  40. import java.awt.Graphics;
  41. import java.awt.Image;
  42. import java.awt.MediaTracker;
  43. import java.lang.InterruptedException;
  44. import java.net.MalformedURLException;
  45. import java.net.URL;
  46. /******************************************************************************/
  47. /**************************AnimNav.class***************************************/
  48. public class AnimNav extends java.applet.Applet {
  49. //Graphics
  50. MediaTracker tracker;
  51. Dimension d; //for sizing offscreen buffer
  52. Graphics offscreen;
  53. Image buf;
  54. Image bg; //background image
  55. Image img[];//array of sprite images
  56. //AutoRun class
  57. NavAutoRun autoRun;
  58. int spriteX,spriteY;//sprite offset on background
  59. int imageCount;      //total number of sprite images
  60. int oldx = 0;       //tested in mouseDrag
  61. int downx=0;         //tested in mouseUp
  62. public int frame = 0;      //current frame of animation
  63. public int URLcount=0;
  64. boolean bgP=true;            //background image loaded flag
  65. boolean autorunP=false;      //autorun setup flag
  66. URL URLdest[];             //list of URLs
  67. String URLdescription[];   //URLdescriptions
  68. String targetWindow[];
  69. int translate[];           //Which URLs go with which frames of the animation
  70. /****************************STATE CHANGES*************************************/
  71. public void init(){
  72. String str;
  73. String imageType;
  74. //offscreen buffer
  75. //System.out.println("offscreen buffer");
  76. d = size();
  77. buf= createImage(d.width,d.height);
  78. offscreen = buf.getGraphics();
  79. //MediaTracker
  80. //System.out.println("MediaTracker");
  81. tracker = new MediaTracker(this);
  82. /************************LOAD spriteX****************************/
  83. str =getParameter("spritex");
  84. if(str== null){
  85. spriteX=0;
  86. }else{
  87.  spriteX=Integer.parseInt(str);
  88. }
  89. /************************LOAD spriteY****************************/
  90. str =getParameter("spritey");
  91. if(str== null){
  92. spriteY=0;
  93. }else{
  94. spriteY=Integer.parseInt(str);
  95. }
  96. /*********************LOAD NavAutoRun init************************/
  97. str =getParameter("sleeptime");
  98. if(str!= null){
  99. autorunP=true;
  100. autoRun=new NavAutoRun(this,Integer.parseInt(str));
  101. }
  102. /************************LOAD urlcount**************************/
  103. //System.out.println("URLdest");
  104. str= getParameter("urlcount");
  105. if (str == null){
  106. System.out.println
  107. ("Error Loading: urlcount, Not Optional");
  108. }else{
  109. URLcount= Integer.parseInt(str);
  110. URLdescription=new String[URLcount];
  111. targetWindow=new String[URLcount];
  112. URLdest=new URL[URLcount];
  113. }//ned if
  114. /************************LOAD URLs**************************/
  115. //System.out.println("URLs");
  116. for(int c=0;c<URLcount;c++){
  117.  URLdescription[c]= getParameter("dest"+c);
  118. try{
  119. if (URLdescription[c] != null) //this is here for development
  120. URLdest[c] = new URL(URLdescription[c]);
  121. }catch(MalformedURLException mal){
  122. System.out.println("Malformed URL: Check Applet Tag.");
  123. }
  124. }//end for
  125. /************************LOAD URL Descriptions*********************/
  126. for(int c=0;c<URLcount;c++){
  127. str= getParameter("desc"+c);
  128. if (str != null){
  129. URLdescription[c]=str;
  130. }
  131. }//end for
  132. /************************LOAD URL targetWindow*********************/
  133. for(int c=0;c<URLcount;c++){
  134. str= getParameter("target"+c);
  135. if (str == null){
  136. targetWindow[c]=" _parent";
  137. }else{
  138. targetWindow[c]=str;
  139. }
  140. }//end for
  141. /************************LOAD imageCount**************************/
  142. //System.out.println("imageCount");
  143. str =getParameter("imagecount");
  144. if (str == null){
  145. System.out.println
  146. ("Error getting Parameter: imagecount, Not Optional.");
  147. }else{
  148. imageCount= Integer.parseInt(str);
  149. img = new Image[imageCount];
  150. }
  151. /************************LOAD translate[]*************************/
  152. str = getParameter("translation");
  153. if (str == null){
  154. System.out.println
  155. ("Error getting Parameter: translation, Not Optional.");
  156. }else{
  157. translate=new int[imageCount];
  158. int index=0;
  159. for (int i = 0; i < str.length(); ) {
  160. if (index >= imageCount) break;
  161. int next=str.indexOf('|', i);
  162. if (next == -1) next = str.length();
  163. if (i != next) {
  164. translate[index]=Integer.parseInt(str.substring(i, next));
  165. index++;
  166. }//end if
  167. i = next + 1;
  168. }//end for
  169.   }//end if str==null
  170.   /*
  171.   //this would also work for above
  172.   StringTokenizer st = new StringTokenizer(s,"|");
  173.   while (st.hasMoreTokens()) {
  174.  translate[index]=Integer.parseInt(st.nextToken());
  175.  index++;
  176.   }
  177.   */
  178. /************************LOAD imagetype**************************/
  179. //System.out.println("imagetype");
  180. str = getParameter("imagetype");
  181.  if (str == null){
  182. imageType="jpg";
  183.  }else{
  184. imageType=str;
  185.  }//end if
  186. /************************LOAD background image**************************/
  187. //System.out.println("background");
  188. str = getParameter("background");
  189.  if (str == null){
  190. bgP=false; //not using background image
  191. spriteX=0;spriteY=0;
  192.  }else{
  193. showStatus("Loading Background Image");
  194. bg =  getImage(getCodeBase(),str);
  195. tracker.addImage(bg, 0);
  196. try {
  197. tracker.waitForAll();
  198. } catch (InterruptedException e) {
  199. System.out.println("Error waiting for Background image to load.");
  200. }//end catch
  201. showStatus("");
  202.  }//end if
  203. /************************LOAD animation images*********************/
  204. //System.out.println("Sprites");
  205. str = getParameter("prefix");
  206. if (str == null){
  207. System.out.println
  208. ("Error Loading image: "+str+", Not Optional");
  209. }else{
  210. for (int i = 0; i < imageCount; i++) {
  211. showStatus("AnimNav Loading Image :"+(i+1)+ " of " + imageCount);
  212. img[i] =  getImage(getCodeBase(),str+i+"."+imageType);
  213. tracker.addImage(img[i], 1);
  214. try {
  215. tracker.waitForAll();
  216. } catch (InterruptedException e) {
  217. System.out.println("Error waiting for image"+i+" to load");
  218. }//end catch
  219. showStatus("");
  220. }//end for
  221.   }//end if str == null
  222. }//end init
  223. /******************************************************************************/
  224.   public void start(){
  225. if(autorunP==true)autoRun.start();
  226. frame=downx=oldx=0;
  227. repaint();
  228.   }//end start
  229. /******************************************************************************/
  230.   public void stop(){
  231. if(autorunP==true)autoRun.stop();
  232.   }//end stop
  233. /******************************************************************************/
  234.   public void destroy(){
  235.   }//end destroy
  236. /****************************END STATE CHANGES********************************/
  237. /*******************************EVENTS****************************************/
  238.   public boolean mouseDown(Event e, int x, int y){
  239. downx=oldx=x;
  240. return(true);
  241.   }//end mouseDown
  242. /******************************************************************************/
  243.   public boolean mouseUp(Event e, int x, int y){
  244. if(downx<x+2 && downx>x-2)//set in mouseDown
  245. getAppletContext().showDocument(URLdest[translate[frame]],targetWindow[translate[frame]]);
  246. return(true);
  247.   }//end mouseUp
  248. /******************************************************************************/
  249.   public boolean mouseEnter(Event e, int x, int y){
  250. if(autorunP==true)autoRun.stop();
  251. showStatus(URLdescription[translate[frame]]);
  252. return(true);
  253.   }//end mouseEnter
  254. /******************************************************************************/
  255.   public boolean mouseExit(Event e, int x, int y){
  256. if(autorunP==true)autoRun.start();
  257. showStatus("");
  258. return(true);
  259.   }//end mouseExit
  260. /******************************************************************************/
  261.   public boolean mouseDrag(Event e,int x, int y){
  262.   if(x>=(oldx + 20)){
  263. oldx=x;
  264. frame--;
  265. if (frame<0){frame=imageCount-1;}
  266.   }else if(x<=(oldx - 20)){
  267. oldx=x;
  268. frame++;
  269. if (frame>=imageCount){frame=0;}
  270.   }
  271.   showStatus(URLdescription[translate[frame]]);
  272.   repaint();
  273.   return(true);
  274.   }//end mouseMove
  275. /*******************************END EVENTS*************************************/
  276. /*******************************METHODS****************************************/
  277. public  void update(Graphics g){
  278. paint(g);
  279. }//end update
  280. /******************************************************************************/
  281. public void paint(Graphics g){
  282. if (offscreen != null) {
  283. paintApplet(offscreen);
  284. g.drawImage(buf, 0, 0, this);
  285. } else {
  286.  paintApplet(g);
  287. }
  288. }//end paint
  289. /******************************************************************************/
  290.  public void paintApplet(Graphics g) {
  291. if(bgP==true)
  292. g.drawImage(bg,0,0,null);
  293. //System.out.println("paintApplet: frame="+frame);
  294. g.drawImage(img[frame],spriteX,spriteY,null);
  295.  }//end paintApplet
  296. /******************************************************************************/
  297. // Applet info
  298. public String getAppletInfo(){
  299. return "AnimNav.class By Elijah Meeker 1/5/96";
  300. }//end getAppletInfo
  301. /******************************************************************************/
  302. public String[][] getParameterInfo() {
  303.   String[][] info = {
  304. {"[spriteX]",
  305.  "int",
  306.  "X offset of images on background [0]"},
  307. {"[spriteY]",
  308.  "int",
  309.  "Y offset of images on background[0]"},
  310. {"[sleeptime]",
  311.  "int",
  312.  "pause between images in AutoRun[AutoRun off]"},
  313. {"imageCount",
  314.  "int",
  315.  "Number of animation images"},
  316. {"translation",
  317.  "parsed string",
  318.  "which URLs go with which images,form:0|0|1|1"},
  319. {"URLcount",
  320.  "int",
  321.  "number of URLs"},
  322. {"dest+int",
  323.  "url",
  324.  "URL to navigate to(int min=0, max=URLcount-1"},
  325. {"[desc+int]",
  326.  "string",
  327.  "URL description[string of dest+int]"},
  328.  {"[target+int]",
  329.  "string",
  330.  "target Window for URL[_parent]"},
  331. {"[imagetype]",
  332.  "string",
  333.  "image type suffix W/O '.'[jpg]"},
  334. {"[background]",
  335.  "string",
  336.  "Background image(offset from CodeBase)[no background, spriteX=spriteY=0]"},
  337. {"prefix",
  338.  "string",
  339.  "Prefix to sprites(offset from CodeBase)"}
  340.  };
  341.   return info;
  342. }//end getParameterInfo
  343. /*****************************END METHODS**************************************/
  344. }//end class AnimNav.class
  345. /******************************************************************************/
  346. /******************************************************************************/
  347. /*****************************AutoRun.class************************************/
  348. class NavAutoRun implements Runnable {
  349. Thread T = null;
  350. AnimNav applet;
  351. int howLong;
  352. /*****************************Constructors*************************************/
  353. NavAutoRun(AnimNav applet,int time){
  354. this.applet = applet;
  355. howLong=time;
  356. }//end constructor
  357. /****************************State Changes*************************************/
  358. public void start(){
  359. if (T == null) {
  360. T = new Thread(this,"T");
  361. T.start();
  362. T.setPriority(Thread.MIN_PRIORITY+1);
  363. }
  364. }//end start
  365. /******************************************************************************/
  366. public void run(){
  367. while(T!=null){
  368. applet.repaint();
  369. applet.frame++;
  370. if (applet.frame>=applet.imageCount){applet.frame=0;}
  371. applet.showStatus(applet.URLdescription[applet.translate[applet.frame]]);
  372. try {Thread.sleep(howLong);} catch (InterruptedException e){}
  373. }//end while
  374.   }//end run
  375. /******************************************************************************/
  376.   public void stop(){
  377. if (T != null) {
  378. T.stop();
  379. T=null;
  380. }
  381.   }//end stop
  382. /******************************************************************************/
  383. }//end AutoRun.class