我目前正在开展一个项目,它允许我比较一些游戏专用的人工智能(C#类),让它们与其他人玩游戏。该项目包括一个OpenGL动画,用于查看这些类之间的匹配。
所以基本上我有一个包含OpenGL动画的Form,另一个包含有关比较的选项和信息的Form。但似乎我的动画表格在计算时间内使项目的其余部分冻结。
以下是我开始比赛时的代码:
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();
}
答案 0 :(得分:1)
您没有随时提供表格来吸引自己。
在睡觉前尝试放Application.DoEvents()
。
但是,我建议在不同的线程上运行while循环以避免这个问题。