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太阳系小游戏分析和源代码的更多相关文章

  1. Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述

    Android-贪吃蛇小游戏-分析与实现-Kotlin语言描述 Overview 本章的主要的内容是贪吃蛇小游戏的分析和实现,关于实现的具体代码可以在,文章底部的github的链接中找到. 整个游戏通 ...

  2. Java NIO原理 图文分析及代码实现

    Java NIO原理图文分析及代码实现 前言:  最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请 ...

  3. Java五子棋小游戏(控制台纯Ai算法)

    Java五子棋小游戏(控制台纯Ai算法) 继续之前的那个五子棋程序 修复了一些已知的小Bug 这里是之前的五子棋程序 原文链接 修复了一些算法缺陷 本次增加了AI算法 可以人机对战 也可以Ai对Ai看 ...

  4. Java 坦克小游戏心得

    原本是闲得慌无聊才去尝试做这个项目的,因为小时候玩小霸王的游戏机,那个时候经常玩这个游戏吧,特别是喜欢那种自定义地图的模式,觉得自由度非常不错.总之关于这个游戏,想说的一大堆.鉴于能有个空闲的时间,打 ...

  5. Java经典小游戏——贪吃蛇简单实现(附源码)

    一.使用知识 Jframe GUI 双向链表 线程 二.使用工具 IntelliJ IDEA jdk 1.8 三.开发过程 3.1素材准备 首先在开发之前应该准备一些素材,已备用,我主要找了一个图片以 ...

  6. Java猜拳小游戏(剪刀、石头、布)

    1.第一种实现方法,调用Random数据包,直接根据“1.2.3”输出“剪刀.石头.布”.主要用了9条输出判断语句. import java.util.Random; import java.util ...

  7. [JavaEE]Java NIO原理图文分析及代码实现

    转http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java NIO ...

  8. Java NIO原理图文分析及代码实现

    原文: http://weixiaolu.iteye.com/blog/1479656 目录: 一.java NIO 和阻塞I/O的区别      1. 阻塞I/O通信模型      2. java ...

  9. 从零开始学java(小游戏 石头剪刀布)

    Game.java package com.java;import java.util.Scanner;public class Game {        private Player player ...

随机推荐

  1. STP

    生成树协议  spanning-tree protocol     网络中额外添加的链路连接着路由器和交换机 会引起流量的环路   当一个交换机的连接丢失时 另一条链路能快速地取代失败的链路  并且不 ...

  2. Wannafly挑战赛2

    Cut 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit IO Format: %lld 题目描述 给你一个长度为n的序列,你每次可以将一个序 ...

  3. 【bzoj1040】[ZJOI2008]骑士 并查集+基环树dp

    题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火绵延五百里,在 ...

  4. BZOJ2302 [HAOI2011]Problem c 【dp】

    题目 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,a ...

  5. bzoj 1137 [POI2009]Wsp 岛屿

    题目大意 Byteotia岛屿是一个凸多边形.城市全都在海岸上.按顺时针编号1到n.任意两个城市之间都有一条笔直的道路相连.道路相交处可以自由穿行.有一些道路被游击队控制了,不能走,但是可以经过这条道 ...

  6. Codeforces663E. Binary Table

    $n \leq 20,m \leq 100000$的01矩阵,可整行整列01翻转,问最少剩几个1. 一个暴力的做法是枚举$2^n$种行翻转然后$m$列扫一遍.但其实在行翻转情况确定的情况下我们只关心两 ...

  7. cpu乱序执行

    http://blog.163.com/zhaojie_ding/blog/static/1729728952007925111324379/?suggestedreading 处理器的乱序和并发执行 ...

  8. PHP读取APK的包信息,包括包名,应用名,权限,LOGO等

    [转]PHP读取APK的包信息,包括包名,应用名,权限,LOGO等 声明本文转自: 原文链接:https://www.jb51.net/article/53780.htm: 感谢分享! <?ph ...

  9. Servlet 2.4 规范之第三篇:Servlet生命周期

        SRV.2.3    Servlet生命周期 servlet有着定义良好且明确的生命周期,它定义了servlet以怎样的方式加载和实例化.初始化.怎样处理客户端请求.以及怎样停止服务.生命周期 ...

  10. html-禁用右键、键盘F12、网页上选取内容、复制、粘贴

    摘要 为了保护我们的代码,我们需要想些办法禁止复制. css: body{     -webkit-touch-callout: none;    -webkit-user-select: none; ...