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

下载本文档

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

文档简介

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

2、rt java.awt.Rectangle;import java.awt.Toolkit;import javax.swing.JApplet;import .URL;public class EarthPlanetApplet extends JApplet implements Runnableprivate Thread earthMultiThread = null;private Thread moonMultiThread = null;private Graphics guiGraphics;private Image allImagesArray;private int cu

3、rrentImageIndex=0;private int imageWidth = 0;private int imageHeight = 0;private boolean allImagesLoaded = false;private final int NUMBER_IMAGES = 18;private boolean isRunedByApplication = false;public static void main(String args) EarthPlanetFrame applicationJFrame=null;applicationJFrame=new EarthP

4、lanetFrame("利用Java实现的地球系动画");EarthPlanetApplet threadApplet=null;threadApplet=new EarthPlanetApplet();applicationJFrame.getContentPane().add("Center", threadApplet);threadApplet.isRunedByApplication = true;threadApplet.init();threadApplet.start();applicationJFrame.setVisible(true

5、); public EarthPlanetApplet()public void start()if (earthMultiThread = null)earthMultiThread = new Thread(this);earthMultiThread.start();if (moonMultiThread = null) /创建出第2个线程对象moonMultiThread = new Thread(this);moonMultiThread.start();public void stop()if (earthMultiThread != null)earthMultiThread.s

6、top();earthMultiThread = null;if (moonMultiThread != null) /销毁线程对象moonMultiThread.stop();moonMultiThread = null;public void loadAllEarthImage()guiGraphics = getGraphics();allImagesArray = new ImageNUMBER_IMAGES;MediaTracker tracker = new MediaTracker(this);String strImage;for (int currentIndex = 1;

7、currentIndex <= NUMBER_IMAGES; currentIndex+)strImage = "/images/img00" + (currentIndex < 10) ? "0" : "") + currentIndex + ".gif"URL oneImageURL=getClass().getResource(strImage);if (isRunedByApplication)allImagesArraycurrentIndex-1 =Toolkit.getDefaultToo

8、lkit().getImage(oneImageURL);else allImagesArraycurrentIndex-1 = getImage(oneImageURL); tracker.addImage(allImagesArraycurrentIndex-1, 0);try tracker.waitForAll(); catch (InterruptedException e) e.printStackTrace();allImagesLoaded = !tracker.isErrorAny();if (!allImagesLoaded) stop(); guiGraphics.dra

9、wString("图像加载错误,可能是没有找到文件!", 10, 40); return;imageWidth = allImagesArray0.getWidth(this);imageHeight = allImagesArray0.getHeight(this);public void run() if (!allImagesLoaded) loadAllEarthImage(); repaint();while (true)trydisplayImage(guiGraphics);currentImageIndex+;if (currentImageIndex =

10、NUMBER_IMAGES)currentImageIndex = 0;Thread.sleep(50);catch (InterruptedException e)stop();private void displayImage(Graphics g) /分别显示两个地球图像if (!allImagesLoaded)return; if(Thread.currentThread()=earthMultiThread)g.drawImage(allImagesArraycurrentImageIndex, (getSize().width - imageWidth) / 2, (getSize

11、().height - imageHeight) / 2, null); else /改变坐标位置 g.drawImage(allImagesArraycurrentImageIndex, (getSize().width - imageWidth) / 4, (getSize().height - imageHeight) / 4, null);public void paint(Graphics g)if (allImagesLoaded)unds();g.clearRect(r.x, r.y, r.width, r.height);displayImage(g);elseg.drawSt

12、ring("正在加载图像,请等待.", 10, 20);上面的代码主要是再创建出第2个线程,并显示出第2套图像。其中的getClipBounds方法得到代表画板边界的矩形,然后从这个矩形中提取宽度和高度数据,再清除该矩形区域。如果除掉下面的语句,将会出现什么现象?g.clearRect(r.x, r.y, r.width, r.height);2、Applet程序方式执行(两个转动的图像)3、应用程序方式执行(两个转动的图像)二、第二步:控制两个地球线程的旋转的速度1、需要补充的知识sleep(毫秒数)是Thread类的静态方法,它能够控制线程。如Thread.sleep(

13、1000);该线程睡眠1秒钟,等1秒钟之后,继续余下代码执行。但在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非出现下面的情况:1) “醒来”的线程具有更高的优先级。 2) 正在运行的线程因为其它原因而阻塞。2、EarthPlanetApplet程序的代码import java.awt.Graphics;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Rectangle;import java.awt.Toolkit;imp

14、ort javax.swing.JApplet;import .URL;public class EarthPlanetApplet extends JApplet implements Runnableprivate Thread earthMultiThread = null;private Thread moonMultiThread = null;private Graphics guiGraphics;private Image allImagesArray;private int currentImageIndex=0;private int imageWidth = 0;priv

15、ate int imageHeight = 0;private boolean allImagesLoaded = false;private final int NUMBER_IMAGES = 18;private boolean isRunedByApplication = false;public static void main(String args) EarthPlanetFrame applicationJFrame=null;applicationJFrame=new EarthPlanetFrame("利用Java实现的地球系动画");EarthPlane

16、tApplet threadApplet=null;threadApplet=new EarthPlanetApplet();applicationJFrame.getContentPane().add("Center", threadApplet);threadApplet.isRunedByApplication = true;threadApplet.init();threadApplet.start();applicationJFrame.setVisible(true); public EarthPlanetApplet()public void start()i

17、f (earthMultiThread = null)earthMultiThread = new Thread(this);earthMultiThread.start();if (moonMultiThread = null)moonMultiThread = new Thread(this);moonMultiThread.start();public void stop()if (earthMultiThread != null)earthMultiThread.stop();earthMultiThread = null;if (moonMultiThread != null)moo

18、nMultiThread.stop();moonMultiThread = null;public void loadAllEarthImage()guiGraphics = getGraphics();allImagesArray = new ImageNUMBER_IMAGES;MediaTracker tracker = new MediaTracker(this);String strImage;for (int currentIndex = 1; currentIndex <= NUMBER_IMAGES; currentIndex+)strImage = "/ima

19、ges/img00" + (currentIndex < 10) ? "0" : "") + currentIndex + ".gif"URL oneImageURL=getClass().getResource(strImage);if (isRunedByApplication)allImagesArraycurrentIndex-1 =Toolkit.getDefaultToolkit().getImage(oneImageURL);else allImagesArraycurrentIndex-1 = getI

20、mage(oneImageURL); tracker.addImage(allImagesArraycurrentIndex-1, 0);try tracker.waitForAll(); catch (InterruptedException e) e.printStackTrace();allImagesLoaded = !tracker.isErrorAny();if (!allImagesLoaded) stop(); guiGraphics.drawString("图像加载错误,可能是没有找到文件!", 10, 40); return;imageWidth = a

21、llImagesArray0.getWidth(this);imageHeight = allImagesArray0.getHeight(this);public void run() if (!allImagesLoaded) loadAllEarthImage(); repaint();while (true)trydisplayImage(guiGraphics);currentImageIndex+;if (currentImageIndex = NUMBER_IMAGES)currentImageIndex = 0;if(Thread.currentThread()=earthMu

22、ltiThread)Thread.sleep(50);elseThread.sleep(500);catch (InterruptedException e)stop();private void displayImage(Graphics g)if (!allImagesLoaded)return;if(Thread.currentThread()=earthMultiThread)g.drawImage(allImagesArraycurrentImageIndex, (getSize().width - imageWidth) / 2, (getSize().height - image

23、Height) / 2, null); else g.drawImage(allImagesArraycurrentImageIndex, (getSize().width - imageWidth) / 4, (getSize().height - imageHeight) / 4, null);public void paint(Graphics g)if (allImagesLoaded)Rectangle r = g.getClipBounds();g.clearRect(r.x, r.y, r.width, r.height);displayImage(g);elseg.drawSt

24、ring("正在加载图像,请等待.", 10, 20);在程序中通过对两个不同的线程采用不同的“休眠”时间,控制两个线程的频率,相应地也就达到控制地球的“自转”,并且还能够控制“自转”的速度。3、Applet程序方式执行,但此时的两个球的旋转速度有差别4、应用程序方式执行,但此时的两个球的旋转速度有差别三、第三步:月亮围着地球转1、需要补充的知识圆周方程 (1)下面的earthCenterX0、earthCenterY0代表地球的圆心坐标earthCenterX0=(getSize().width - imageWidth)/ 2;earthCenterY0=(getSiz

25、e().height - imageHeight)/2;(2)下面的moonCenterX0、moonCenterY0代表地球的圆心坐标moonCenterX0=earthCenterX0+circleRadius* Math.cos(currentRotatingAngle*Math.PI/180);moonCenterY0=earthCenterY0+n(currentRotatingAngle*Math.PI/180);因此,为了能够产生动态的运行效果,需要在显示图片的同时改变图像显示的位置,连续不断地在不同位置处画出地球的图像。2、EarthPlanetApplet程序代码import

26、 java.awt.Graphics;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Rectangle;import java.awt.Toolkit;import .URL;import javax.swing.JApplet;public class EarthPlanetApplet extends JApplet implements Runnableprivate Thread earthMultiThread = null;private Thread moonMultiThread = nul

27、l;private boolean isRunedByApplication = false; /设置程序执行的方式private Graphics guiGraphics;/下面的变量都是与图像有关的变量private Image allImagesArray;private int currentImageIndex=0;private int imageWidth = 0;private int imageHeight = 0;private boolean allImagesLoaded = false;private final int NUMBER_IMAGES = 18;int

28、earthCenterX0,earthCenterY0,moonCenterX0,moonCenterY0;int currentRotatingAngle=0;int circleRadius=100;public EarthPlanetApplet()public static void main(String args) EarthPlanetFrame applicationJFrame=null;applicationJFrame=new EarthPlanetFrame("利用Java实现的地球系动画");EarthPlanetApplet threadAppl

29、et=null;threadApplet=new EarthPlanetApplet();applicationJFrame.getContentPane().add("Center", threadApplet);applicationJFrame.setVisible(true);threadApplet.isRunedByApplication = true;threadApplet.init();threadApplet.start(); public void start() /在重写的start()方法中创建线程对象if (earthMultiThread =

30、null)earthMultiThread = new Thread(this);earthMultiThread.start();if (moonMultiThread = null)moonMultiThread = new Thread(this);moonMultiThread.start();public void stop() /在重写的stop()方法中销毁线程对象if (earthMultiThread != null) earthMultiThread.stop(); /注意终止线程的方式应该采用其它更好的形式earthMultiThread = null;if (moonM

31、ultiThread != null)moonMultiThread.stop(); /注意终止线程的方式应该采用其它更好的形式moonMultiThread = null;public void loadAllEarthImage()guiGraphics = getGraphics();allImagesArray = new ImageNUMBER_IMAGES;MediaTracker tracker = new MediaTracker(this);String strImage = null;for (int currentIndex = 1; currentIndex <=

32、 NUMBER_IMAGES; currentIndex+)strImage = "/images/img00" + (currentIndex < 10) ? "0" : "") + currentIndex + ".gif"URL oneImageURL=getClass().getResource(strImage);if (isRunedByApplication)allImagesArraycurrentIndex-1 =Toolkit.getDefaultToolkit().getImage(on

33、eImageURL);else allImagesArraycurrentIndex-1 = getImage(oneImageURL); tracker.addImage(allImagesArraycurrentIndex-1, 0);try rAll(); catch (InterruptedException e) e.printStackTrace();allImagesLoaded = !tracker.isErrorAny();/allImagesLoaded = tracker.checkAll();if (!allImagesLoaded) stop(); guiGraphi

34、cs.drawString("图像加载错误,可能是没有找到文件!", 10, 20); return;imageWidth = allImagesArray0.getWidth(this); /获取被加载的图像的高度imageHeight = allImagesArray0.getHeight(this);/获取被加载的图像的宽度public void run() if (!allImagesLoaded) loadAllEarthImage(); repaint();while(true)trydisplayImage(guiGraphics);currentImageI

35、ndex+;if (currentImageIndex = NUMBER_IMAGES)currentImageIndex = 0;if(Thread.currentThread()=this.earthMultiThread)Thread.sleep(50);elseThread.sleep(10);catch (InterruptedException e)stop();private void displayImage(Graphics g)if (!allImagesLoaded) /识别所有的图像文件是否已经加载完毕return;this.earthCenterX0=(getSize

36、().width - imageWidth) / 2;this.earthCenterY0=(getSize().height - imageHeight) / 2;if(Thread.currentThread()=this.earthMultiThread)g.drawImage(allImagesArraycurrentImageIndex,earthCenterX0,earthCenterY0, null);elsethis.moonCenterX0=earthCenterX0+(int)(this.circleRadius*Math.cos(currentRotatingAngle*

37、Math.PI/180);this.moonCenterY0=earthCenterY0+(int)(this.circleRadius*Math.sin(currentRotatingAngle*Math.PI/180);g.drawImage(allImagesArraycurrentImageIndex,moonCenterX0,moonCenterY0, null);this.currentRotatingAngle+;if(currentRotatingAngle>360)currentRotatingAngle=0;public void paint(Graphics g)i

38、f (allImagesLoaded)/Rectangle r = g.getClipBounds();g.clearRect(0, 0, this.getWidth(), this.getHeight();displayImage(g);elseg.drawString("正在加载图像,请等待.", 10, 20);在displayImage()方法中图片显示的位置。3、测试现在的效果背景图上留下每个动作的残迹,因此必须对图像进行擦除。再次明确计算机实现动画的思路是:定位、画、擦除、再画、再擦除。其中擦除图像的方法决定着该动画的制作方法。所以,擦除图像成了制作动画的一个关

39、键部分。4、实现清除的相关功能实现的代码示例import java.awt.Graphics;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Rectangle;import java.awt.Toolkit;import javax.swing.JApplet;import .URL;public class EarthPlanetApplet extends JApplet implements Runnableprivate Thread earthMultiThread = null;private

40、Thread moonMultiThread = null;private Graphics guiGraphics;private Image allImagesArray;private int currentImageIndex=0;private int imageWidth = 0;private int imageHeight = 0;private boolean allImagesLoaded = false;private final int NUMBER_IMAGES = 18;private boolean isRunedByApplication = false;int

41、 currentRotatingAngle=0;int earthCenterX0,earthCenterY0,moonCenterX0,moonCenterY0;int circleRadius=100;public static void main(String args) EarthPlanetFrame applicationJFrame=null;applicationJFrame=new EarthPlanetFrame("利用Java实现的地球系动画");EarthPlanetApplet threadApplet=null;threadApplet=new

42、EarthPlanetApplet();applicationJFrame.getContentPane().add("Center", threadApplet);threadApplet.isRunedByApplication = true;threadApplet.init();threadApplet.start();applicationJFrame.setVisible(true); public EarthPlanetApplet()public void start()if (earthMultiThread = null)earthMultiThread

43、 = new Thread(this);earthMultiThread.start();if (moonMultiThread = null)moonMultiThread = new Thread(this);moonMultiThread.start();public void stop()if (earthMultiThread != null)earthMultiThread.stop();earthMultiThread = null;if (moonMultiThread != null)moonMultiThread.stop();moonMultiThread = null;

44、public void loadAllEarthImage()guiGraphics = getGraphics();allImagesArray = new ImageNUMBER_IMAGES;MediaTracker tracker = new MediaTracker(this);String strImage;for (int currentIndex = 1; currentIndex <= NUMBER_IMAGES; currentIndex+)strImage = "/images/img00" + (currentIndex < 10) ?

45、"0" : "") + currentIndex + ".gif"URL oneImageURL=getClass().getResource(strImage);if (isRunedByApplication)allImagesArraycurrentIndex-1 =Toolkit.getDefaultToolkit().getImage(oneImageURL);else allImagesArraycurrentIndex-1 = getImage(oneImageURL); tracker.addImage(allImag

46、esArraycurrentIndex-1, 0);try tracker.waitForAll(); catch (InterruptedException e) e.printStackTrace();allImagesLoaded = !tracker.isErrorAny();if (!allImagesLoaded) stop(); guiGraphics.drawString("图像加载错误,可能是没有找到文件!", 10, 40); return;imageWidth = allImagesArray0.getWidth(this);imageHeight = allImagesArray0.getHeight(this);public void run() if (!allImagesLoaded) loadAllEarthImage(); repai

温馨提示

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

评论

0/150

提交评论