最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2015年08月10日 09:24:53   作者:u011637069  
這篇文章主要對(duì)Java太陽系小游戲進(jìn)行深入分析以及對(duì)應(yīng)源碼解釋,進(jìn)一步鞏固了面向?qū)ο蟮闹R(shí),需要的朋友可以參考下

最近看了面向?qū)ο蟮囊恍┲R(shí),然后跟著老師的講解做了一個(gè)太陽系各行星繞太陽轉(zhuǎn)的小游戲,來練習(xí)鞏固一下最近學(xué)的知識(shí):

用到知識(shí)點(diǎn):類的繼承、方法的重載與重寫、多態(tài)、封裝等

分析:

1.需要加載圖片、畫圖

2.建一個(gè)面板,主頁面

3.行星類

效果圖:

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

現(xiàn)在逐步分析各個(gè)類的功能:

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(); 
  } 
   
  /** 
   * 定義一個(gè)重畫窗口的線程類,是一個(gè)內(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類  星球類,各個(gè)星球的父類

    --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)行:長軸、短軸、移動(dòng)速度、旋轉(zhuǎn)角度。繞著某個(gè)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)大,不同的功能封裝在不同的類與方法中,把類的公共的部分封裝在父類中,提高代碼的重用性。前期各個(gè)類寫的過程中會(huì)有各種小問題與細(xì)節(jié),但處理完這些后,后期想擴(kuò)充行星的個(gè)數(shù)就比較簡單了,new一個(gè)行星對(duì)象,然后畫的面板上即可。面向?qū)ο笏?,這只是初步小涉獵,仍需繼續(xù)努力專研?。?!

以上就是Java太陽系小游戲分析和源碼詳解,希望對(duì)大家學(xué)習(xí)java語言有所幫助。

相關(guān)文章

  • idea代碼模板設(shè)置方式

    idea代碼模板設(shè)置方式

    這篇文章主要介紹了idea代碼模板設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java+Springboot搭建一個(gè)在線網(wǎng)盤文件分享系統(tǒng)

    Java+Springboot搭建一個(gè)在線網(wǎng)盤文件分享系統(tǒng)

    本主要介紹了通過springboot+freemark+jpa+MySQL實(shí)現(xiàn)的在線網(wǎng)盤文件分享系統(tǒng),其功能跟百度網(wǎng)盤非常類似,可以實(shí)現(xiàn)文件的上傳、移動(dòng)、復(fù)制、下載等,需要的可以參考一下
    2021-11-11
  • 解決線程異常WAITING(parking)問題

    解決線程異常WAITING(parking)問題

    文章總結(jié):在項(xiàng)目中線程數(shù)量持續(xù)增長無法回收,導(dǎo)致服務(wù)器卡死和內(nèi)存不足,通過分析發(fā)現(xiàn)是由于自定義線程池未執(zhí)行shutdown()關(guān)閉導(dǎo)致線程泄漏
    2024-11-11
  • spring cloud zuul 與 sentinel的結(jié)合使用操作

    spring cloud zuul 與 sentinel的結(jié)合使用操作

    這篇文章主要介紹了spring cloud zuul 與 sentinel 的結(jié)合使用操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 深入理解Java中的WeakHashMap

    深入理解Java中的WeakHashMap

    這篇文章主要介紹了深入理解Java中的WeakHashMap,WeakHashMap從名字可以得知主要和Map有關(guān),不過還有一個(gè)Weak,我們就更能自然而然的想到這里面還牽扯到一種弱引用結(jié)構(gòu),因此想要徹底搞懂,我們還需要知道四種引用,需要的朋友可以參考下
    2023-09-09
  • Java開發(fā)中的容器概念、分類與用法深入詳解

    Java開發(fā)中的容器概念、分類與用法深入詳解

    這篇文章主要介紹了Java開發(fā)中的容器概念、分類與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了java容器的相關(guān)概念、分類、使用方法與注意事項(xiàng),需要的朋友可以參考下
    2017-11-11
  • java并發(fā)編程專題(八)----(JUC)實(shí)例講解CountDownLatch

    java并發(fā)編程專題(八)----(JUC)實(shí)例講解CountDownLatch

    這篇文章主要介紹了java CountDownLatch的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 一文帶你掌握J(rèn)ava?SPI的原理和實(shí)踐

    一文帶你掌握J(rèn)ava?SPI的原理和實(shí)踐

    在Java中,我們經(jīng)常會(huì)提到面向接口編程,這樣減少了模塊之間的耦合,更加靈活,Java?SPI?(Service?Provider?Interface)就提供了這樣的機(jī)制,本文就來講講它的原理與具體使用吧
    2023-05-05
  • Java編程中使用throw關(guān)鍵字拋出異常的用法簡介

    Java編程中使用throw關(guān)鍵字拋出異常的用法簡介

    這篇文章主要介紹了Java編程中使用throw關(guān)鍵字拋出異常的用法,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Spring Boot 中的 @ConditionalOnBean 注解場景分析

    Spring Boot 中的 @ConditionalOnBean 注解場景分析

    本文詳細(xì)介紹了Spring Boot中的@ConditionalOnBean注解的使用場景、原理和基本用法,通過多個(gè)示例,展示了如何使用該注解根據(jù)Bean是否存在來動(dòng)態(tài)地注冊(cè)或跳過特定的Bean,感興趣的朋友一起看看吧
    2025-03-03

最新評(píng)論

时尚| 城口县| 定结县| 资溪县| 米脂县| 额济纳旗| 兰考县| 民乐县| 济阳县| 白水县| 鹤庆县| 台湾省| 库车县| 南充市| 沂源县| 凤台县| 库伦旗| 和田县| 玉门市| 射洪县| 临安市| 图木舒克市| 长宁区| 柞水县| 凤凰县| 内丘县| 湘乡市| 大名县| 即墨市| 蓬安县| 罗城| 江北区| 介休市| 台前县| 沽源县| 河南省| 汕尾市| 西青区| 三明市| 安乡县| 灵武市|