您的位置:首页 > 编程语言 > Java开发

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

2016-12-08 22:21 423 查看
//实现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();
}
}


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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: