1

私は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 の 2 つの解像度のみをサポートしています。

ゲームのすべての要素を両方の解像度で利用できるようにするために、まず、画面のサイズがどれだけ変更されているかを調べ、この値を 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 の場合、それらはすべて間違った場所にあります。

さらに、すべての画像のサイズだけでなく、すべての移動速度、およびすべての位置もスケーリングする必要があることに気付きました。キャラクターをリフレッシュごとに 5 ピクセルで移動させると、640x480 で表示したときよりもはるかに速く移動するためです。 1024x768 で表示

私の質問は、すべての画像、すべてのアイコン、すべての動きを個別にスケーリングする代わりに、すべてを一度にスケーリングする方法はありますか? というか、他に方法があるはずなので誰か教えていただけないでしょうか?

読んでいただきありがとうございます。どんな助けでも大歓迎です。

4

1 に答える 1

2

paintComponent(Graphics g)またはメソッドで、Graphics2D.scalepaintを使用して実行できます。

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);
}
于 2012-06-02T22:56:24.853 に答える