Почему LWJGL мигает между предыдущим и текущим gameState только на Windows?
Эта проблема возникает только в Windows. Работает нормально в Linux.
У меня есть система управления состоянием на основе стека. Когда я переключаюсь из одного состояния в другое, дисплей мигает между предыдущим и текущим состояниями. Его почти как один из буферов по-прежнему отображает предыдущее состояние и чередуется с текущим состоянием.
Вот мой первый код состояния init, draw и exit:
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() { 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); }
А вот следующий игровой код штата:
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); }
Вот как загружается новое состояние.
Первое состояние вызывает:
super.sm.push(new MainMenu(super.sm));
Вот StateManager (sm
) код:
public void push(GameState state)
{
if(!states.empty())
{
states.peek().pause();
}
states.push(state);
state.enter();
}
Основной игровой цикл вызывает этот метод в StateManager:
public void draw()
{
if(!states.empty())
{
states.peek().draw();
}
Display.update();
}
Что вызывает мерцание между состояниями в Windows?
1 ответ
У тебя есть Display.update();
Как в вашем методе StateManager Draw, так и в вашем методе gameState Draw. Удалите тот, который находится в вашем игровом состоянии.