热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java太阳系小游戏分析和源码详解

本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。

最近看了面向对象的一些知识,然后跟着老师的讲解做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下最近学的知识:

用到知识点:类的继承、方法的重载与重写、多态、封装等

分析:

1.需要加载图片、画图

2.建一个面板,主页面

3.行星类

效果图:

5b7fa0c8850a87ab95c0832976b13747.png

先看一下源码结构图:

8d1113e9d3e779704f28472c336e272f.png

现在逐步分析各个类的功能:

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太阳系小游戏分析和源码详解,希望对大家学习java语言有所帮助。



推荐阅读
  • 调用scanner.close()报错Java.io.Exception: Stream closed; 的原因分析
    引言:想对比用于控制台输入的Scanner和BufferedReader,因此放在同一个方法中,之前学习或者使用时没有特别注意过要不要在使 ... [详细]
  • 小白进阶之反射学习(超详细)
    小白进阶之反射学习(超详细)-1什么是反射?Reflection(反射)是Java程序开发语言的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,也有称 ... [详细]
  • 不说废话,直接上代码:1packagemytest;23importjava.util.List;45publicclassTestClass{67publicvoidmethod ... [详细]
  • 获取方法getMethod(Stringname,ClassparameterTypes)返回类中的某个公共方法-包括父类中的公共方法getMethods()返回方法数 ... [详细]
  • packageclass04;importjava.util.Arrays;***获取数组中逆序对的对数**在一个数组中,*任何一个前面的数a,和任何一个后面的数b,*如果( ... [详细]
  • 软件工程—个人作业(5)
    题目要求:(1)输出某个英文文本文件中26字母出现的频率,由高到低排列,并显示字母出现的百分比, ... [详细]
  • Android 公交线路 VerticalStepView
    前言  本篇主要给大家写一个展示公交线路的自定义view,直接上效果图。效果图看到上面的图是不是有些紧张?别慌,蛋定,蛋定!每个站都由几个部分组成:绘制序列号背景圆圈绘制序列号绘制 ... [详细]
  • 作者:袁晓辉主页:http:www.farproc.comBLOGhttp:blog.csdn.netuoyevoli在窗口标题栏上加按钮本来不是什么新 ... [详细]
  • 【Java基础】foreach循环
    从一个小程序说起:1classlesson6foreach2{3publicstaticvoidmain(String[]args)4{5intarray[]{2,3,1,5,4, ... [详细]
  • 树莓派python_树莓派使用Python控制LCD1602模块
    本文将介绍使用Python通过树莓派控制LCD1602,LCD1602液晶模块相当便宜,关键是它很容易与树莓派(RaspberryPi)进行接口连接。L ... [详细]
  • Wix安装部署教程(十)来,用WPF做个漂亮的安装界面
        在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的 ... [详细]
  • springsecurityspringsecurity主要的两个功能是认证和授权认证的大概流程:UsernamepasswordAuthenticationFil ... [详细]
  • php redis 消息队列_redis怎么实现消息队列?
    把瞬间服务器的请求处理换成异步处理,缓解服务器的压力,实现数据顺序排列获取。本文主要和大家分享redis如何实现消息队列,希望能帮助到大家 ... [详细]
  • 在实践性能测试框架第二版的过程中,我实现了一个单个HttpRequestBase对象的concurrent对象创建,单之前都是用使用唯一的HttpRequestBase对象进行多线 ... [详细]
  • 20145124第一次实验报告
    编写程序代码如下packageljp;publicclassHellolsj{publicstaticvoidmain(String[]agrs){inti5;intj6;ints ... [详细]
author-avatar
逺續ken_372
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有