学完javaee基础,编的一个小游戏—太阳系的八大行星

学完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;

}

}


4)Constant类 

package cn.liyaozhou.util;

public class Constant {
public static final int GAME_WIDTH = 850;
 public static final int GAME_HIGH = 800;
}

5)Myframe 类

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();
}
}
}
}
}


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。



 
 


猜你喜欢

转载自blog.csdn.net/weixin_38201936/article/details/78225961