在Java中,创建支持不同分辨率/显示模式的应用程序

时间:2012-06-02 22:43:32

标签: java image io resolution

我是一名正在学习用JAVA写游戏的初学者。

在我写的游戏中,我试图让它支持多个displayModes。首先让我先介绍一下我是如何设置显示设置的。

在代码的开头,我有一个我希望支持的显示模式列表

//List of supported display modes
private static DisplayMode modes[] = {
    new DisplayMode(640, 480, 32, 0),
    new DisplayMode(1024, 768, 32, 0),
}; 

然后,我从视频卡中获取支持的显示模式列表,比较列表并使用第一个匹配的显示模式。

/////////////////////////////////////////////
////Variable Declaration
/////////////////////////////////////////////
private GraphicsDevice vc;

/////////////////////////////////////////////   
//Give Video Card Access to Monitor Screen
/////////////////////////////////////////////
public ScreenManager(){
    GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
    vc = e.getDefaultScreenDevice();
}
/////////////////////////////////////////////
//Find Compatible display mode
/////////////////////////////////////////////
//Compare Display mode supported by the application and display modes supported by the video card
//Use the first matching display mode;
public DisplayMode findFirstCompatibleMode(DisplayMode modes[]){
    DisplayMode goodModes[] = vc.getDisplayModes();
    for(int x=0; x<modes.length; x++){
        for(int y=0; y<goodModes.length; y++){
            if (displayModesMatch(modes[x], goodModes[y])){
                return modes[x];
            }
        }
    }
    return null;
}

/////////////////////////////////////////////   
//Checks if two Display Modes match each other
/////////////////////////////////////////////
public boolean displayModesMatch(DisplayMode m1, DisplayMode m2){

    //Test Resolution
    if (m1.getWidth() != m2.getWidth() || m1.getHeight() != m2.getHeight()){
        return false;
    }

    //Test BitDepth
    if (m1.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI && m2.getBitDepth() != DisplayMode.BIT_DEPTH_MULTI
            && m1.getBitDepth() != m2.getBitDepth()){
        return false;
    }

    //Test Refresh Rate
    if (m1.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN &&
            m2.getRefreshRate() != DisplayMode.REFRESH_RATE_UNKNOWN &&
            m1.getRefreshRate() != m2.getRefreshRate()){
        return false;
    }

    return true;
}

目前,我只支持两种分辨率,640x480和1024x768。

为了让我的游戏中的每个元素都能在两种分辨率下都可用,首先我会找到调整屏幕大小的数量并将此值存储在名为resizeRatio的变量中

private void getResizeRatio(){
    resizeRatio = (double)1024/(double)s.getWidth();
    //s.getWidth() returns the current width of the screen.
}

对于我导入的每个图像,我将通过此resizeRatio划分图像的高度和宽度。

/////////////////////////////////////////////
//Scale the image to the right proportion for the resolution
/////////////////////////////////////////////
protected Image scaleImage(Image in){
    Image out = in.getScaledInstance((int)(in.getWidth(null)/resizeRatio), (int)(in.getHeight(null)/resizeRatio), Image.SCALE_SMOOTH);
    return out;
}

这一切都很好,直到我的应用程序变得越来越大。很快我意识到我忘了调整一些图标,当分辨率为640x480时,它们都处于错误的位置。

此外,我意识到我必须缩放,不仅仅是我所有图像的大小,而是所有的移动速度,以及所有位置,因为每次刷新我的角色移动速度为5px使得他在显示时移动得更快640x480比1024x768显示时

所以我的问题是,有没有一种方法可以同时扩展所有图像,而不是单独缩放每个图像,每个图标和每个动作?或者更确切地说,必须有另一种做法,所以有人可以告诉我吗?

感谢您阅读,我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

使用paintComponent(Graphics g)paint方法,您可以使用Graphics2D.scale

private double scale = 0.75;

@override
public void paintComponent(Graphics g) {
    Graphics2D g2 = (Graphics2D)g; // The newer more ellaborate child class.
    g2.scale(scale, scale);
    ...
    g2.scale(1/scale, 1/scale);
}