程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> 關於j2me game雙緩沖實現探討

關於j2me game雙緩沖實現探討

編輯:J2ME
 雙緩沖技巧的利用很廣泛,設計游戲的時候更是需要它。

     在midp1.0中,api中並沒有game這個包,看到網上許多人在討論設計游戲的時候會呈現圖片段裂,屏幕閃耀等標題。

     我經過這幾天的學習收拾下自己的學習心得,用來拋磚,希看對此有研究高手們相互討論。讓我也學習學習。

     雙緩沖的原理可以這樣形象的懂得:把電腦屏幕看作一塊黑板。首先我們在內存環境中建立一個“虛擬“的黑板,然後在這塊黑板上繪制復雜的圖形,等圖形全部繪制完畢的時候,再一次性的把內存中繪制好的圖形“拷貝”到另一塊黑板(屏幕)上。采用這種方法可以提高繪圖速度,極大的改良繪圖後果。

    對於手機來說。具體的過程就是通過extends Canvas。然後獲取bufferImage。再然後就getGraphics。最後就是在這個graphics中繪制圖片等,再最後就是把這個繪制好的bufferImage繪制的屏幕上。

     說回說。具體還是要看代碼的。裡面的代碼參照了一些開源的代碼。


Java 代碼

package org.wuhua.game;

import Javax.microedition.lcdui.Canvas;

import Javax.microedition.lcdui.Graphics;

import Javax.microedition.lcdui.Image;

/**

 * 類名:GameCanvas.Java

 編寫日期: 2006-11-29

 程序功效描寫:

 * 實現雙緩沖的Game畫布。實現原理是創立一個BufferImage。然後繪制,最後顯示出來。就這麼簡略。

 Demo:

 Bug:

 *

 *

 * 程序變更日期 :

 變更作者 :

 變更闡明 :

 *

 * @author wuhua

 */

public abstract class GameCanvas extends Canvas {

    /**

     * 繪制緩沖的圖片。用戶繪制資源的時候都是把持這個圖片來進行的

     */

    private Image bufferImage;

    private int height;

    private int width;

    private int clipX, clipY, clipWidth, clipHeight;

    private boolean setClip;

    protected GameCanvas() {

        super();

        width = getWidth();

        height = getHeight();

        this.bufferImage = Image.createImage(width, height);

    }

    protected void paint(Graphics g) {

        //假如請求繪制指定區域的話就需要這樣了

        if (this.setClip) {

            g.clipRect(this.clipX, this.clipY, this.clipWidth, this.clipHeight);

  this.setClip = false;

        }

        g.drawImage(this.bufferImage, 0, 0, Graphics.TOP | Graphics.LEFT);

    }

    public void flushGraphics(int x, int y, int width, int height) {

        this.setClip = true;

        this.clipX = x;

        this.clipY = y;

        this.clipWidth = width;

        this.clipHeight = height;

        repaint();

        serviceRepaints();

    }

    public void flushGraphics() {

        repaint();

        serviceRepaints();

    }

    /**

     * 設計者重要是通過調用這個方法獲取圖片。然後就可以繪制了

     * @return

     */

    protected Graphics getGraphics() {

        return this.bufferImage.getGraphics();

    }

    /**

     * 這個方法重要是處理諾基亞平台,用戶調用setFullScreenMode(boolean enable) 時重新按照新的w & h創立緩沖圖片

     */

    protected final void sizeChanged(int w, int h) {

        if (h > height) {

            this.bufferImage = Image.createImage(w, h);

        }

    }

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved