




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美术禁毒活动方案
- 企业劳务合同管理要点解析
- 神像开光活动方案
- 端午疫情活动方案
- 2025年中国油炸薯片数据监测报告
- 绿色2000吨年废弃物回收资源化利用可行性研究报告
- 金融机构理财产品风险评估与2025年投资者适当性管理在金融机构的实践应用报告
- ktv白色情人节活动方案
- GB/T 4095-2025商用汽车辐板式车轮在轮毂上的安装尺寸
- 水坝混凝土幕墙施工方案
- 2025年电子乐器行业研究报告及未来行业发展趋势预测
- 2025至2030年中国招投标行业发展潜力分析及投资战略咨询报告
- 2025至2030中国矿山机械行业发展趋势分析与未来投资战略咨询研究报告
- 2025年乡镇文旅部门工作人员招聘考试必-备知识点与模拟题集
- 2025年法学硕士专业知识考试试卷及答案解析
- GB 26488-2025镁合金压铸安全生产规范
- 抖音达人签约合同协议书
- 焦虑症的课件
- 2025年招聘面试技巧指南面试官角度下的面试题预测与应对策略
- 答案时代:AI顾问式电商崛起
- 新型集体经济课件
评论
0/150
提交评论