0

LWJGL プログラムに重大な問題があります。テキストの色の 1 つを設定すると、背景の色も変わります。
理由はわかっていると思います。すべての描画を無限ループに入れました。おそらくそれが理由です。
これで私を助けてもらえますか?問題の理由は正しいですか?はいの場合、どうすれば解決できますか?そうでない場合、何が問題だと思いますか? これが私のコードです:
メインクラス:

<!-- language: lang-java -->
public class DoomMain {
public static final int WIDTH = 640;
public static final int HEIGHT = 480;
public static final int SCALE = 1;

private static State state;

public DoomMain() {
    try {
        Display.setDisplayMode(new DisplayMode(WIDTH*SCALE,HEIGHT*SCALE));
        Display.setTitle("Tomco - Doom");
        Display.create();
    } catch(LWJGLException e) {
        e.printStackTrace();
    }

    while(!Display.isCloseRequested()) {                            
        state = State.MENU;     

        switch(state) {
            case INTRO:
                new Intro();
                break;
            case MENU:
                new MainMenu();
                break;
            case CREDITS:
                break;
            case GAME:
                break;
            default:
                break;
        }

        Display.update();
        Display.sync(60);
    }

    Display.destroy();
}


public static void main(String[] args) {
    new DoomMain(); 
}
}

MainMenu クラス:

<!-- language: lang-java -->
public class MainMenu {

private Texture background;
private TrueTypeFont doomfont;

private boolean ana = false;

public MainMenu()  {                
    glClear(GL_COLOR_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glEnable(GL11.GL_BLEND);
    glBlendFunc(GL11.GL_SRC_ALPHA,GL11.GL_ONE_MINUS_SRC_ALPHA);
    glViewport(0,0,DoomMain.WIDTH,DoomMain.HEIGHT);
    glMatrixMode(GL11.GL_MODELVIEW);
    glMatrixMode(GL11.GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0,DoomMain.WIDTH,DoomMain.HEIGHT,0,1,-1);
    glMatrixMode(GL11.GL_MODELVIEW);    
    glShadeModel(GL_SMOOTH);

    drawBackground();
    drawText();
    glDisable(GL_TEXTURE_2D);
}

private void drawBackground() {
    try {
        background = TextureLoader.getTexture("PNG",new FileInputStream(new File("res/textures/mainmenu/doom_00340461.png")));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        Display.destroy();
    } catch (IOException e) {
        e.printStackTrace();
        Display.destroy();
    }

    glBegin(GL_QUADS);
    {
        glTexCoord2f(0,0);
        glVertex2f(0,0);
        glTexCoord2f(1,0);
        glVertex2f(background.getTextureWidth(),0); 
        glTexCoord2f(1,1);
        glVertex2f(background.getTextureWidth(),background.getTextureHeight());
        glTexCoord2f(0,1);
        glVertex2f(0,background.getTextureHeight());
    }
    glEnd();
}

private void drawText() {
    Color.white.bind();
    try {
        InputStream inputStream = ResourceLoader.getResourceAsStream("res/fonts/DooM.ttf");
        Font awtFont = Font.createFont(Font.TRUETYPE_FONT,inputStream);
        awtFont = awtFont.deriveFont(24f);
        doomfont = new TrueTypeFont(awtFont,ana);
    } catch(Exception e) {
        e.printStackTrace();
    }

    doomfont.drawString(200,100,"Start new game",Color.red);
}
}
4

2 に答える 2

2

デフォルトでは、テクスチャは現在の色で乗算されます。ステート マシンとして、「現在の色」は最後に設定したときの色です。あなたの場合、テキストを描画するとき。ループに再び入ると、同じ色がテクスチャに使用されます。

問題を単純化するために、drawText ルーチン全体を色の設定だけに減らすことができます。

LOOP:
    a) draw background
    b) set color

結果: ... 色を設定します。背景を描く ...

glClear 関数は、既に描画されているもののバッファーをクリアしますが、次に使用する色はクリアしません。

解決策として、テクスチャを描画する直前に色を明示的に変更できます。glColor3f(1.0f, 1.0f, 1.0f) はテクスチャをそのまま生成し、他の値はカラー フィルターとして機能します (現在と同様)。

別の解決策は、 glTexEnvでテクスチャ描画動作を変更することです。テクスチャが GL_RGBA であると仮定すると、 glTexEnv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE) を呼び出すと機能します。リンクされたページには、さまざまな設定とその効果を示す表が含まれています。

于 2013-06-10T11:04:12.513 に答える
1

まず最初に:関数内のColor.white.bind()呼び出しは、drawText()おそらくバックグラウンドに影響を与えているものです。

これは、データを一度だけロードする方法の簡単で汚い例です。データの読み込みをloadData()関数に移動しました。クラスは画面が開いた後に一度作成され、DoomMainメインループの前に loadData() が呼び出され、 を使用して図面を呼び出しますmenu.draw()

理想的には、最初に必要なすべてのリソースを 1 か所にロードしてからDoomMain、初期化時にオブジェクトを に渡します。そのテクスチャとフォントを他の場所でも使用したい場合があります..そして、それを複数回ロードしたくない.

public DoomMain()
{
    // Open screen here since we need a context to make textures etc
    ...
    // Make objects for your different parts
    MainMenu menu = MainMenu();
    menu.loadData(); // <- Loads the texture and font

    while(!Display.isCloseRequested())
    {                           
        state = State.MENU;     
        switch(state) {
            ...
            case MENU:
                menu.draw();
                break;
            ...
        }
        Display.update();
        Display.sync(60);
    }
    Display.destroy();
}

メインメニュー

public class MainMenu
{       
    private Texture background;
    private TrueTypeFont doomfont;
    private boolean ana = false;

    public MainMenu() { }

    public void loadData()
    {
        // Load the background texture
        try {
            background = TextureLoader.getTexture("PNG",new FileInputStream(new File("res/textures/mainmenu/doom_00340461.png")));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Display.destroy();
        } catch (IOException e) {
            e.printStackTrace();
            Display.destroy();
        }
        // Load and initialize the font here
        try {
            InputStream inputStream = ResourceLoader.getResourceAsStream("res/fonts/DooM.ttf");
            Font awtFont = Font.createFont(Font.TRUETYPE_FONT,inputStream);
            awtFont = awtFont.deriveFont(24f);
            doomfont = new TrueTypeFont(awtFont,ana);
        } catch(Exception e) {
            e.printStackTrace();
        }       
    }

    public void draw()
    {
        glClear(GL_COLOR_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
        glClearColor(0.0f,0.0f,0.0f,0.0f);
        glEnable(GL11.GL_BLEND);
        glBlendFunc(GL11.GL_SRC_ALPHA,GL11.GL_ONE_MINUS_SRC_ALPHA);
        glViewport(0,0,DoomMain.WIDTH,DoomMain.HEIGHT);
        glMatrixMode(GL11.GL_MODELVIEW);
        glMatrixMode(GL11.GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0,DoomMain.WIDTH,DoomMain.HEIGHT,0,1,-1);
        glMatrixMode(GL11.GL_MODELVIEW);    
        glShadeModel(GL_SMOOTH);

        drawBackground();
        drawText();
        glDisable(GL_TEXTURE_2D);   
    }

    private void drawBackground() 
    {
        ... bind background texture
        ... draw your quad  
    }

    private void drawText() 
    {       
        doomfont.drawString(....);
    }
}
于 2013-06-10T04:06:45.677 に答える