J2ME程序的平臺移植辦法

    大家都知道因爲手機屏幕大小的不同使得很多遊戲適應性不好,比如說在128*128上運行很好的遊戲,如果移植到176*208則屏幕中的元素位置要麼是全亂了,要麼還是顯示爲128*128, 屏幕很大一快地方沒有利用起來,整個界面看起來也奇醜無比.

下面介紹一種簡單的辦法來避免這種問題.其實思想很簡單,就是屏幕中的元件顯示位置全部採用相對座標,而大小根據當前設備屏幕進行縮放.

下面用一個同一張圖像根據不同的的設備屏幕大小而進行相應的全屏顯示(利用了簡單的插值算法). 下面這個example是在nokia s40s60上做實驗的.

原始圖像大小

s60上的全屏顯示

s40上的全屏顯示.

程序代碼如下:

package src;

 

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class MainMidlet extends MIDlet implements CommandListener {

       //prarameters

       private MyGame myGame = null;

 

       private Display display = null;

 

       public MainMidlet()

       {

              super();

              // TODO 自動生成構造函數存根

              myGame = new MyGame();

       }

 

       protected void startApp() throws MIDletStateChangeException

       {

              // TODO 自動生成方法存根

              if (display == null)

                     display = Display.getDisplay(this);

              display.setCurrent(myGame);

 

       }

 

       protected void pauseApp()

       {

              // TODO 自動生成方法存根

 

       }

 

       protected void destroyApp(boolean arg0) throws MIDletStateChangeException

       {

              // TODO 自動生成方法存根

 

       }

 

       public void commandAction(Command c, Displayable d)

       {

       }

 

}

 

package src;

 

import java.io.*;

import javax.microedition.lcdui.*;

import javax.microedition.lcdui.game.*;

 

/*

 * 這個文件是用於測試半透明遮罩效果.其實現原理很簡單,就是用一個Graphic.drawRgb()函數實現的.參見render函數

 * 其中要用到一個象素數組, 用它來指定半透明的顏色效果和透明效果,參見構造函數即可.

 */

 

public class MyGame extends Canvas implements Runnable {

             

       private Image im           = null ;

             

       public MyGame()

       {

              // TODO 自動生成構造函數存根

              setFullScreenMode(true) ;

      

              try{

                     im = Image.createImage("/res/girl.png") ;

              }catch(NullPointerException e){System.out.println("load file failed") ;}

              catch(IOException e){e.toString() ;}   

       }

       protected void paint(Graphics g)

       {

              // TODO 自動生成方法存根

              Image t = ImageUint.scalse(im, getWidth(), getHeight()) ;

              g.drawImage(t, 0, 0, Graphics.TOP|Graphics.LEFT) ;   //畫縮放後的圖像

              //g.drawImage(im, 0, 0, Graphics.TOP|Graphics.LEFT) ; //畫原始圖像

       }

}

 

//下面縮放代碼是在網上代碼改編的,如有侵犯到您的版權,請通知我[email protected],我將在24小時內刪除.

package src ;

 

import javax.microedition.lcdui.Graphics;

import javax.microedition.lcdui.Image;

import javax.microedition.lcdui.game.Sprite;

 

public class ImageUint {

 

public static final Image scale (Image srcImage, int newW, int newH)

 {

       int srcW = srcImage.getWidth();

       int srcH = srcImage.getHeight();

 

      

       Image tmp = Image.createImage(newW, srcH);

       Graphics g = tmp.getGraphics();

 

       int srcx = 0 ;

       int srcy = 0 ;

       int newx = 0 ;

       int newy = 0 ;

       int prex = 0 ;

       int prey = 0 ;

       int scale = 0 ;

      

       scale = newW/srcW ;

       for (newx = 0; newx < newW; newx++) {

       if((newx-prex) >= (scale+1))

       {

              prex = newx ;

              srcx++ ;

       }

              g.drawRegion(srcImage,srcx,0,1,srcH, Sprite.TRANS_NONE, newx, 0, Graphics.LEFT | Graphics.TOP);

 

       }

 

       Image dst = Image.createImage(newW, newH);

       g = dst.getGraphics();

 

       scale = newH/srcH ;

       for (newy = 0; newy < newH; newy++) {

              if((newy-prey) > (scale+1))

              {

                     prey = newy ;

                     srcy++ ;

              }

                     g.drawRegion(tmp,0,srcy,newW,1, Sprite.TRANS_NONE, 0, newy, Graphics.LEFT | Graphics.TOP);

       }

       return dst ;

 }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章