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



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
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社区 版权所有