热门标签 | 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 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • 数组的排序:数组本身有Arrays类中的sort()方法,这里写几种常见的排序方法。(1)冒泡排序法publicstaticvoidmain(String[]args ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
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社区 版权所有