//实现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_太阳系_行星模型_小游戏练习_详细注释的更多相关文章

  1. 如何在CentOS上安装一个2048小游戏

    如何在centos上安装一个2048小游戏 最近在学习CentOS系统,就琢磨着玩点什么,然后我看到有人在玩2048小游戏,所有我就在想,为啥不装一个2048小游戏搞一下嘞,于是乎,我就开始工作啦 由 ...

  2. c语言----<项目>_小游戏<2048>

    2048 小游戏 主要是针对逻辑思维的一个训练. 主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用 #include <iostream&g ...

  3. 【转】PV3D的小练习~太阳系八大行星

    转自:http://hi.baidu.com/boycy/item/70d1ba53bc8c3a958c12eddf http://www.cnblogs.com/flash3d/archive/20 ...

  4. Java太阳系小游戏分析和源代码

    Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...

  5. luoguP2526_[SHOI2001]小狗散步_二分图匹配

    luoguP2526_[SHOI2001]小狗散步_二分图匹配 题意: Grant喜欢带着他的小狗Pandog散步.Grant以一定的速度沿着固定路线走,该路线可能自交.Pandog喜欢游览沿途的景点 ...

  6. BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP

    BZOJ_3174_[Tjoi2013]拯救小矮人_贪心+DP Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀 ...

  7. 3D高清电商购物小图标图片_在线商城三维icon图标素材大全

    3D高清电商购物小图标图片_在线商城三维icon图标素材大全

  8. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  9. .NET手撸2048小游戏

    .NET手撸2048小游戏 2048是一款益智小游戏,得益于其规则简单,又和2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎"FlysEng ...

随机推荐

  1. 架构师养成记--15.Disruptor并发框架

    一.概述 disruptor对于处理并发任务很擅长,曾有人测过,一个线程里1s内可以处理六百万个订单,性能相当感人. 这个框架的结构大概是:数据生产端 --> 缓存 --> 消费端 缓存中 ...

  2. bootstrap 日期控件 bootstrap-datepicker

    http://www.bootcss.com/p/bootstrap-datetimepicker/

  3. WEB – Architecture

  4. 如何把家里的pc改装成linux服务器

    家里有一台pc笔记本闲置在家,最近想搭建一个ubuntu系统玩一下kvm. 这个方法能避免家里宽带每隔一段时间ip自动变换. 我用到了: 1.亚马逊的aws(ec2) 2.家里的路由器 3.aws里装 ...

  5. Mysql 常用 SQL 语句集锦

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  6. javascript 数字格式化

    对数字进行格式化输出,是非常有意义的一件事情,例如许多时候,我们希望一个数字能够输出为指定格式的字符串,拿25.9878来说,我们可能会希望它能保留两位小数来说出,即结果为25.99,或者对于0.34 ...

  7. QT下调试基于ros的catkin项目

    1.首先告诉qt ros的搜索路径,通过修改qt creator 桌面启动程序来实现 sudo    gedit ~/.local/share/applications/DigiaQtOpenSour ...

  8. Struts2之HelloWorld

    首先既然是开发Struts程序的话,那么自然需要用到Struts2开发包,Struts2是apache旗下的开源框架,所有的开发包和源代码都可以在Apache官网下载. 那么,就来开始编写第一个Str ...

  9. Android:TextView文字跑马灯的效果实现

    解决TextView文字显示不全的问题. 简单设置跑马灯的效果: <TextView android:id="@+id/textView" android:layout_wi ...

  10. MyBatis入门案例

    1.案例架构 2.引入jar 包 3.书写配置文件mybatis-config.xml <?xml version="1.0" encoding="UTF-8&qu ...