国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java太陽系小游戲分析和源碼詳解

2019-11-26 15:00:59
字體:
來源:轉載
供稿:網友

最近看了面向對象的一些知識,然后跟著老師的講解做了一個太陽系各行星繞太陽轉的小游戲,來練習鞏固一下最近學的知識:

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

分析:

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語言有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内江市| 临城县| 福海县| 洛阳市| 凤凰县| 鹤岗市| 屏东县| 闸北区| 连江县| 东阿县| 即墨市| 本溪市| 彭州市| 图片| 万安县| 合作市| 石景山区| 宜昌市| 洛浦县| 西盟| 紫云| 西乡县| 施甸县| 南澳县| 读书| 横峰县| 阿城市| 台南市| 靖远县| 华宁县| 通州区| 九龙坡区| 县级市| 山阴县| 昌江| 额敏县| 正定县| 阿城市| 繁昌县| 遂昌县| 清河县|