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

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

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

分析:

1.需要加载图片、画图

2.建一个面板,主页面

3.行星类

效果图:

先看一下源码结构图:

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

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语言有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索Java小游戏源码
Java太阳系小游戏
java太阳系源码下载、java小游戏源代码、java简单小游戏源代码、java小游戏源代码下载、java扫雷小游戏源代码,以便于您获取更多的相关知识。

时间: 2024-12-02 15:13:02

Java太阳系小游戏分析和源码详解_java的相关文章

java中哈希表及其应用详解_java

哈希表也称为散列表,是用来存储群体对象的集合类结构. 什么是哈希表 数组和向量都可以存储对象,但对象的存储位置是随机的,也就是说对象本身与其存储位置之间没有必然的联系.当要查找一个对象时,只能以某种顺序(如顺序查找或二分查找)与各个元素进行比较,当数组或向量中的元素数量很多时,查找的效率会明显的降低. 一种有效的存储方式,是不与其他元素进行比较,一次存取便能得到所需要的记录.这就需要在对象的存储位置和对象的关键属性(设为 k)之间建立一个特定的对应关系(设为 f),使每个对象与一个唯一的存储位置

JAVA中static方法的用法实例详解_java

本文实例讲述了JAVA中static方法的用法.分享给大家供大家参考,具体如下: static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区或者方法区内找到他们.因此,static对象可以在它的任何对象创建之前访

Java的JSON处理器fastjson使用方法详解_java

fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发. 主要特点: • 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson) • 强大(支持普通JDK类包括任意Java Bean Class.Collection.Map.Date或enum) • 零依赖(没有依赖其它任何类库除了JDK) 示例代码: import com.alibaba.fastjson.JSON; Group group = new Group

微信 小程序前端源码详解及实例分析_其它综合

微信小程序前端源码逻辑和工作流 看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.js,app(obj)注册一个小程序.接受一个 object 参数,其指定小程序的生命周期函数等.其他文件可以通过全局方法getApp()获取app实例,进而直接调用它的属性或方法,例如(getApp().globalData) //app.js App({ onLau

Java 8 新特性终极版指南详解_java

前言: Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版.在Java Code Geeks上已经有很多介绍Java 8新特性的文章,例如Playing with Java 8 – Lambdas and Concurrency.Java 8 Date Time API Tutorial : LocalDateTime和Abstract Class Versus Interface in the JDK 8 Era.本文还参考了一些其他资料,例如:15 Must

java提高篇(二三)-----HashMap详解_java

HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存.取value.下面就来分析HashMap的存取. 一.定义 HashMap实现了Map接口,继承AbstractMap.其中Map接口定义了键映射到值的规则,而AbstractMap类提供 Map 接口的骨干实现,以最

Java中FilterInputStream和FilterOutputStream的用法详解_java

FilterInputStream FilterInputStream 的作用是用来"封装其它的输入流,并为它们提供额外的功能".它的常用的子类有BufferedInputStream和DataInputStream. BufferedInputStream的作用就是为"输入流提供缓冲功能,以及mark()和reset()功能". DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类

Java中自然排序和比较器排序详解_java

前言 当指执行插入排序.希尔排序.归并排序等算法时,比较两个对象"大小"的比较操作.我们很容易理解整型的 i>j 这样的比较方式,但当我们对多个对象进行排序时,如何比较两个对象的"大小"呢?这样的比较 stu1 > stu2 显然是不可能通过编译的.为了解决如何比较两个对象大小的问题,JDK提供了两个接口 java.lang.Comparable 和 java.util.Comparator . 一.自然排序:java.lang.Comparable C

使用Java设置字型和颜色的方法详解_java

Java绘图中,显示文字的方法主要有三种: (1)drawString(String str,int x,int y):在指定的位置显示字符串. (2)drawChars(char data[],int offset,int length, int x, int y):在指定的位置显示字符数组中的文字,从字符数组的offset位置开始,最多显示length个字符. (3)drawBytes(byte data[],int offset,int length,int x,int y), 在指定的位