2013-10-04 4 views
0

이 문제는 Windows에서만 발생합니다. 리눅스에서 잘 돌아 간다.왜 LWJGL이 Windows에서 이전과 현재 gameState간에 깜박입니까?

나는 스택 기반의 상태 관리 시스템을 가지고있다. 한 상태에서 다른 상태로 전환하면 디스플레이가 이전 상태와 현재 상태 사이에서 깜박입니다. 버퍼 중 하나와 거의 비슷하게 이전 상태를 표시하고 현재 상태와 번갈아 표시합니다. 여기

은 처음 상태 초기화는, 그릴, 그리고 종료 코드 :

  • init이 상태가 처음로드

  • draw

  • pause가 호출 될 때마다 루프

    호출 될 때 호출 새 상태가 스택 맨 위에 놓이기 전에.

    private void init() 
    { 
        glEnable(GL_TEXTURE_2D); 
        glShadeModel(GL_SMOOTH);  
        glDisable(GL_DEPTH_TEST); 
        glDisable(GL_LIGHTING);     
    
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);    
        glClearDepth(1);          
    
    
        glEnable(GL_BLEND); 
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glViewport(0,0,Game.getGameConfig().getDisplayWidth(),Game.getGameConfig().getDisplayHeight ()); 
         glMatrixMode(GL_MODELVIEW); 
    
    
         glMatrixMode(GL_PROJECTION); 
         glLoadIdentity(); 
         glOrtho(0,Game.getGameConfig().getDisplayWidth(),  Game.getGameConfig().getDisplayHeight(), 0, 1, -1); 
         glMatrixMode(GL_MODELVIEW); 
    } 
    public void draw() { 
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 
        mainMenu.draw(); 
        Display.update(); 
    } 
        public void pause() { 
        glDisable(GL_BLEND); 
        glDisable(GL_TEXTURE_2D); 
    
    } 
    

이 새로운 상태를로드하는 방법입니다 : 여기

private void init() 
    { 
    glEnable(GL_TEXTURE_2D); 
    glShadeModel(GL_SMOOTH);  
    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_LIGHTING);     

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);    
    glClearDepth(1);          


    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 


    glViewport(0,0,Game.getGameConfig().getDisplayWidth(),Game.getGameConfig().getDisplayHeight()); 
    glMatrixMode(GL_MODELVIEW); 


    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0,Game.getGameConfig().getDisplayWidth(), Game.getGameConfig().getDisplayHeight(), 0, 1, -1); 
    glMatrixMode(GL_MODELVIEW); 
} 
public void draw() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    titleFont.drawString((Game.getGameConfig().getDisplayWidth()/2)-(titleFont.getWidth(titleText)/2), 
      (Game.getGameConfig().getDisplayHeight()/2) - (titleFont.getHeight()/2) , 
      titleText,Color.orange); 

    if(showStartText) 
    { 
     pressStartFont.drawString((Game.getGameConfig().getDisplayWidth()/2)-(pressStartFont.getWidth(pressStartText)/2), 
       (Game.getGameConfig().getDisplayHeight()/2) - (titleFont.getHeight() - 100), 
       pressStartText, Color.orange); 
    } 
} 

public void pause() { 
    glDisable(GL_BLEND); 
    glDisable(GL_TEXTURE_2D); 
} 

그리고

다음 gameState 코드입니다.

제 1 상태 호출 :

여기 super.sm.push(new MainMenu(super.sm));

가에서 StateManager이다 (sm) 코드 :

public void draw() 
{ 
    if(!states.empty()) 
    { 
     states.peek().draw(); 
    } 
    Display.update(); 
} 
: 메인 게임 루프는에서 StateManager이 메소드를 호출

public void push(GameState state) 
{ 
    if(!states.empty()) 
    { 
     states.peek().pause(); 
    } 
    states.push(state); 
    state.enter(); 
} 

fli 윈도우즈에서 상태가 달라 지나요?

+0

상태를 바꿀 때 버퍼를 제거해야 할 수도 있습니다. 그렇게 할 수있는 방법이 있습니까? – ZeroDivide

+0

처음으로 상태를 전환 한 후 두 프레임 모두 그려지는 기능이 있습니까? –

+0

나는 그렇게 생각하지 않는다. 상태 관리자는 상당히 견고하며, 리눅스에서 왜 제대로 작동하는지 설명하지는 않습니다. – ZeroDivide

답변

1

StateManager Draw 메서드와 gameState Draw 메서드 모두에서 Display.update();이 있습니다. 게임 상태에서 제거하십시오.

관련 문제