2011-06-05 39 views
1

我目前正在研究一個項目,該項目允許我通過使某些遊戲專用人工智能(它們是C#類)與其他人進行比較來比較一些遊戲專用人工智能。該項目包括一個OpenGL動畫來查看這些類之間的匹配。C#窗體不會加載,直到OpenGL動畫停止工作

所以基本上我有一個包含OpenGL動畫的表單,另一個表單包含有關比較的選項和信息。但似乎我的動畫表格正在計算時間內凍結項目的其餘部分。

下面是代碼,當我開始比賽:

 FormGL formGL = new FormGL(); 
     formGL.Show(); 


     // Variables declaration 
     // 
     // Variable declaration 

     while (verifVictoire(plateau, _playerTurn) == false && nombreTours < 64) 
     { 
      if (_playerTurn == 1) _playerTurn = 2; 
      else _playerTurn = 1; 
      try 
      { 
       // Calculation part 
       if (_playerTurn == 1) resultat = _AIPlayer1.Joue(plateau, _playerTurn); 
       else resultat = _AIPlayer2.Joue(plateau, _playerTurn); 
       pion = resultat[2] * 16 + resultat[1] * 4 + resultat[0] + 1; 
       plateau[resultat[0], resultat[1], resultat[2]] = _playerTurn; 
       nombreTours++; 

       formGL.affichPion(_playerTurn, pion); // Send the move to display in the animation 
       Thread.Sleep(100); // Pause before next move 
      } 
      catch (IndexOutOfRangeException) 
      { 
       // Exception management 
      } 
     } 

當我使用該代碼,無論是形式的開放,但他們都不動畫已停止工作之前完成加載。所以我只能看到兩個表單(空的),動畫更新正確,但其他內容(標籤,菜單,按鈕等)是不可見的,直到動畫停止工作。 我知道一個Thread.Sleep正在影響當前線程並可能是原因,但即使我將其刪除,問題仍然會發生。

的FormGL包含這些方法(除其他外,但我不認爲他們可以負責的這個)

public FormGL() 
    { 
     this.CenterToScreen(); 
     InitializeComponent(); 
    } 

private void FormGL_Load(object sender, EventArgs e) 
    { 
     GLPanel.InitializeContexts(); 
     Gl.glShadeModel(Gl.GL_SMOOTH); 
     Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     Gl.glClearDepth(1.0f); 
     Gl.glEnable(Gl.GL_DEPTH_TEST); 
     Gl.glDepthFunc(Gl.GL_LEQUAL); 
     GLWindow_Resize(this, null); 
     Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); 
    } 

public void affichPion(int Player, int Pion) 
    { 
     if (Pion != 0) 
     { 
      joueur[Pion - 1] = Player; 
      positionJeton[Pion - 1] = Pion; 
      GLWindow_Resize(this, null); 
      GLPanel.Refresh(); 
     } 
    } 

public void GLWindow_Resize(object sender, EventArgs e) 
    { 
     float aspect = (float)GLPanel.Width/(float)GLPanel.Height; 
     Gl.glMatrixMode(Gl.GL_PROJECTION); 
     Gl.glLoadIdentity(); 
     Gl.glViewport(0, 0, GLPanel.Width, GLPanel.Height); 
     Glu.gluPerspective(60, aspect, 1.0, 300); 
     Gl.glMatrixMode(Gl.GL_MODELVIEW); 
     Gl.glLoadIdentity(); 

     Glu.gluLookAt(x, y, z, centerX, centerY, centerZ, upX, upY, upZ); 
     Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); 
    } 

private void FormGL_Resize(object sender, EventArgs e) 
    { 
     GLWindow_Resize(this, null); 
     GLPanel.Refresh(); 
    } 

回答

1

你不能做出任何形式繪製時間本身。 嘗試在睡前放Application.DoEvents()

但是,我會建議在其他線程上運行while循環以避免此問題。

+0

哇,我甚至不知道我能做到這一點。這正是我正在尋找的,我的問題現在已經修復。非常感謝您的幫助,您爲我節省了寶貴的時間! – 2011-06-06 09:45:29