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