<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java究竟怎么玩?

      天地程序已定棋,人間大數(shù)待變局

        博客園  :: 首頁  :: 新隨筆  :: 聯(lián)系 :: 訂閱 訂閱  :: 管理
      package org.test;



      /**
       * <p>Title: LoonFramework</p>
       * <p>Description:拼圖圖像處理[未優(yōu)化](優(yōu)化算法已內(nèi)置于loonframework-game框架中。)</p>
       * <p>Copyright: Copyright (c) 2007</p>
       * <p>Company: LoonFramework</p>
       * 
      @author chenpeng  
       * @email:ceponline@yahoo.com.cn 
       * 
      @version 0.1
       
      */

      import java.awt.Canvas;
      import java.awt.Color;
      import java.awt.Event;
      import java.awt.Frame;
      import java.awt.Graphics;
      import java.awt.Image;
      import java.awt.MediaTracker;
      import java.awt.image.BufferedImage;

      import org.loon.framework.game.helper.ImageHelper;

      public class BlockImage extends Canvas {
          
      /**
           * 
           
      */
          
      private static final long serialVersionUID = 1L;

          
      private Image _img;

          
      private Image _img2;

          
      private Graphics bg;

          
      private Image backimage;

          
      private int blocks[];

          
      private boolean isEvent;

          
      private MediaTracker mt;

          
      private int _width;

          
      private int _height;

          
      private int _RS;

          
      private int _CS;

          
      private Image screen = null;

          
      private Graphics later = null;

          
      private int _objWidth;

          
      private int _objHeight;

          
      private int _COUNT;

          
      /**
           * 析構(gòu)函數(shù),內(nèi)部調(diào)用init方法。
           * 
           * 
      @param bImage
           * 
      @param overImage
           * 
      @param cs
           * 
      @param rs
           
      */
          
      public BlockImage(Image bImage, Image overImage, int cs, int rs) {
              init(bImage, overImage, cs, rs);
          }

          
      /**
           * 初始化拼圖參數(shù)。
           * 
           * 
      @param bImage
           * 
      @param overImage
           * 
      @param cs
           * 
      @param rs
           
      */
          
      public void init(Image bImage, Image overImage, int cs, int rs) {
              
      // 列數(shù)
              _CS = cs;
              
      // 行數(shù)
              _RS = rs;
              
      // 加載拼圖用圖像。
              _img = bImage;

              
      // 獲得實際窗體寬。
              _width = _img.getWidth(null);
              
      // 獲得實際窗體高。
              _height = _img.getHeight(null);
              
      // 獲得單塊圖像寬。
              _objWidth = _width / _CS;
              
      // 獲得單塊圖像高。
              _objHeight = _height / _RS;

              
      // 本程序直接使用backimage上一塊圖形區(qū)域緩沖選擇項,所以實際背景圖像高=圖形高+額外圖塊高。
              backimage = new BufferedImage(_width, _height + _objHeight, 1);
              
      // 獲得生成的圖形
              later = backimage.getGraphics();
              
      // 再創(chuàng)建一塊圖像區(qū)域,作為圖像緩存用。
              screen = new BufferedImage(_width, _height, 1);
              
      // 獲得緩存的圖形
              bg = screen.getGraphics();
              
      // 獲得等同圖片總數(shù)的數(shù)組。
              _COUNT = _CS * _RS;
              blocks 
      = new int[_COUNT];
              
      // 初始化為非點擊。
              isEvent = false;
              
      // 加載完成拼圖的顯示圖。
              _img2 = overImage;
              
      // 初始化圖塊參數(shù)。
              for (int i = 0; i < _COUNT; i++) {
                  blocks[i] 
      = i;
              }
              
      // 載入MediaTracker,用以跟蹤圖像狀態(tài)。
              mt = new MediaTracker(this);
              
      // 加載被跟蹤的圖像。
              mt.addImage(_img, 0);
              mt.addImage(_img2, 
      0);
              
      // 同步載入。
              try {
                  mt.waitForID(
      0);
              } 
      catch (InterruptedException interruptedexception) {
                  
      return;
              }
              
      // 隨機(jī)生成圖像面板內(nèi)容。
              rndPannel();

          }

          
      /**
           * 描繪窗體圖像。
           
      */
          
      public void paint(Graphics g) {
              
      // 檢查圖像載入。
              if (mt.checkID(0)) {
                  
      // 描繪底層背景。
                  bg.drawImage(backimage, 00null);
                  
      // 判斷是否觸發(fā)完成事件。
                  if (!isEvent) {
                      
      // 設(shè)置背景色。
                      bg.setColor(Color.black);
                      
      // 循環(huán)繪制小圖片于背景緩存中。
                      for (int i = 0; i < _CS; i++) {
                          
      for (int j = 0; j < _RS; j++)
                              bg.drawRect(i 
      * _objWidth, j * _objHeight, _objWidth,
                                      _objHeight);

                      }

                  }
                  
      // 僅當(dāng)完成事件觸發(fā)并且有勝利圖片時,載入完成提示。
                  if (isEvent && _img2 != null) {
                      bg.drawImage(_img2, 
      00null);
                  }
              }
              
      // 舉凡繪制圖像時,應(yīng)遵循顯示圖像僅繪制一次的基本原則,一次性的將背景繪制到窗體。
              
      // 簡單來說,也就是采取[雙緩存]的方式,所有復(fù)雜操作皆在緩存區(qū)完成,也只有這樣才能避免產(chǎn)生延遲閃爍。
              g.drawImage(screen, 00this);
              g.dispose();
          }

          
      /**
           * 變更圖像。
           
      */
          
      public void update(Graphics g) {
              paint(g);
          }

          
      /**
           * 鼠標(biāo)點擊事件。
           
      */
          
      public boolean mouseDown(Event event, int i, int j) {

              
      if (isEvent)
                  
      return true;
              
      // 換算點擊位置與小圖片。
              int k = i / _objWidth;
              
      int l = j / _objHeight;
              copy(
      000, _RS);
              copy(k, l, 
      00);
              copy(
      0, _RS, k, l);
              
      int i1 = blocks[0];
              
      // 換算選中圖片存儲區(qū)。
              blocks[0= blocks[l * _CS + k];
              blocks[l 
      * _CS + k] = i1;
              
      int j1;
              
      for (j1 = 0; j1 < _COUNT; j1++) {
                  
      if (blocks[j1] != j1) {
                      
      break;
                  }
              }
              
      if (j1 == _COUNT)
                  isEvent 
      = true;
              repaint();
              
      return true;
          }

          
      public boolean mouseUp(Event event, int i, int j) {
              
      return true;
          }

          
      public boolean mouseDrag(Event event, int i, int j) {
              
      return true;
          }

          
      /**
           * copy換算后的圖像區(qū)域。
           * 
           * 
      @param i
           * 
      @param j
           * 
      @param k
           * 
      @param l
           
      */
          
      void copy(int i, int j, int k, int l) {
              later.copyArea(i 
      * _objWidth, j * _objHeight, _objWidth, _objHeight,
                      (k 
      - i) * _objWidth, (l - j) * _objHeight);
          }

          
      /**
           * 事件觸發(fā)狀態(tài)。
           * 
      @return
           
      */
          
      public boolean isEvent() {
              
      return isEvent;
          }

          
      public void setEvent(boolean isEvent) {
              
      this.isEvent = isEvent;
          }

          
      /**
           * 隨機(jī)生成面板圖片。
           * 
           
      */
          
      void rndPannel() {
              later.drawImage(_img, 
      00this);
              
      for (int i = 0; i < (_COUNT * _CS); i++) {
                  
      int j = (int) ((double) _CS * Math.random());
                  
      int k = (int) ((double) _RS * Math.random());
                  
      int l = (int) ((double) _CS * Math.random());
                  
      int i1 = (int) ((double) _RS * Math.random());
                  copy(j, k, 
      0, _RS);
                  copy(l, i1, j, k);
                  copy(
      0, _RS, l, i1);
                  
      int j1 = blocks[k * _CS + j];
                  blocks[k 
      * _CS + j] = blocks[i1 * _CS + l];
                  blocks[i1 
      * _CS + l] = j1;
              }

          }

          
      public static void main(String[] args) {

              Frame frm 
      = new Frame("簡單的JAVA拼圖效果實現(xiàn)[由Loonframework框架提供]");
              frm.setSize(
      480500);
              frm.setResizable(
      false);
              
      /**
               * PS:ImageHelper.loadImage為Loonframework框架中helper下方法,為不依賴于javax擴(kuò)展包而開發(fā)。
               * 可使用ImageIO相關(guān)方法代替。
               
      */
              
      // 加載圖像。
              Image backImage = ImageHelper.loadImage("C:/backimage.jpg"true);
              Image overImage 
      = ImageHelper.loadImage("C:/over.gif"true);
              
      // BlockImage中參數(shù)分別為 用于分解的拼圖,完成后顯示文字,拆分圖片為分幾列,分拆分圖片為幾行。
              
      //建議使用正方形圖片作為背景圖。
              frm.add(new BlockImage(backImage, overImage, 44));
              backImage 
      = null;
              overImage 
      = null;
              
      // 顯示窗體。
              frm.setVisible(true);

          }

      }
       

      詳細(xì)操作參見源碼注釋,所用圖片如下(也可自由選取圖形):






      本代碼算法支持自由成比例分隔圖像行列,效果若下:



      posted on 2007-10-16 19:37  cping  閱讀(833)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 日韩精品人妻黄色一级片| 一区二区三区四区自拍视频| 亚洲精品国精品久久99热| 农村老熟女一区二区三区| 顺平县| 亚洲区日韩精品中文字幕| 安龙县| 99久久精品费精品国产一区二 | 亚洲肥熟女一区二区三区| 在线中文字幕国产精品| 精品国产成人国产在线视| 亚洲国产精品午夜福利| 成人免费AA片在线观看| 亚洲成av人在线播放无码| 18禁无遮挡啪啪无码网站| 麻豆a级片| 日本va欧美va精品发布| 国产日韩久久免费影院| 亚洲中文字幕人妻系列| 国产69久久精品成人看| 亚洲天码中文字幕第一页| 狠狠亚洲色一日本高清色| 夜夜爱夜鲁夜鲁很鲁| 国产高清国产精品国产专区| 日韩伦理片| 亚洲鸥美日韩精品久久| 131mm少妇做爰视频| 国产一二三五区不在卡| 国产熟睡乱子伦视频在线播放| 99视频30精品视频在线观看| 亚洲五月丁香综合视频| 国产欧美日韩精品第二区| 无码av永久免费专区麻豆| 西乌珠穆沁旗| 护士张开腿被奷日出白浆| 伊在人间香蕉最新视频| 国产av永久无码天堂影院| gogogo高清在线播放免费| 欧洲精品码一区二区三区| 久久精品国产熟女亚洲av| 亚洲精品麻豆一区二区|