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) ; //画原始图像

       }

}

 

//下面缩放代码是在网上代码改编的,如有侵犯到您的版权,请通知我dequan_sun@163.com,我将在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 ;

 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值