0

我正在创建一个 J2ME 游戏,我注意到 getHeight() 函数的奇怪行为。

而不是以像素为单位给出全屏的高度,它似乎返回的比那个少

我的代码:

游戏画布.java:

package game1;

import java.io.IOException;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

public class Gamecanvas extends GameCanvas implements Runnable{

    private int W=getWidth(),H=getHeight();

    public Gamecanvas(){    
    super(false);
    }
//First called by the Midlet
    public void start(){
        setFullScreenMode(true);


        Thread thread=new Thread(this);
        thread.start();
    }

    public void run() {

        System.out.println("Running Thread!");
        Graphics(getGraphics());

    }

    private void Graphics(Graphics g) {
        Colours(g);

    }

    private void Colours(Graphics g) {
        int w=getWidth(),h=getHeight();

        System.out.println("Correct height="+h);
            System.out.println("Wrong Height="+H);

        g.setColor(0xFFFF00);
        g.fillRect(0, 0, w, h);
        //If i write g.fillRect(0,0,W,H); the screen is not fully filled

        flushGraphics();
    }


}

放置时 int h=getHeight(); 在方法内部它返回 309 这是正确的,当放置 int H=getHeight(); 外部方法它返回 291 这是错误的

getWidth 没有问题。w 和 W 都返回 240。

那么,是什么导致了 getHeight() 的这种异常行为呢?

4

1 回答 1

1

getHeight()在调用构造函数之前调用(或与此相关的任何函数)通常是一个坏主意。只有当构造函数被调用时,对象才被实例化。

您在调用getHeight()构造函数之前调用,因此得到值 291,我猜这是非全屏模式下的可用高度。然后调用构造函数,在其中 you setFullScreenMode(true),然后值变成 309。

其他一些需要注意的事情:调用setFullScreenMode(true)构造函数实际上也是一个坏主意(至少根据某些人的说法),因为尚未创建对象。最佳实践是在方法内部调用它run()。如果您在构造函数中调用它,它仍将在某些设备上运行,但某些设备可能会抱怨它。不过,这似乎只适用于 JavaME,因为当您查看 Android 开发时,您会发现很多情况下您实际上被迫以完全相反的方式编写代码……也就是说,在构造函数中调用对象上的函数。去搞清楚。

无论如何,要记住的另一件事是getHeight()它将返回可用像素的数量。仅仅因为手机的分辨率为 240x320 像素,并不意味着您可以使用 320 像素。一些设备“窃取”一些像素用于我们并不真正想要的愚蠢事情,但我们对此无能为力。

编辑:关于“不要在其构造函数内的对象上调用函数”:当它存在时,它在 j2meforums.org 上进行了很多讨论。许多开发人员在 setFullScreenMode(true) 工作时遇到问题,因为他们在构造函数中调用了它。当你考虑它时,它是有道理的。您不能在尚不存在的对象上调用函数,并且在调用构造函数之前它不存在。(这就是为什么一些 J2ME 开发人员对 Android 开发感到困惑的原因,因为在 Android 开发中,您实际上被迫在它们自己的构造函数中调用各种对象的函数。来自 J2ME,这种做事方式需要一点时间来适应)。

于 2014-05-04T12:58:47.670 回答