Я пытаюсь сделать пошаговый движок roguelike для XNA. Я в основном портирую игру с предыдущей работы, которую я проделал с использованием библиотеки roguelike на основе SDL под названием libtcod. Как я могу изменить базовый шаблон XNA, чтобы игра не перерисовывала экран каждый кадр, а вместо этого, когда я хочу?
Ручное управление перерисовкой экрана
Ответы (2)
Правильный метод для этого - вызывать GraphicsDevice.Present() всякий раз, когда вы хотите вывести задний буфер на экран.
Проблема в том, что класс Game автоматически вызывает для вас Present (особенно в Game.EndDraw), чего вы не хотите, чтобы он делал. К счастью, Game предоставляет несколько способов предотвратить вызов Present:
Лучшим способом было бы переопределить BeginDraw и вернуть ему false, чтобы предотвратить отрисовку фрейма (включая предотвращение вызова Draw и EndDraw), например:
protected override bool BeginDraw()
{
if(readyToDraw)
return base.BeginDraw();
else
return false;
}
Другие альтернативы - вызвать Game.SuppressDraw или переопределить EndDraw таким образом, чтобы он не вызывал base.EndDraw(), пока вы не будете готовы к отображению кадра на экране.
Лично я бы просто рисовал каждый кадр.
Вам не нужно наследовать от класса Game, это совершенно необязательно. Вы можете написать свой собственный класс, который перерисовывает экран только тогда, когда вы хотите. Однако в классе есть полезный код, поэтому вы можете использовать Reflector, чтобы скопировать код оттуда, а затем изменить его логику.