热门标签 | 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语言有所帮助。



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文介绍了MVP架构模式及其在国庆技术博客中的应用。MVP架构模式是一种演变自MVC架构的新模式,其中View和Model之间的通信通过Presenter进行。相比MVC架构,MVP架构将交互逻辑放在Presenter内部,而View直接从Model中读取数据而不是通过Controller。本文还探讨了MVP架构在国庆技术博客中的具体应用。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
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社区 版权所有