Ручное управление при перерисовке экрана - PullRequest
4 голосов
/ 29 октября 2010

Я пытаюсь сделать пошаговый движок для XNA.Я в основном портирую игру из предыдущей работы, которую я делал, используя основанную на SDL roguelike-библиотеку libtcod.Как я могу изменить базовый шаблон XNA, чтобы игра не перерисовывала экран каждый кадр, а вместо этого, когда я хочу?

Ответы [ 2 ]

5 голосов
/ 30 октября 2010

Правильный метод для этого - вызывать 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(), пока вы не будете готовы отобразить кадр на экране.

Лично я бы просто рисовал каждый кадр.

2 голосов
/ 30 октября 2010

Вам не нужно наследовать от класса Game, это совершенно необязательно.Вы можете написать свой собственный класс, который перерисовывает экран только тогда, когда вы хотите.Однако в классе есть некоторый полезный код, поэтому вы можете использовать Reflector, чтобы скопировать код и затем изменить его логику.

...