首页 > 代码库 > 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_太阳系_行星模型_小游戏练习_详细注释
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。