Java_太阳系_行星模型_小游戏练习_详细注释

 //实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MyFrame extends Frame {         //加载窗口         public void launchFrame() {             setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);       //设置窗口大小             setLocation(100, 100);   //设置左上角坐标,开始位置, 也就是窗口开始位置             setVisible(true);        //设置为可见(默认为不可见)             //启动重画线程             new PaintThread().start();             //匿名内部类---用来关闭窗口             addWindowListener(new WindowAdapter() {                 @Override                 public void windowClosing(WindowEvent e) {                     System.exit(0);                 }             });         }         /**          * 定义一个重画窗口的线程类          * 是一个内部类(方便访问外部类属性)          */         class PaintThread extends Thread {             public void run() {                 while (true) {                     repaint();             //重画                     try {                         Thread.sleep(40);  //1s = 1000ms                     } catch (InterruptedException e) {                         e.printStackTrace();                     }                 }             }         } }
 package cn.xiaocangtian.Util; import java.awt.Image; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.ImageIcon; /**  * 游戏开发中常用的工具类(比如:加载图片等方法)  * @author admin  *  */ public class GameUtil {     private GameUtil () {} //工具类通常将构造方法私有     public static Image getImage(String path) { //        URL u = GameUtil.class.getClassLoader().getResource(path); //        BufferedImage img = null; //        try { //            img = ImageIO.read(u); //        } catch (IOException e) { //            e.printStackTrace(); //        } // //        return img;  //BufferedImage是Image子类,也算正确返回         return Toolkit.getDefaultToolkit().getImage(GameUtil.class.getClassLoader().getResource(path));     } }
 package cn.xiaocangtian.Solar; import java.awt.Graphics; import java.awt.Image; import cn.xiaocangtian.Util.GameUtil; //封装成类 //导入图片 public class Star {     Image img;                //用于导入图片     double x, y;              //图片位置     int width, height;        //图片长宽     public void draw(Graphics g) {         g.drawImage(img, (int)x, (int)y, null);     }     public Star() {          //子类要调用父类的默认造函数     }     public Star(Image img) {         this.img = img;         this.width = img.getWidth(null);         this.height = img.getHeight(null);     }     public Star(Image img, double x, double y) {         this(img);         this.x = x;         this.y = y;     }     //导入     public Star(String imgpath, double x, double y) {         this(GameUtil.getImage(imgpath), x, y);     } }
 package cn.xiaocangtian.Util; /**  * 游戏项目中用到的常量  * 单独负责常量  * @author admin  */ public class Constant {     public static final int GAME_WIDTH = 750;     public static final int GAME_HEIGHT = 600; }
 package cn.xiaocangtian.Solar; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import cn.xiaocangtian.Util.GameUtil; public class Planet extends Star {     //除了图片,坐标,行星沿着某个椭圆运行:长轴,短轴,速度, 角度,绕着某个Star飞     double longAxis;        //椭圆的长轴     double shortAxis;       //椭圆的短轴     double speed;           //飞行的速度     double degree;          //角度     Star center;            //中心     boolean satillite;      //标志是否是卫星     public void draw(Graphics g) {         super.draw(g);         move();         if (!satillite) {   //不是卫星再画出轨迹             drawTrace(g);         }     }     public void move() {         //沿着椭圆飞         x = (center.x + center.width/2) + longAxis * Math.cos(degree);         y = (center.y + center.height/2) + shortAxis * Math.sin(degree);         //速度不一样,所以增量也不同         degree += speed;     }     //画出行星的轨迹     public void drawTrace(Graphics g) {         double ovalX, ovalY, ovalWidth, ovalHeight;         ovalHeight = longAxis * 2;                         //长度即为长轴*2         ovalWidth = shortAxis * 2;         ovalX = (center.x + center.width/2) - longAxis;    //左上顶点为(中心.x + x.width/2) - 长轴         ovalY = (center.y + center.height/2) - shortAxis;         Color oldColor = g.getColor();         g.setColor(Color.blue);                            //设置轨迹颜色         g.drawOval((int)ovalX, (int)ovalY, (int)ovalHeight, (int)ovalWidth);         g.setColor(oldColor);     }     //需要调用父类的空构造器     public Planet(Star center, String imgpath, double longAxis,             double shortAxis, double speed) {         super(GameUtil.getImage(imgpath));         this.center = center;         this.x = center.x + longAxis;         //行星的位置         this.y = center.y;         this.longAxis = longAxis;             //当前行星的长轴         this.shortAxis = shortAxis;         this.speed = speed;         this.width = img.getWidth(null);         this.height = img.getHeight(null);     }     public Planet(Star center, String imgpath, double longAxis,             double shortAxis, double speed, boolean satellite) {         this(center, imgpath, longAxis, shortAxis, speed);         this.satillite = satellite;     }     public Planet(Image img, double x, double y) {         super(img, x, y);     }     public Planet(String imgpath, double x, double y) {         super(imgpath, x, y);     } }
 package cn.xiaocangtian.Solar; import java.awt.Graphics; import java.awt.Image; import cn.xiaocangtian.Util.Constant; import cn.xiaocangtian.Util.GameUtil; import cn.xiaocangtian.Util.MyFrame; /**  * 太阳系主窗口  * @author admin  *  */ public class SolarFrame extends MyFrame {     //导入背景     Image bg = GameUtil.getImage("images/yuzhou.png");     //这里是利用封装的类,导入图片     Star sun = new Star("images/sun.png", Constant.GAME_WIDTH / 2, Constant.GAME_HEIGHT / 2);     Planet earth = new Planet(sun, "images/polar.png", 150, 100, 0.1);     Planet moon = new Planet(earth, "images/moon.png", 30, 20, 0.3, true);     Planet Mars = new Planet(sun, "images/Mars.png", 200, 130, 0.2);     /**      * 可以继续添加 其他 行星,只需一行代码(已经封装好)      * ......      * ......      * ......      */     /**      * 重写重绘函数,此为回调函数,只需要实现,然后由系统自动调用      */     public void paint(Graphics g) {         g.drawImage(bg, 0, 0, null);         sun.draw(g);       //这里使用的是封装的方法         earth.draw(g);         moon.draw(g);         Mars.draw(g);         /***          * 还可以继续添加其他行星并绘制          * ..........          * ..........          * ..........          */     }     public static void main(String[] args) {         new SolarFrame().launchFrame();     } }

//本程序只添加了太阳,地球,月球,火星,其余可以自行添加,使用封装好的方法,只用十分简洁的代码即可