//实现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. 【bzoj2648】 SJY摆棋子

    http://www.lydsy.com/JudgeOnline/problem.php?id=2648 (题目链接) 题意 动态维护二维平面上的点的插入以及最邻近域搜索. Solution KDtr ...

  2. Python 【第五章】:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  3. git 提交代码

    git config --global user.name=a_name git config --global user.email=an_email_address mkdir test cd t ...

  4. 通过实现System.IComparable接口的CompareTo方法对两个类进行比较

    假设现在有一个学生类 class Student { int age; public Student(int age) { this.age = age; } } 要使学生类之间能进行比较,实现Sys ...

  5. win7里边使用telnet命令为什么提示telnet不是内部或外部命令,也不是可运行的程序或批处理文件

    Win7默认没有安装telnet功能,所以你直接用telnet命令是用不了的:你可以去“控制面板”-->“程序”(在左下角)--->“打开或关闭Windows功能”,勾上“telnet客户 ...

  6. MVC分页

    http://www.cnblogs.com/iamlilinfeng/p/4075292.html 目录 一.Contrl与View数据传递(多表数据) 二.分页控件介绍 三.MVC源码说明 四.源 ...

  7. 【原】小玩node+express爬虫-2

    上周写了一个node+experss的爬虫小入门.今天继续来学习一下,写一个爬虫2.0版本. 这次我们不再爬博客园了,咋玩点新的,爬爬电影天堂.因为每个周末都会在电影天堂下载一部电影来看看. talk ...

  8. WordPress酷炫CSS3读者墙代码

    前几日在大前端看到他站点中最新的CSS3读者墙代码,一看效果绚丽的不得鸟,立刻就开始研究了,多次研究未果,可终究是研究出来了,昨天刚成功,今天啊和童鞋来我站说读者墙头像显示不对,我一看,还真是,头像都 ...

  9. 2.3switch case 语句注意事项。

    #include<stdio.h> int main() { void action1(int, int),action2(int, int); char ch; , b=; ch = g ...

  10. JEECG 社区开源项目下载(总览)

    反馈问题板块:http://www.jeecg.org/forum.php?mod=forumdisplay&fid=153 资源1: JEECG 微云快速开发平台( JEECG 3.6.5  ...