Java_太阳系_行星模型_小游戏练习_详细注释
//实现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();
}
}
//本程序只添加了太阳,地球,月球,火星,其余可以自行添加,使用封装好的方法,只用十分简洁的代码即可
Java_太阳系_行星模型_小游戏练习_详细注释的更多相关文章
- 如何在CentOS上安装一个2048小游戏
如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...
- c语言----<项目>_小游戏<2048>
2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...
- 【转】PV3D的小练习~太阳系八大行星
转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...
- Java太阳系小游戏分析和源代码
Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...
- luoguP2526_[SHOI2001]小狗散步_二分图匹配
luoguP2526_[SHOI2001]小狗散步_二分图匹配 题意: Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点 ...
- BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP
BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...
- 3D高清电商购物小图标图片_在线商城三维icon图标素材大全
3D高清电商购物小图标图片_在线商城三维icon图标素材大全
- Swift实战之2048小游戏
上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...
- .NET手撸2048小游戏
.NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...
随机推荐
- 个人理解c#对称加密 非对称加密 散列算法的应用场景
c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 ...
- iOS XCode7制作.Framework动态库和.a静态库的总结
一.开发SDK时的支持情况: OC语言制作动态库时,支持iOS8+:OC语言制作静态库,支持iOS7+. Swift语言制作动态库时,支持iOS8+;Swift不支持静态库. 对于SDK来说,支持情况 ...
- 统一的Json组件和csv下载组件
java-web-common java-web-common Json组件 目标和用途 规范Json接口格式 Controller中一律返回Java object,组件将自动转换数据格式,满足Jso ...
- System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本问题
出错的原因: 1.虽然报的是需要安装客户端8.1.7及以上版本,实际是由于.NET账户没有访问Oracle\bin文件夹的权限 2.在 Windows Server 2003/2008 或Window ...
- javaweb 基于java Servlet登入 简单入门案例
项目流程 第一步:创建一个java webproject第二步:创建三个界面,1,login.jsp 2 success.jsp 3 fail.jsp第三步:更改新建界面编码格式,utf-8 默然编码 ...
- Android Automotive开发之一《环境: JDK7&JDK8切换 》
http://ubuntuhandbook.org/index.php/2015/01/install-openjdk-8-ubuntu-14-04-12-04-lts/ 安装OpenJDK8 sud ...
- 20145212——GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 测试代码 #include <stdio.h> short val = 1; int vv = 2; int g(int xxx) { return xxx + ...
- Java/C++之 public、protected、private ; virtual & abstract
一.绪 Java/C++都是面向对象的第三代计算机高级编程语言,其本质雷同,而语法确有差异,稍不注意容易引起混淆.本文总结了一些这两门语言的差异之处,仅供参考. 二.C++ 对于C++这门语言,就其类 ...
- 记一次ss故障
本文主要参考: https://github.com/shadowsocks/shadowsocks shadowssocks 分为客户端和服务器端. 我们平时买的服务,使用是要用的是客户端. 如果你 ...
- linux中rz中的-e选项
linux shell rz和sz是终端下常用的文件传输命令,rz和sz通过shell被调用,其中rz用于从启用终端的系统上传文件到目标系统(终端登录的目标系统), 这里不过多介绍这些命令,只是记录一 ...