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

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

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

