Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例_第1页
Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例_第2页
Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例_第3页
Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例_第4页
Java语言程序设计的课程设计项目——利用Java实现地球系动画完整实现实例_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.1 利用Java实现地球系动画完整实现实例(第4部分)1.1.1 产生地球和月亮、并且月亮围着地球转1、如何实现?(1)什么是软件需求“产生地球和月亮、并且月凫围着地球转。”(2)什么是软件设计(思考)设计的结果其实就是产生出“解决方案”。(3)什么是软件开发实现(编程)程序员按照设计人员的设计文档进行编程实现。(4)什么是软件测试一一找出程序中的“各种缺陷(Bug)”(5)部署和维护一、第一步:创建两个地球线程1、EarthPlanetAppletimport;import;import;import;import;import;import;publicclassEarthPlanet

2、AppletextendsJAppletimplementsRunnableprivateThreadearthMultiThread=null;privateThreadmoonMultiThread=null;privateGraphicsguiGraphics;privateImagealllmagesArrayf;privateintcurrentImageIndex=O;privateintimageWidth=0;privateintimageHeight=0;privatebooleanalllmagesLoaded=false;privatefinalintNUMBERMAGE

3、S=18;privatebooleanisRunedByApplication=false;publicstaticvoidmain(Stringargs)EarthPlanetFrameapplicationJFrame=nulI;applicationJFrame=newEarthPlanetFrame("利用Java实现的地球系动画)EarthPlanetAppletthreadApp!et=null;threadApplet=newEarthPlanetApplet();applicationJFrame.getContentPane().add(MCentern,threa

4、dApplet);threadApplet.isRunedByApplication=true;threadApplet.init();threadApplet.start。;applicationJFrame.setVisible(true);publicEarthPlanetApplet()publicvoidstart()if(earthMultiThread=null)earthMultiThread=newThread(this);earthMultiThread.start();)if(moonMultiThread=null)仓ij建出第2个线程对象moonMultiThread

5、=newThread(this);moonMultiThread.startO;publicvoidstop()if(earthMultiThread!=null)earthMultiThread.stopO;earthMultiThread=null;)if(moonMultiThread!=mill)销毁线程对象moonMultiThread.stopO;moonMultiThread=null;)IpublicvoidloadAlIEarthImage()guiGraphics=getGraphics();alllmagesArray=newImageNUMBERMAGES;MediaT

6、rackertracker=newMediaTracker(this);Stringstrimage;for(intcurrentlndex=1;currentlndex<=NUMBERMAGES;currentIndex+)strimage=H/images/imgOOH+(currentindex<10)?H0H:+currentindex+【gif';URLoneImageURL=getCIass().getResource(strImage);if(isRunedByApplication)allImagesArraycurrentIndeX-1=Toolkit.g

7、etDefaultToolkit().getIniage(oneImageURL);)elseallImagesArraycurrentIndex<1=getlmage(onelmageURL);)tracker.addlmage(alllmagesArraycurrentindex-1.0);trytracker.waitForAH();catch(InterruptedExceptione)e.printStackTrace();1alllmagesLoaded=!tracker.isErrorAny();if(!alIIniagesLoaded)stop();guiGraphics

8、.drawString("图像加载错误,可能是没有找到文件!",10,40);return;)imageWidth=allImagesArrayO.getWidth(this);imageHeight=allImagesArrayO.getHeight(this);publicvoidrun()if(!allImagesLoaded)loadAlIEarthlmageO;)repaint();while(true)trydisplaylmage(guiGraphics);currentlmagelndex+;if(currentimageindex=NUMBER_IMAGE

9、S)currentimageindex=0:Thread.sleep(50);catch(InterruptedExceptione)stop();)privatevoiddisp!ayImage(Graphicsg)分别显示两个地球图像if(!alIImagesLoaded)return;if(Thread.currentThread()=earthMultiThreacl)g.lrawImage(allImagesArraycurrentImageIndex5(getSize().width-imageVVidth)/2,(getSize().height-imageHeight)/2,n

10、ull);else/改变坐标位置g.drawImage(allImagesArraycurrentImageIndex,(getSize(),width-ImageWidth)/4,(getSize().height-imageHeight)/4,null);)publicvoidpaint(Graphicsg)if(allImagesLoaded)Rectangler=g.getClipBounds();g.clearRect(r.x,r,y,r.width,r.height);displaylmage(g);)elseg.drawString("正在加载图像,请等待二10,20)

11、;)上面的代码主要是再创建出第2个线程,并显示出第2套图像。其中的getGipBounds方法得到代表画板边界的矩形,然后从这个矩形中提取宽度和高度数据,再清除该矩形区域。如果除掉下面的语句,将会出现什么现象?g.clearRect(r.x,r.y,r.width,r.height);2、Apple七程序方式执行(两个转动的图像)B利用了实现的地母系动画,/.,飞二、第二步:控制两个地球线程的旋转的速度1、需要补充的知识sleep(毫秒数)是Thread类的静态方法,它能够控制线程。如Thread.sleep(lOOO);该线程睡眠1秒钟,等1秒钟之后,继续余下代码执行。但在sleep时间间隔

12、期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非出现下面的情况:1)“醒来”的线程具有更高的优先级。2)正在运行的线程因为其它原因而阻塞。2、EarthPlanetApplet程序的代码import;import;import;import;import;import;import;publicclassEarthPlanetAppletextendsJAppletimplementsRunnableprivateThreadearthMultiThread=null;privateThreadnioonMultiThread=null;p

13、rivateGraphicsguiGraphics;privateImageallImagesArray;privateintcurrentImageIndex=O;privateintimageWidth=0;privateintimageHeight=0;privatebooleanalllmagesLoaded=false;privatefinalintNUMBERMAGES=18;privatebooleanisRunedByApplication=false;publicstaticvoidmain(Stringargs)EarthPlanetFrameapplicationJFra

14、me=null;applicationJFrame=newEarthPlanetFrame("利用Java实现的地球系动画)EarthPlanetAppletthreadApplet=null;threadApplet=newEarthPlanetApplet();applicationJFrame.getContentPane().add(HCenterH,threadApplet);threadApplet.isRunedByApplication=true;threadApplet.initQ;threadApplet.start();applicationJFrame.set

15、Visible(true);)publicEarthPlanetApplet()publicvoidstart()if(earthMultiThread=null)earthMultiThread=newThread(this);earthMultiThread.start();1if(nioonMultiThread=null)moonMultiThread=newThread(this);nioonMultiThread.start();)publicvoidstop()if(earthMultiThread!=null)earthMultiThread.stop();earthMulti

16、Thread=null;)if(nioonMultiThread!=null)nioonMultiThread.stop();nioonMultiThread=null;)publicvoidloadAlIEarthImage()guiGraphics=getGraphics();alllmagesArray=newImageNUMBERMAGES;MediaTrackertracker=newMediaTracker(this);Stringstrimage;for(intcurrentindex=1;currentlndex<=NUMBERMAGES;currentIndex+)st

17、rimage=,7images/imgOOH+(currentlndex<10)?H0H:+currentindex+【gif”;URLoneImageURL=getCIass().getResource(strImage);if(isRunedByApplication)allImagesArraycurrentIndex-1=Toolkit.getDefaultToolkit().getImage(oneImageURL);elsealllmagesArrayfcurrentlndex-1=getlmage(onelmageURL);)tracker.addImage(allImag

18、esArraycurrentIndex-l,0);)trytracker.waitForAH();catch(InterruptedExceptione)e.printStackTrace();)allImagesLA)aded=!tracker.isErrorAny();if(!aIHmagesLoaded)stop();guiGraphics.drawString("图像力口载错误,可能是没有找到文件!",10,40);return;)imageWidth=allImagesAiTayO.getWidth(this);imageHeight=allImagesArray

19、O.getHeight(this);)publicvoidrun()if(JalllniagesLoaded)loadAHEarthlmageO;)repaint();while(true)trydisplaylmage(guiGraphics);currentlmagelndex+;if(currentimageindex=NUMBER_IMAGES)currentimageindex=0;if(Thread.currentThread()=earthMultiThread)Thread.sleep(50);)elseThread.sleep(500);)catch(InterruptedE

20、xceptione)stop();)privatevoiddisp!ayImage(Graphicsg)if(!allIniagesLoaded)return;if(Thread.currentThread()=earthMultiThread)g.drawImage(allImagesArraycurrentImageIndex,(getSize().width-imageWidth)/2,(getSize().height-imageHeight)/2,null);)elseg.drawImage(aIHmagesArraycurrentImageIndex,(getSize().widt

21、h-imageWidth)/4,(getSize().height-imageHeight)/4,null);1Ipublicvoidpaint(Graphicsg)if(allImagesLoaded)Rectangler=g.getClipBounds();g.clearRect(r.x,r.y,r.width,r.height);displaylmage(g);)elseg.drawString("正在加载图像,请等待.”,10,20);)在程序中通过对两个不同的线程采用不同的“休眠”时间,控制两个线程的频率,相应地也就达到控制地球的“自转”,并且还能够控制“自转”的速度。3、

22、Applet程序方式执行,但此时的两个球的旋转速度有差别地址(D)|密jD:9匕二】转到链接4、应用程序方式执行,但此时的两个球的旋转速度有差别三、第三步:月亮围着地球转1、需要补充的知识圆周方程(1)下面的earthCenterXO、earthCenterYO代表地球的圆心坐标earthCenterXO=(getSize().width-imageWidth)/2;earthCenterYO=(getSize().height-imageHeight)/2;(2)下面的moonCenterXO、moonCenterYO代表地球的圆心坐标moonCenterXO=earthCenterXO+c

23、ircleRadius*Math.cos(currentRotatingAngle*Math.PI/l80);moonCenterYO=earthCenterY0+circleRadius*Math.sin(currentRotatingAngle*Math.PI/180):因此,为了能够产生动态的运行效果,需要在显示图片的同时改变图像显示的位置,连续不断地在不同位置处画出地球的图像。2、EarthPlanetApplet代码import;import;import;import;import;import;import;publicclassEarthPlanetAppletextendsJ

24、AppletimplementsRunnableprivateThreadearthMultiThread=null;privateThreadmoonMultiThread=null;privatebooleanisRunedByApplication=false;设置程序执行的方式privateGraphicsguiGraphics;下面的变量都是与图像有关的变量privateImageallImagesArray;privateintcurrentImageIndex=O;privateintimageWidth=0;privateintimageHeight=0;privatebool

25、eanalllmagesLoaded=false;privatefinalintNUMBERMAGES=18;intearthCenterX0,earthCenterY05moonCenterX0,moonCenterY0;intcurrentRotatingAngle=0;intcircleRadius=100;publicEarthPlanetApplet()publicstaticvoidmain(Stringargs)EarthPlanetFrameapplicationJFrame=nulI;applicationJFrame=newEarthPlanetFrame(n,JJTJav

26、a实现的地球系动画)EarthPlanetAppletthreadApp!et=null;threadApplet=newEarthPlanetApplet();applicationJFrame.getContentPane().add(HCenterH,threadApplet);applicationJFrame.setVisible(true);threadApplet.isRunedByAppIication=true;threadApplet.init();threadApplet.start();publicvoidstart()在重写的start。方法中创建线程对象if(ear

27、thMultiThread=null)earthMultiThread=newThread(this);earthMultiThread.start();)if(nioonMultiThread=null)moonMultiThread=newThread(this);nioonMultiThread.start();)publicvoidstop。在重写的stop。方法中箱毁线程对象if(earthMultiThread!=null)earthMultiThread.stopO;注意终止线程的方式应该采用其它更好的形式earthMultiThread=null;)if(moonMultiTh

28、read!=null)moonMu11iThread.stop();注意终止线程的方式应该采用其它更好的形式moonMultiThread=null;)publicvoidloadAllEarthImage()guiGraphics=getGraphics();alllmagesArray=newImageNUMBERMAGES;MediaTrackertracker=newMediaTracker(this);Stringstrimage=null;for(intcurrentindex=1;currentlndex<=NUMBERMAGES;currentIndex+)strlmag

29、e=M/images/imgOOH+(currentindex<10)?"0":+currentindex+”.giF;URLoneImageURL=getCIass().getResource(strImage);if(isRunedByApplication)allImagesArraycurrentIndex-1=Toolkit.getDefaultToolkit().getImage(oneImageURL);)elseallImagesArraycurrentIndex-1=getlmage(onelmageURL);)tracker.addImage(al

30、lImagesArraycurrentIndex-1,0);)trytracker.waitForAll();catch(InterruptedExceptione)e.printStackTrace();)alllmagesLoaded=!tracker.isErrorAny();/alllmagesLoaded=tracker.checkAH();if(!aHImagesLoaded)stop();guiGraphics.drawSiring("图像力口载错误,可能是没有找到文件!",10,20);return;imageWidth=allImagesArrayO.ge

31、tWidth(this);获取被加载的图像的高度imageHeight=allImagesAiTayO.getHeight(this);获取被加载的图像的宽度)publicvoidrun()if(!aHImagesLoaded)loadAHEarthlmageO;)repaint();while(true)trydisplaylmage(giiiGraphics);currentlmagelndex+;if(currentimageindex=NUMBER_IMAGES)currentimageindex=0:)if(Thread.currentThread()=this.earthMulti

32、Thread)Thread.sleep(50);)elseThread.sleep(10);)catch(InterruptedExceptione)stop();)privatevoiddisplayImage(Graphicsg)if(!allImagesLoaded)识别所有的图像文件是否已经加载完毕return;1this.earthCenterXO=(getSize().width-imageWidth)/2;this.earthCenterYO=(getSize().height-imageHeight)/2;if(Thread.currentThread()=this.earth

33、MultiThread)g.drawIinage(allImagesArraycurrentImageIndex,earthCenterXO,earthCenterYO,null);)elsethis.moonCenterXO=earthCenterX0+(int)(this.circleRadius*Math.cos(currentRotatingAngle*Math.PI/180);this.moonCenterYO=earthCenterY0+(int)(this.circleRadius*Math.sin(currentRotatingAngle*Math.PI/180);g.draw

34、Image(allIinagesArraycurrentImageIndex,moonCenterXOjnoonCenterY0.null);this.currentRotatingAngle+;if(currentRotatingAngle>360)currentRotatingAngle=0;)publicvoidpaint(Graphicsg)if(allImagesLoaded)/Rectangler=g.getClipBounds();g.clearRect(O,0,this.getWidth(),this.getHeight();displaylmage(g);)elseg.

35、drawString("正在加载图像,请等待10,20);)在displayImage。方法中图片显示的位置。3、测试现在的效果2小程后查看器EaurtUlnetAipplet.c.小程序小程序已启动。小程序己启动.背景图上留下每个动作的残迹,因此必须对图像进行擦除。再次明确计算机实现动画的思路是:定位、画、擦除、再画、再擦除。其中擦除图像的方法决定着该动画的制作方法。所以,擦除图像成了制作动画的一个关键部分。4、实现清除的相关功能实现的代码示例import;import;import;import;import;import;import;publicclassEarthPlane

36、tAppletextendsJAppletimplementsRunnableprivateThreadearthMultiThread=null;privateThreadnioonMultiThread=null;privateGraphicsguiGraphics;privateImagealllmagesArray;privateintcurrentImageIndex=O;privateintimageWidth=0;privateintimageHeight=0;19word格式支持编辑,如有帮助欢迎下载支持。privatebooleanalllmagesLoaded=false;

37、privatefinalintNUMBERMAGES=18;privatebooleanisRunedByApplication=false;intcurrentRotatingAngle=0;intearthCenterXO,eailhCenterYO,moonCenterXO,moonCenterYO;intcircleRadius=100;publicstaticvoidmain(Stringargs)EarthPlanetFrameapplicationJFrame=nulI:applicationJFrame=newEarthPlanetFrame(n,JJTJava实现的地球系动画

38、”);EarthPlanetAppletthreadApplet=null;threadApplet=newEarthPlanetApplet();applicationJFrame.getContentPane().add(nCenter'threadApplet);threadApplet.isRunedByApplication=true;threadApplet.init();threadApplet.start();applicationJFrame.setVisible(true);publicEarthPlanetApplet()publicvoidstart()if(e

39、arthMultiThread=null)earthMultiThread=newThread(this);earthMultiThread.start();)if(moonMultiThread=null)nioonMultiThread=newThread(this);moonMultiThread.start();)publicvoidstop()if(earthMultiThread!=null)earthMultiThread.stop();earthMultiThread=null;1if(nioonMultiThread!=null)moonMultiThread.stopO;n

40、ioonMultiThread=null;)publicvoidloadAlIEarthImage()guiGraphics=getGraphics();allImagesArray=newImageNUMBER_IMAGES;MediaTrackertracker=newMediaTracker(this);Stringstrlmage;for(intcurrentindex=1;currentindex<=NUMBERMAGES;currentIndex+)strimage=H/images/imgOOM+(currentindex<10)?H0H:+currentindex+

41、”.giF;URLoneImageURL=getClass().getResource(strImage);if(isRunedByApplication)alllmagesArrayfcurrentlndex-1=Toolkit.getDefaultToolkit().getIniage(oneIniageURL);elseallImagesArraycurrentIndex-1=getlmage(onelmageURL);tracker.addImage(allImagesArraycurrentIndex-1,0);)trytracker.waitForAll();catch(Inter

42、ruptedExceptione)e.printStackTrace();)alllmagesLoaded=!tracker.isErrorAny();if(!allIniagesLoaded)stop();guiGraphics.drawString("图像加载错误,可能是没有找到文件!",10,40);return;)imageWidth=allImagesArrayO.getWidth(this);imageHeight=allImagesArrayO.getHeight(this);Ipublicvoidrun()if(!aIIIniagesLoaded)loadAHEarthlmageO;)repaint();while(true)trydisplaylmage(guiGraphics);currentlmagelndex+;if(currentimageindex=NUMBERMAGES)currentimageindex=0:if(Thread.currentThread()=earthMultiThread)Thread.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论