学完javaee基础,编的一个小游戏—太阳系的八大行星
要使太阳系的八大行星,围绕着太阳运转,这中间要运用到Java基础课本中的许多知识点,包括:继承,封装,多态,有参/无参构造器,图片加载,窗口定义,多线程,算法等。
现在为大家一步步讲解如何编写这个小游戏,
1) 首先,编写代码之前,你们要用到这个软件eclipse ,专门用来编译并运行这些程序 打开下面网址进行下载:http://www.eclipse.org/downloads/
2)下载安装并打开会看到这个界面:
3)要想行星围绕太阳运转,则必须加载出一个窗口,让其能展现出来
1)创建一个加载窗口的类,代码如下:
package cn.liyaozhou.util;
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_HIGH, Constant.GAME_WIDTH);
// 定义窗口位置
setLocation(100,10);
// 定义窗口是可看见的
setVisible(true);
new PaintThread().start();// 启动重画线程
// 增加个窗口监听
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
/**
* 定义一个重画窗口的线程类,是一个内部类
*
* @param liyaozhou
*/
class PaintThread extends Thread {
public void run() {
while (true) {
repaint();
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
2) 窗口出来之后,然后要加载图片,定义一个加载图片的类,代码如下:
package cn.liyaozhou.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
/**
* 游戏开发中常用的工具类(比如:加载图片等方法)
*
* @author liyaozhou
*
*/
public class Picture {
public static Image getImage(String path) {
URL u = Picture.class.getClassLoader().getResource(path);
BufferedImage img = null;
try {
img = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
}
3) 窗口,图片都定义好之后,然后编写代码让其8大行星围绕太阳运转,代码如下:
package cn.liyaozhou.salor;
import java.awt.Graphics;
import java.awt.Image;
import cn.liyaozhou.util.Constant;
import cn.liyaozhou.util.MyFrame;
import cn.liyaozhou.util.Picture;
/**
* 太阳系的主窗口
*
* @author dell
*
*/
public class SolarFrame extends MyFrame {
Image img = Picture.getImage("imager/bg.jpg");
Star sun = new Star("imager/sun.jpg", Constant.GAME_HIGH / 2,
Constant.GAME_WIDTH / 2);
Planet mercury = new Planet(sun, "imager/Mercury.jpg", 50, 30, 0.6);// 水星
Planet venus = new Planet(sun, "imager/Venus.jpg", 80, 50, 0.4); // 金星
Planet earth = new Planet(sun, "imager/Earth.jpg", 120, 75, 0.25); // 地球
Planet mars = new Planet(sun, "imager/Mars.jpg", 170, 120, 0.18); // 火星
Planet jupiter = new Planet(sun, "imager/Jupiter.jpg", 210, 150, 0.15); // 木星
Planet saturn = new Planet(sun, "imager/Saturn.jpg", 240, 180, 0.1);// 土星
Planet uranus = new Planet(sun, "imager/Uranus.jpg", 320, 220, 0.07); // 天王星
Planet neptune = new Planet(sun, "imager/Neptune.jpg", 370, 280,0.04 ); // 海王星
public void paint(Graphics g) {
g.drawImage(img, 0, 0, null);
sun.draw(g);
mercury.draw(g);
venus.draw(g);
earth.draw(g);
mars.draw(g);
jupiter.draw(g);
saturn.draw(g);
uranus.draw(g);
neptune.draw(g);
}
public static void main(String[] args) {
new SolarFrame().launchFrame();
}
}
4) 最后出来的运行结果如下:
最后将总的代码上传进来:
需要在eclipse软件中创建两个包( package),和一个文件夹(folder)。
创建包和文件夹的时候在界面的左半边点击鼠标右键,然后再new中选中package 和folder
1)包名应该倒着命名 比如:cn.liyaozhou.solar
2)文件夹命名一般用小写英文字母。比如:imager
如下图
3)创建完2个包和一个文件夹之后,在第一个包中创建三个类名 将鼠标放入包那快,单击鼠标右键,选择class 然后为其命名Planet,SolarFrame,Star 等三个类
在第二个包中创建三个类名 将鼠标放入包那快,单击鼠标右键,选择class 然后为其命名Constant,MyFrame,Picture 等三个类
下面是六个类的代码分别如下:
1 Planet
package cn.liyaozhou.salor;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import cn.liyaozhou.util.Picture;
public class Planet extends Star {
// 除了图片,坐标。行星沿着某个椭圆运行;长轴,短轴 速度。绕着某个 Star飞。
double longAxis; // 椭圆的长轴;
double shortAxis; // 椭圆的短轴;
double speed; // 飞行的速度;
double degree;// 飞行的角度
Star center; // 太阳的中心
public void draw(Graphics g) { // Graphics 制图 (重画)
super.draw(g); // 调用父类画的太阳。
drawTrace(g); // 画出 地球绕着太阳转的轨迹
move();// 调用地球移动的轨迹
}
public void drawTrace(Graphics g) {
// 定义地球绕太阳转的轨迹
double ovalX; // 定义地球绕太阳旋转的长轴
double ovalY; // 定义地球绕太阳旋转的短轴
double ovalWidth; // 定义地球绕太阳旋转的总宽度
double ovalHeight; // 定义地球绕太阳旋转的总高度
ovalWidth = longAxis * 2;// 总宽度等于椭圆的长轴x2;
ovalHeight = shortAxis * 2;// 总高度等于椭圆的短轴x2;
ovalX = (center.x + center.width / 2) - longAxis;
ovalY = (center.y + center.height / 2) - shortAxis;
// 保存原来的颜色;
Color c = g.getColor();
// 创建一个新的颜色
g.setColor(Color.blue);
// 画出椭圆的轨迹
g.drawOval((int) ovalX, (int) ovalY, (int) ovalWidth, (int) ovalHeight);
// 恢复原先的颜色
g.setColor(c);
}
public void move() {
// 沿着椭圆轨迹飞行
x = center.x + longAxis * Math.cos(degree); // 太阳的圆心+椭圆长轴*每次旋转所转过的角度
y = center.y + shortAxis * Math.sin(degree);// 太阳的圆心+椭圆短轴*每次旋转所转过的角度
degree += speed; // 每旋转一次角度加1
}
public Planet(Star center, String imgpath, double longAxis,
double shortAxis, double speed) {
this.center = center;
this.x = center.x + longAxis; // 行星的x轴坐标等于太阳的x轴坐标加上长轴的坐标
this.y = center.y; // 行星的y轴坐标等于太阳的y轴坐标
this.img = Picture.getImage(imgpath);
this.longAxis = longAxis;
this.shortAxis = shortAxis;
this.speed = speed;
}
// 定义三个有参的行星构造器
public Planet(Image img, double x, double y) {
super(img, x, y);
}
// 定义三个有参的行星对的路径
public Planet(String imgpath, double x, double y) {
super(imgpath, x, y);
}
}
2) SolarFrame类
package cn.liyaozhou.salor;
import java.awt.Graphics;
import java.awt.Image;
import cn.liyaozhou.util.Constant;
import cn.liyaozhou.util.MyFrame;
import cn.liyaozhou.util.Picture;
/**
* 太阳系的主窗口
*
* @author dell
*
*/
public class SolarFrame extends MyFrame {
Image img = Picture.getImage("imager/bg.jpg");
Star sun = new Star("imager/sun.jpg", Constant.GAME_HIGH / 2,
Constant.GAME_WIDTH / 2);
Planet mercury = new Planet(sun, "imager/Mercury.jpg", 50, 30, 0.6);// 水星
Planet venus = new Planet(sun, "imager/Venus.jpg", 80, 50, 0.4); // 金星
Planet earth = new Planet(sun, "imager/Earth.jpg", 120, 75, 0.25); // 地球
Planet mars = new Planet(sun, "imager/Mars.jpg", 170, 120, 0.18); // 火星
Planet jupiter = new Planet(sun, "imager/Jupiter.jpg", 210, 150, 0.15); // 木星
Planet saturn = new Planet(sun, "imager/Saturn.jpg", 240, 180, 0.1);// 土星
Planet uranus = new Planet(sun, "imager/Uranus.jpg", 320, 220, 0.07); // 天王星
Planet neptune = new Planet(sun, "imager/Neptune.jpg", 370, 280,0.04 ); // 海王星
public void paint(Graphics g) {
g.drawImage(img, 0, 0, null);
sun.draw(g);
mercury.draw(g);
venus.draw(g);
earth.draw(g);
mars.draw(g);
jupiter.draw(g);
saturn.draw(g);
uranus.draw(g);
neptune.draw(g);
}
public static void main(String[] args) {
new SolarFrame().launchFrame();
}
}
3)Star类
package cn.liyaozhou.salor;
import java.awt.Graphics;
import java.awt.Image;
import cn.liyaozhou.util.Picture;
public class Star {
Image img; // 定义太阳的图片
double x, y; // 定义太阳的长和宽
double width, height; // 定义太阳的高度与宽度
public void draw(Graphics g) { // Graphics 制图
// 画出太阳所在的位置
g.drawImage(img, (int) x, (int) y, null);
}
// 定义个无参的太阳构造器
public Star() {
}
// 定义个有参的太阳构造器
public Star(Image img, double x, double y) {
this.img = img;
this.x = x;
this.y = y;
}
// 定义个有参的图片路径
public Star(String imgpath, double x, double y) {
this.img = Picture.getImage(imgpath);
this.x = x;
this.y = y;
}
}
6)Picture 类
package cn.liyaozhou.util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
/**
* 游戏开发中常用的工具类(比如:加载图片等方法)
*
* @author liyaozhou
*
*/
public class Picture {
public static Image getImage(String path) {
URL u = Picture.class.getClassLoader().getResource(path);
BufferedImage img = null;
try {
img = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
}
下面是文件夹(folder)存放的图片 将这些图片下载出来直接复制粘贴到那个文件夹里
添加完之后,所有程序就全部完成,点击运行 将鼠标放在SolarFrame类的代码处,单击右键,会看到Run As 然后运行就OK。