首页 > 代码库 > Java_太阳系_行星模型_小游戏练习_详细注释

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

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

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

技术分享

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