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 ...
随机推荐
- 【LeetCode】Remove Duplicates from Sorted Array(删除排序数组中的重复项)
这道题是LeetCode里的第26道题. 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数 ...
- sql语句执行时算术运算导致溢出。
执行sql语句时报错: 用户代码未处理 System.OverflowException HResult=-2146233066 Message=算术运算导致溢出. 文章:https://bbs.cs ...
- 【bzoj3782】上学路线 dp+容斥原理+Lucas定理+中国剩余定理
题目描述 小C所在的城市的道路构成了一个方形网格,它的西南角为(0,0),东北角为(N,M).小C家住在西南角,学校在东北角.现在有T个路口进行施工,小C不能通过这些路口.小C喜欢走最短的路径到达目的 ...
- kb-07线段树-06离散化(与第四题类似)
/* zoj1610 这题是离散化,区间特殊查询的,和之前的第4 题是异曲同工的 */ #include<iostream> #include<cstdio> #include ...
- mybatis foreach Map(String,List)类型
<select id="queryList" resultType="com.performancetest.modules.ptest.entity.Stress ...
- The Luckiest number(hdu 2462)
给定一个数,判断是否存在一个全由8组成的数为这个数的倍数 若存在则输出这个数的长度,否则输出0 /* 个人感觉很神的一道题目. 如果有解的话,会有一个p满足:(10^x-1)/9*8=L*p => ...
- 【BZOJ1059】矩阵游戏(二分图最大匹配)
题意:矩阵游戏在一个N*N黑白方阵进行.每次可以对该矩阵进行两种操作: 行交换操作:选择矩阵的任意两行,交换这两行(即交换对应格子的颜色) 列交换操作:选择矩阵的任意行列,交换这两列(即交换对应格子的 ...
- 【POJ3352】Road Construction(边双联通分量)
题意:给一个无向图,问最少添加多少条边后能使整个图变成双连通分量. 思路:双连通分量缩点,缩点后给度为1的分量两两之间连边,要连(ans+1) div 2条 low[u]即为u所在的分量编号,flag ...
- css3 背景图动画一
一 实现背景图循环播放 @keyframes mlfly { 0%{ background-position:0 0; } 100%{ background-position:210px 0; } } ...
- [LeetCode] Text Justification words显示的排序控制
Given an array of words and a length L, format the text such that each line has exactly L characters ...