Java太阳系小游戏分析和源代码
Java太阳系小游戏分析和源代码
-20150809
近期看了面向对象的一些知识。然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识:
用到知识点:类的继承、方法的重载与重写、多态、封装等
分析:
1.须要载入图片、绘图
2.建一个面板。主页面
3.行星类
。
。
。
效果图:
先看一下源代码结构图:
如今逐步分析各个类的功能:
1)工具类-----util包中
--Constant类 封装了游戏中用到的常量
--GameUtil类 封装了游戏的图片载入功能
--MyFrame类 封装了游戏面板的构造。用于各面板的父类
------之所以这样做。目的是为了封装数据。便于程序的扩充
Constant.java
package util; public class Constant {
public static final int GAME_WIDTH = 800;
public static final int GAME_HEIGHT = 600; }
GameUtil.java
package util; import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL; import javax.imageio.ImageIO; /**
* 工具类(载入图片)
* @author long
*
*/
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;
}
}
MyFrame.java
package util; import javax.swing.JFrame;
import javax.swing.JPanel; /**
* 游戏面板的父类
* @author long
*
*/
public class MyFrame extends JPanel{ /**
* 载入Frame的方法
*/
public void launchFrame(){
JFrame frame = new JFrame("MyGame");
frame.add(this);
frame.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
frame.setAlwaysOnTop(true); // 设置其总在最上
frame.setLocationRelativeTo(null); // 设置窗口初始位置
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); new PaintThread().start();
} /**
* 定义一个重画窗口的线程类。是一个内部类
* @author dell
*
*/
class PaintThread extends Thread { public void run(){
while(true){
repaint();
try {
Thread.sleep(40); //1s = 1000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} } public static void main(String[] args) {
new MyFrame().launchFrame();
} }
2)基本的事件处理类---solar包中
--Planet类 行星类继承至Star类
--SolarFrame类 游戏主面板类继承至MyFrame类
--Star类 星球类,各个星球的父类
--Test类 測试类。不须要说明
Planet.java
package solar; import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image; import util.GameUtil; /**
* 行星类,继承至Star类
* @author long
*
*/
public class Planet extends Star{
//除了图片、坐标,行星沿着椭圆执行:长轴、短轴、移动速度、旋转角度。 绕着某个star执行
double longAxis; //椭圆长轴
double shortAxis; //椭圆短轴
double speed; //飞行速度
double degree; //旋转角度
Star center; //环绕行星 public void draw(Graphics g){
//g.drawImage(img, (int)x, (int)y, null);
super.draw(g);
drawTrace(g);
move();
} public void drawTrace(Graphics g){
double traceX,traceY,traceWidth,traceHeight;
traceX = (center.x+center.w/2)-longAxis;
traceY = (center.y+center.h/2)-shortAxis;
traceWidth = 2*longAxis;
traceHeight = 2*shortAxis; Color c = g.getColor();
g.setColor(Color.blue);
g.drawOval((int)traceX, (int)traceY, (int)traceWidth, (int)traceHeight);
g.setColor(c);
} public void move(){
//沿着椭圆轨迹飞行
x = center.x + longAxis * Math.cos(degree);
y = center.y + shortAxis * Math.sin(degree);
degree += 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);
}
public Planet( Star center,Image img,double longAxis,
double shortAxis,double speed) {
super();
this.x = (center.x+center.w/2) + longAxis;
this.y = (center.y+center.h/2) + shortAxis;
this.img = img;
this.longAxis = longAxis;
this.shortAxis = shortAxis;
this.speed = speed;
this.center = center;
}
public Planet( Star center,String imgPath,double longAxis,
double shortAxis,double speed) {
this(center,GameUtil.getImage(imgPath),longAxis,shortAxis,speed);
} }
SolarFrame.java
package solar; import java.awt.Graphics;
import java.awt.Image; import util.Constant;
import util.GameUtil;
import util.MyFrame; public class SolarFrame extends MyFrame{ int width = Constant.GAME_WIDTH/2;
int height = Constant.GAME_HEIGHT/2; Image bg=GameUtil.getImage("images/bg.png"); Star sun = new Star("images/sun.jpg",width,height);
Planet earth = new Planet(sun,"images/earth.png",100,60,0.1);
Planet mars = new Planet(sun,"images/mars.png",180,100,0.15); @Override
public void paint(Graphics g) {
g.drawImage(bg, 0, 0, null);
sun.draw(g);
earth.draw(g);
mars.draw(g);
} public static void main(String[] args) {
new SolarFrame().launchFrame();
} }
Star.java
package solar; import java.awt.Graphics;
import java.awt.Image; import util.GameUtil; public class Star {
public Image img;
public double x,y;
int w,h; public void draw(Graphics g){
g.drawImage(img, (int)x, (int)y, null);
} public Star(){
}
public Star(Image img){
this.img = img;
this.w = img.getWidth(null);
this.h = 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);
} }
-----------------------------------------------------------------------------------------------
总结:该小游戏对代码的封装处理的比較好,便于程序的扩充。体现了面向对象的强大,不同的功能封装在不同的类与方法中。把类的公共的部分封装在父类中,提高代码的重用性。前期各个类写的过程中会有各种小问题与细节,但处理完这些后,后期想扩充行星的个数就比較简单了,new一个行星对象,然后画的面板上就可以。面向对象水太深,这仅仅是初步小涉猎,仍需继续努力专研。!!
Java太阳系小游戏分析和源代码的更多相关文章
- Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述
Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述 Overview 本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到. 整个游戏通 ...
- Java NIO原理 图文分析及代码实现
Java NIO原理图文分析及代码实现 前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...
- Java五子棋小游戏(控制台纯Ai算法)
Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...
- Java 坦克小游戏心得
原本是闲得慌无聊才去尝试做这个项目的,因为小时候玩小霸王的游戏机,那个时候经常玩这个游戏吧,特别是喜欢那种自定义地图的模式,觉得自由度非常不错.总之关于这个游戏,想说的一大堆.鉴于能有个空闲的时间,打 ...
- Java经典小游戏——贪吃蛇简单实现(附源码)
一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...
- Java猜拳小游戏(剪刀、石头、布)
1.第一种实现方法,调用Random数据包,直接根据“1.2.3”输出“剪刀.石头.布”.主要用了9条输出判断语句. import java.util.Random; import java.util ...
- [JavaEE]Java NIO原理图文分析及代码实现
转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO ...
- Java NIO原理图文分析及代码实现
原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java ...
- 从零开始学java(小游戏 石头剪刀布)
Game.java package com.java;import java.util.Scanner;public class Game { private Player player ...
随机推荐
- VMware RHEL6.3 开启网络连接
确认/etc/sysconfig/network是否存在,如果不存在,service network 命令使用不了.新建: NETWORKING=yes HOSTNAME=RHEL6. GATEWAY ...
- 第002弹:Java 中的值传递和引用传递
在 Java 的代码开发过程中,为了尽可能提高方法的复用性,明确方法的作用,同时防止一个方法内部过于臃肿的问题,往往会创建许多方法,那么不可避免地会涉及到参数传递的问题.通常来说,我们将 Java 中 ...
- HUST——1110雪碧(简单DFS)
1110: 雪碧 时间限制: 1 Sec 内存限制: 128 MB 提交: 18 解决: 6 题目描述 杨神最近特别喜雪碧,他现在有两瓶,他大晚上的在街上走,他逢店加一倍(雪碧),逢摊吃大虾并喝一 ...
- P2730 魔板 Magic Squares (搜索)
题目链接 Solution 这道题,我是用 \(map\) 做的. 具体实现,我们用一个 \(string\) 类型表示任意一种情况. 可以知道,排列最多只有 \(8!\) 个. 然后就是直接的广搜了 ...
- bzoj1306: [CQOI2009]match循环赛(模拟爆搜)
Input第一行包含一个正整数n,队伍的个数.第二行包含n个非负整数,即每支队伍的得分.Output输出仅一行,即可能的分数表数目.保证至少存在一个可能的分数表.Sample Input 6 5 6 ...
- VMware锁定文件失败开启模块diskearly的操作失败未能启动虚拟机
删除虚拟机目录下的(如图中标明的就是D:\VMWorks\YeZiZxWeb这个目录)三个 *.lck文件夹,启动正常
- 标准C程序设计七---64
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- kswapd0 进程 设置 swap
kswapd0是虚拟内存管理中,负责换页,说白了就是你的物理内存不够用了 现在的服务器,一般内存都很高,所有很少使用 swap 分区了 这时候考虑的两种处理办法 加大物理内存 或者 增加swap分 ...
- 关于微信浏览器不支持offset()的兼容性处理
问题的背景: 在手机触屏版中,当页面向上滑动的时候,导航条可以固定在顶部,通过判断offset().top的值来实现这个功能,其他的浏览器都可以,只有微信浏览器中出现问题(向上滑动的时候,导航条就会直 ...
- js - 锚点-scrollIntoView()
document.getElementById("view").scrollIntoView(false);