大家都知道因为手机屏幕大小的不同使得很多游戏适应性不好,比如说在128*128上运行很好的游戏,如果移植到176*208则屏幕中的元素位置要么是全乱了,要么还是显示为128*128, 屏幕很大一快地方没有利用起来,整个界面看起来也奇丑无比.
下面介绍一种简单的办法来避免这种问题.其实思想很简单,就是屏幕中的元件显示位置全部采用相对座标,而大小根据当前设备屏幕进行缩放.
下面用一个同一张图像根据不同的的设备屏幕大小而进行相应的全屏显示(利用了简单的插值算法). 下面这个example是在nokia s40和s60上做实验的.
原始图像大小
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 ;
}
}