Java太陽系小遊戲分析和源碼,java太陽系小遊戲

來源:互聯網
上載者:User

Java太陽系小遊戲分析和源碼,java太陽系小遊戲

Java太陽系小遊戲分析和源碼

-20150809


最近看了物件導向的一些知識,然後跟著老師的講解做了一個太陽系各行星繞太陽轉的小遊戲,來練習鞏固一下最近學的知識:

用到知識點:類的繼承、方法的重載與重寫、多態、封裝等

分析:

    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);@Overridepublic 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一個行星對象,然後畫的面板上即可。物件導向水太深,這隻是初步小涉獵,仍需繼續努力專研!!!





著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.