Java太陽系小游戲分析和源碼詳解
最近看了面向?qū)ο蟮囊恍┲R,然后跟著老師的講解做了一個太陽系各行星繞太陽轉(zhuǎn)的小游戲,來練習(xí)鞏固一下最近學(xué)的知識:
用到知識點(diǎn):類的繼承、方法的重載與重寫、多態(tài)、封裝等
分析:
1.需要加載圖片、畫圖
2.建一個面板,主頁面
3.行星類
效果圖:

先看一下源碼結(jié)構(gòu)圖:

現(xiàn)在逐步分析各個類的功能:
1)工具類-----util包中
--Constant類 封裝了游戲中用到的常量
--GameUtil類 封裝了游戲的圖片加載功能
--MyFrame類 封裝了游戲面板的構(gòu)造,用于各面板的父類
------之所以這樣做,目的是為了封裝數(shù)據(jù),便于程序的擴(kuò)充
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(){ } //工具類通常將構(gòu)造方法私有
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); // 設(shè)置其總在最上
frame.setLocationRelativeTo(null); // 設(shè)置窗體初始位置
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
new PaintThread().start();
}
/**
* 定義一個重畫窗口的線程類,是一個內(nèi)部類
* @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{
//除了圖片、坐標(biāo),行星沿著橢圓運(yùn)行:長軸、短軸、移動速度、旋轉(zhuǎn)角度。繞著某個star運(yùn)行
double longAxis; //橢圓長軸
double shortAxis; //橢圓短軸
double speed; //飛行速度
double degree; //旋轉(zhuǎn)角度
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);
}
}
總結(jié):該小游戲?qū)Υa的封裝處理的比較好,便于程序的擴(kuò)充,體現(xiàn)了面向?qū)ο蟮膹?qiáng)大,不同的功能封裝在不同的類與方法中,把類的公共的部分封裝在父類中,提高代碼的重用性。前期各個類寫的過程中會有各種小問題與細(xì)節(jié),但處理完這些后,后期想擴(kuò)充行星的個數(shù)就比較簡單了,new一個行星對象,然后畫的面板上即可。面向?qū)ο笏睿@只是初步小涉獵,仍需繼續(xù)努力專研?。?!
以上就是Java太陽系小游戲分析和源碼詳解,希望對大家學(xué)習(xí)java語言有所幫助。
相關(guān)文章
Java+Springboot搭建一個在線網(wǎng)盤文件分享系統(tǒng)
本主要介紹了通過springboot+freemark+jpa+MySQL實(shí)現(xiàn)的在線網(wǎng)盤文件分享系統(tǒng),其功能跟百度網(wǎng)盤非常類似,可以實(shí)現(xiàn)文件的上傳、移動、復(fù)制、下載等,需要的可以參考一下2021-11-11
spring cloud zuul 與 sentinel的結(jié)合使用操作
這篇文章主要介紹了spring cloud zuul 與 sentinel 的結(jié)合使用操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
java并發(fā)編程專題(八)----(JUC)實(shí)例講解CountDownLatch
這篇文章主要介紹了java CountDownLatch的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
一文帶你掌握J(rèn)ava?SPI的原理和實(shí)踐
在Java中,我們經(jīng)常會提到面向接口編程,這樣減少了模塊之間的耦合,更加靈活,Java?SPI?(Service?Provider?Interface)就提供了這樣的機(jī)制,本文就來講講它的原理與具體使用吧2023-05-05
Java編程中使用throw關(guān)鍵字拋出異常的用法簡介
這篇文章主要介紹了Java編程中使用throw關(guān)鍵字拋出異常的用法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-11-11
Spring Boot 中的 @ConditionalOnBean 注解場景分析
本文詳細(xì)介紹了Spring Boot中的@ConditionalOnBean注解的使用場景、原理和基本用法,通過多個示例,展示了如何使用該注解根據(jù)Bean是否存在來動態(tài)地注冊或跳過特定的Bean,感興趣的朋友一起看看吧2025-03-03

