学完javaee基础,编的一个小游戏—太阳系的八大行星
项目完整代码已放到码云上 自行下载: https://gitee.com/tutu_57893_7590/planets
学完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。
学完javaee基础,编的一个小游戏—太阳系的八大行星相关推荐
- c语言小游戏 精简_【原创】用非常简单的c语言自编的一个小游戏
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 修改过后: #include #include void js(int); int qian = 1000; int x = 0; int main() ...
- 学完java基础语法之后用来练习的不依赖框架的小项目
刚学完一门语言基础语法之后,一般都需要写一些小项目来检验我们的学习效果,将所学的基础语法串联起来,同时也熟悉一下用这门语言做项目的大概流程.但是此时学习的项目不能太复杂,因此此时才刚学完基础语法,太复 ...
- 学完css,做了一个csdn导航栏(一步一步做csdn导航栏,内容满满)
学完css,做了一个csdn导航栏,内容满满 步骤 1.导航栏框架 2.导航栏左边部分 3.导航栏中间部分 4.导航栏右边部分 5.搜索框聚焦和用户头像简介信息展示 知识点 完整代码 番外:本来打算做 ...
- unity做一个小游戏(适合零基础或者巩固加深unity中的工具类的用法)
今天跟着官方unity做了一个小游戏.巩固一下之前学习的unity的知识.注意unity的版本要在2018.3以上 大概游戏是这样子的如图:人物只能控制左右移动,空格发射饼干,动物从屏幕上方随机出现在 ...
- 适合刚学js小白熟悉运算符的一个小页面
** 适合刚学js小白熟悉运算符的一个小页 ** 刚学习js的小白,对于运算符上手的没那么快的,可以着手尝试一下这种简单,对逻辑提升比较快的小页面 因为我也是一个萌新,只是感觉这个页面帮助很大,所以分 ...
- 转王玮文章:我编的一个小段子让公众对区块链误会了两年
[孟岩按]王玮是我多年好友,江湖人称"玮哥". 十多年前在南天集团技术负责人的位置上,主持了当时全球最大的分布式核心银行系统的开发,开所谓"去 IOE" 之先声 ...
- 《教我兄弟学Android逆向03 破解第一个Android游戏 》
上一篇 <教我兄弟学Android逆向02 破解第一个Android程序 >我带着你破解了我们自己编的一个小程序 里面我分析并讲解的一些smali语法你都记住了 给你布置的课后作业你发 ...
- 表白小游戏教程:制作一个小游戏送给喜欢的TA(不会编程也能学会哦)
大家好哇~ 欢迎翻开波波和阿菌的长篇故事~ 不过捏,今天我们不讲故事,今天将由阿菌和大家分享一个小教程:教大家制作一个小游戏,可以用来送给喜欢的人.无须任何计算机专业基础,只要能操作电脑,并在初一的数 ...
- Java基础(飞机大战小游戏)
学校课程作品,Java简易飞机大战 涉及Java基础知识,通过编写对基础能有不错的巩固和拓展. 首先,先编写出游戏的窗口.游戏获胜条件以及main方法 package com.Mygame3.Plan ...
最新文章
- Maltego更新到4.1.6
- mvp的全称_现役最强外援,总决赛MVP,来到CBA之后赚了多少钱?
- java 手势识别_java – 如何在Android中实现手势识别
- 2019年十大AI创业死亡名单:无人车机器人为主,B轮阵亡最多
- 20155313 2016-2017-2 《Java程序设计》第二周学习总结
- 在表示计算机内存储器容量时 1gb等于,在表示计算机内存储器容量时,1GB等于_________MB...
- 人大计算机在职考研好考吗,人大在职研究生好考吗?通过率高吗?
- Nodejs开发框架Express3.0开发手记
- 蓝桥杯 BASIC-3 基础练习 字母图形
- 安徽新华学院计算机设计大赛,第十届中国大学生计算机设计大赛在安徽新华学院开幕...
- Android(java)学习笔记155:中文乱码的问题处理(qq登录案例)
- php url重写的模式,浅析ThinkPHP中的pathinfo模式和URL重写
- Gurobi运筹学开发教程04:拉格朗日分解技术及其实现
- 苹果设备解锁工具iToolab UnlockGo Mac
- Windows防火墙设置
- 数值分析Guass分解——错误讨论
- redis源码阅读三-终于把主线任务执行搞明白了
- pac代理模式什么意思_PAC是什么意思
- 使用Docker制作镜像并推送到镜像仓库
- SpeexDsp回音消除的一些理解