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



推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Java 中 Writer flush()方法,示例 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
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社区 版权所有