2010-11-18 3 views
-1

У меня есть форма с панелью, в которой я хочу отобразить анимированную 3D-сцену, используя XNA. Каков наилучший способ постоянно перекрасить эту панель?Каким образом можно управлять анимацией?

Я сейчас думаю о добавлении System.Windows.Forms.Timer к форме и добавлении обработчика событий к Timer.Tick, который обновляет мою 3D-сцену и вызывает Invalidate на панели.

Есть ли лучший способ сделать это? Отрисовка не является критичной, я не хочу, чтобы остальная часть формы становилась невосприимчивой, но, с другой стороны, если есть время, я хотел бы, чтобы рендеринг выполнялся при частоте обновления монитора.

ответ

1

Да, таймер будет работать. Вот хитроумный трюк, который я видел в примере Microsoft, который показал, как использовать XNA в проекте Winforms. Он использует событие Application.Idle:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     pictureBox1.Paint += new PaintEventHandler(pictureBox1_Paint); 
     Application.Idle += new EventHandler(Application_Idle); 
     this.FormClosed += delegate { Application.Idle -= Application_Idle; }; 
    } 

    private void Application_Idle(object sender, EventArgs e) { 
     pictureBox1.Invalidate(); 
    } 

    int cnt; 
    void pictureBox1_Paint(object sender, PaintEventArgs e) { 
     cnt++; 
     e.Graphics.DrawString(cnt.ToString(), this.Font, Brushes.Black, 0, 0); 
    } 
} 

Я использовал PictureBox вместо панели, чтобы скрыть мерцание, PB имеет свойство DoubleBuffered включено. Это не очень важно для XNA. Использование vsync не будет работать afaik. Вероятно, вы должны проверить этот пример, «вращающийся треугольник» был полностью гладким, без разрыва, когда я его пробовал. This thread рассказывает об этом.

Смежные вопросы