用Java模拟一个太阳系的轨迹运转
模拟一个太阳系的轨迹运转
- 分类封装各种工具类
- 窗口加载类:
- 项目常量类:
- 图片加载类:
- 行星类(Star.java):
- 星球类(Planet.java):
- 主类(SolarSystem.java):
- 文件夹Images:
- 运行效果:
分类封装各种工具类
应用一些必要的条件,比如加载窗口,图片的加载,动画的实现
窗口加载类:
package duxuan.zqx.Util;import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;public class MyFrame extends Frame {/*** 定义一个窗口的加载界面*/public void LoadWindow() {setLocation(200,200); //定义窗口左上角的位置在(200,200)setSize(Constant.MAX_WIDTH,Constant.MAX_HEIGHT); //定义窗口的宽度和高度setVisible(true); //窗口可视化new PaintThread().start(); //调用内部类的PaintThread 重画窗口addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}/*** 增加双缓冲技术清除屏幕的闪烁*/private Image offScreenImage = null; //利用双缓冲技术清除屏幕的闪烁public void update(Graphics g) {if(offScreenImage == null) {offScreenImage = this.createImage(Constant.MAX_WIDTH,Constant.MAX_HEIGHT);}Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);}/*** 定义一个重画窗口的线程类,是一个内部类* @param args*/class PaintThread extends Thread{public void run() {while(true) {repaint(); //重画窗口界面,一直重复调用加载窗口try {Thread.sleep(80); //1s = 1000ms,计算机休眠80ms} catch (InterruptedException e) {e.printStackTrace(); } }}}
}
项目常量类:
package duxuan.zqx.Util;public class Constant {public static final int MAX_WIDTH = 900; //窗口的最大宽度public static final int MAX_HEIGHT =800; //窗口的最大高度}
图片加载类:
package duxuan.zqx.Util; //包名import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;public class GameUtil {private GameUtil(){} //工具类最好将构造器私有了。public static Image getImage(String path){ URL u = GameUtil.class.getClassLoader().getResource(path); BufferedImage bi=null;try {bi = javax.imageio.ImageIO.read(u);} catch (IOException e) {e.printStackTrace();}return bi;}
}
行星类(Star.java):
这个主要是用于定义中心位置太阳,一切星球都围着太阳转
package duxuan.zqx.Util; import java.awt.Graphics;
import java.awt.Image;public class Star {Image img; //行星的图片double x,y; //行星的坐标double width,heigth; //行星图片的高度和宽度public Star(String path,double x,double y) { //重载构造方法this.img =GameUtil.getImage(path); //获取图片的路径this.x = x; //获取行星的x坐标this.y = y; //获取行星的y坐标this.width = img.getWidth(null); //获取行星图片的宽度this.heigth = img.getHeight(null); //获取行星图片的高度}Star(){}public void draw(Graphics g) { //把行星图片画在窗口显示出来g.drawImage(img, (int)x, (int)y, null);}
}
星球类(Planet.java):
继承父类行星类, 在添加一些星球需要的变量,把父类对象也作为该类的成员变量,重写父类的draw方法,增加一些方法去实现画椭圆轨迹以及星球绕着额太阳椭圆运转。
package duxuan.zqx.Util;import java.awt.Color;
import java.awt.Graphics;/*** 星球的定义,围绕着太阳椭圆旋转* @author ZQX**/
public class Planet extends Star {double longAxris; //椭圆的长轴double shortAxris; //椭圆的短轴double degree; //角度double speed; //旋转的速度Star center; //旋转中心,太阳
// double x1,y1;public Planet(Star center,String path,double longAxris, double shortAxris, double degree, double d) { //重载构造方法this.center = center; this.img = GameUtil.getImage(path); //获取图片的路径
// this.x1 = center.x+longAxris;
// this.y1 = center.y;this.x = center.x+longAxris; //初始化统一星球的x坐标在太阳右边加自身的长轴this.y = center.y; //初始化统一星球的y坐标是太阳的y坐标this.degree = degree; //给角度赋值this.speed = d; //给旋转速度赋值this.longAxris = longAxris; //给长轴赋值this.shortAxris = shortAxris; //给短轴赋值}public Planet(String path, double x, double y) {super(path, x, y); //调用父类的构造方法}public void draw(Graphics g) { //重写父类的draw方法
// g.drawImage(img, (int)x1, (int)y1, null);
// x1 = center.x+longAxris*Math.cos(degree);
// y1 = center.y+shortAxris*Math.sin(degree);super.draw(g); //调用父类方法进行行星图片画在窗口显示出来drawOval(g); //调用画椭圆轨迹的方法move(); //调用星球绕太阳椭圆运转}public void move() { //行星椭圆运转x = (center.x+center.width/2)+longAxris*Math.cos(degree); y = (center.y+center.heigth/2)+shortAxris*Math.sin(degree);degree +=speed;}public void drawOval(Graphics g) {double ovalX,ovalY,ovalWidth,ovalHeight; //定义画椭圆的x,y坐标,以及宽度和高度ovalX = (center.x+center.width/2) -longAxris; //椭圆的x坐标等于太阳的中心x坐标减去长轴ovalY = (center.y+center.heigth/2) -shortAxris;//椭圆的y坐标等于太阳的中心y坐标减去短轴ovalWidth = longAxris*2; //椭圆宽度是长轴的二倍ovalHeight = shortAxris*2; //椭圆高度是短轴的二倍Color c = g.getColor(); //获取毛笔的颜色g.setColor(Color.blue); //把笔的颜色改为蓝色g.drawOval((int)ovalX, (int)ovalY, (int)ovalWidth, (int)ovalHeight); //画椭圆轨迹g.setColor(c); //把笔再改回原来毛笔的颜色}}
主类(SolarSystem.java):
太阳系的主窗口
package duxuan.zqx.Solar;import java.awt.Graphics;
import java.awt.Image;import duxuan.zqx.Util.Constant;
import duxuan.zqx.Util.GameUtil;
import duxuan.zqx.Util.MyFrame;
import duxuan.zqx.Util.Planet;
import duxuan.zqx.Util.Star;/*** 太阳系的主窗口* @author ZQX**/
public class SolarSystem extends MyFrame{Image img = GameUtil.getImage("images/bg.jpg"); //获取背景图片的路径Star sun = new Star("images/sun.jpg",Constant.MAX_WIDTH/2,Constant.MAX_HEIGHT/2); //定义太阳的属性Planet earth = new Planet(sun, "images/Earth.jpg", 150, 80, 3.14/3, 0.17); //定义地球的属性Planet mercury = new Planet(sun, "images/Mercury.jpg", 100, 50, 3.14/3, 0.2);Planet venus = new Planet(sun, "images/Venus.jpg", 70, 30, 3.14/3, 0.25);Planet mars = new Planet(sun, "images/Mars.jpg", 180, 100, 3.14/3, 0.15);Planet jupiter = new Planet(sun, "images/Jupiter.jpg", 250, 150, 3.14/3, 0.13);Planet saturn = new Planet(sun, "images/Saturn.jpg", 300, 180, 3.14/3, 0.11);Planet uranus = new Planet(sun, "images/Uranus.jpg", 350, 210, 3.14/3, 0.09);
// Planet neptune = new Planet(sun, "images/Ueptune.jpg", 400, 240, 3.14/3, 0.08);public void paint(Graphics g) {g.drawImage(img, 0, 0, null);sun.draw(g);earth.draw(g);mercury.draw(g);venus.draw(g);mars.draw(g);jupiter.draw(g);saturn.draw(g);uranus.draw(g);
// neptune.draw(g); 图片加载异常}public static void main(String[] args) {new SolarSystem().LoadWindow(); //调用MyFram类的LoadWindow()加载窗口。
// Star sun = new Star();
// sun.Star(i, Constant.MAX_WIDTH/2, Constant.MAX_HEIGHT/2);}
}
文件夹Images:
各种星球的图片包括太阳
运行效果:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
