2013-09-20 4 views
-1

Я использую winforms с xna. Все работает до сих пор, за исключением чертежа. Это начальный код, который я имел:Экран, не освежающий проект XNA

 protected override void Draw() 
     { 
      GraphicsDevice.Clear(Color.CornflowerBlue); 
      spriteBatch.Begin(); 
      tileSheet.Draw(spriteBatch); 
      foreach (Image img in selector) 
       img.Draw(spriteBatch); 
      spriteBatch.End(); 
     } 

я поставил точку останова, и это вызов метода рисования, но ничего не меняется на экране, но когда я делаю это:

protected override void Draw() 
    { 
     GraphicsDevice.Clear(Color.CornflowerBlue); 
     spriteBatch.Begin(); 
     tileSheet.Draw(spriteBatch); 
     foreach (Image img in selector) 
      img.Draw(spriteBatch); 
     spriteBatch.End(); 

     Invalidate(); 
    } 

Это работает! но проблема в том, что все замораживается и, похоже, попадает в цикл Invalidate. Но почему последний работает, но не бывший? Я работаю над этим часами, и я не могу понять, что пойдет не так: /.

Я чувствую, что это что-то простое, но я не могу обвести вокруг себя голову.

Я также попробовал обновление и обновление, и они тоже не работают.

+0

Возможный дубликат [Invalidate не загружается, если не повторяется? (Winforms and Xna)] (http://stackoverflow.com/questions/18907657/invalidate-doesnt-load-unless-repeated-winforms-and-xna) – pinckerman

ответ

0

Invalidate называет Draw , так и с Invalidate в смеси, Invalidate -> Draw -> Invalidate -> Draw -> ..

"Исправить", чтобы не Invalidate в розыгрыше , Вместо этого вызовите Invalidate в ответ на вход , для которого потребуется [re] ничья. В случае «нерабочего» (но действительно, он работает!) Прежний, обязательно вызовите Invalidate , если необходимо, но извне обработчик рисования.


Invalidate называет Draw "в какой-то момент позже", но это асинхронное действие. Он эффективно отправляет сообщение, которое обрабатывает процесс WinForms в цикле оконных сообщений, а затем вызывает OnPaint, который, наконец, вызывает Draw. Однако вызов Invalidate from Draw приведет к «слишком большому количеству обновлений».

+0

Я понимаю, как работает недействительный. У меня это в моем методе Initialize. Application.Idle + = delegate {Invalidate(); }; и он действительно вызывает метод draw, но ничего не обновляется, если не поместить его в метод draw. Это моя проблема – CodingMadeEasy

+0

@CodingMadeEasy Возможно, см. Http://stackoverflow.com/a/4134476/2246674 – user2246674

+0

У меня это в моем коде .. – CodingMadeEasy

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