作者:alexhy

为了用标准的SUN WTK2.1开发能兼容各种机型的MIDP2.0游戏,会遇到一个奇怪的全屏问题,在K700上好好的,到了Nokia上居然死活显示一半,又不想在 Eclipse里改用很不爽的Nokia wtk(配置麻烦,有中文问题,启动也慢),费了一番功夫后,终于不用FullCanvas实现了兼容K700和Nokia的全屏显示,方法如下:

在 索爱的K700上,实现全屏很简单,如下写法就可以了: public Canvas1() { super(false); this.setFullScreenMode(true); this.width=getWidth(); this.height=getHeight(); } 得到的屏幕大小是176*220。

Nokia上就比较奇怪了,这种方式取得的 width和height居然是176*144。需要加以下代码修正一下: if(width>=176) { if(height<208) { height=208; } } 绘图部分都以width和height为基准。另外canvas1不能继承系统的GameCanvas,因为系统GameCanvas里的缓冲图还是 176*144的,画出来就只能是半屏,我用j2me polish里的GameCanvas修改一下后,放到src里代替系统GameCanvas就OK了。

修正过的GameCanvas代码如下:

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;

public abstract class GameCanvas extends Canvas{
    public static final int UP_PRESSED = 0x0002;

    public static final int DOWN_PRESSED = 0x0040;

    public static final int LEFT_PRESSED = 0x0004;

    public static final int RIGHT_PRESSED = 0x0020;

    public static final int FIRE_PRESSED = 0x0100;

    public static final int GAME_A_PRESSED = 0x0200;

    public static final int GAME_B_PRESSED = 0x0400;

    public static final int GAME_C_PRESSED = 0x0800;

    public static final int GAME_D_PRESSED = 0x1000;

    protected int keyStates;
    protected int releasedKeys;
    private Image bufferedImage;
    private int clipX, clipY, clipWidth, clipHeight;
    private boolean setClip;

    protected GameCanvas(boolean suppressKeyEvents) {
        super();
        this.setFullScreenMode(true);
        int width = getWidth();
        int height = getHeight();
        if (width >= 176) {
            if (height < 208) {
                height = 208;
            }
        }
        this.bufferedImage = Image.createImage(width, height);
    }

    protected Graphics getGraphics() {
        return this.bufferedImage.getGraphics();
    }

    public int getKeyStates() {
        int states = this.keyStates;
        this.keyStates &= ~this.releasedKeys;
        this.releasedKeys = 0;
        return states;
    }

    public void paint(Graphics g) {
        if (this.setClip) {
            g.clipRect(this.clipX, this.clipY, this.clipWidth, this.clipHeight);
            this.setClip = false;
        }
        g.drawImage(this.bufferedImage, 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();
    }

    protected void keyPressed(int keyCode) {
        int gameAction = KeyMapping.getGameKey(keyCode);
        if (gameAction != 0) {
            int bit = 1 << gameAction;
            this.keyStates |= bit;
            this.releasedKeys &= ~bit;
        }
    }

    public void setFullScreenMode(boolean enable) {
        super.setFullScreenMode(enable);
    }

    protected void keyReleased(int keyCode) {
        int gameAction = KeyMapping.getGameKey(keyCode);
        if (gameAction != 0) {
            this.releasedKeys |= 1 << gameAction;
        }
    }

}

以上方法适用于MIDP2.0,标准的MIDP1.0里不支持this.setFullScreenMode(true)命令,只有用FullCanvas了。