使用Windows窗体和OpenGl-C的事件消息#
我只是想知道这是否是一种正常的行为,是否有什么可以阻止它 我在Windows窗体上使用OpenGL和TaoClassic(可能与此问题无关,但很好)。 现在,我有一个非常基本的正方形,它在窗口周围移动,当到达窗口边缘时,速度是倒转的(x为左/右,y为上/下) 到目前为止没有什么特别的 当对象移动时,如果我单击窗体的边框,那么应用程序将停止,新图形不会出现,但应用程序会部分更新。我之所以这么说,部分是因为从下面的代码来看,前两行代码继续运行,而“冲突”检测则没有使用Windows窗体和OpenGl-C的事件消息#,windows,forms,events,opengl,Windows,Forms,Events,Opengl,我只是想知道这是否是一种正常的行为,是否有什么可以阻止它 我在Windows窗体上使用OpenGL和TaoClassic(可能与此问题无关,但很好)。 现在,我有一个非常基本的正方形,它在窗口周围移动,当到达窗口边缘时,速度是倒转的(x为左/右,y为上/下) 到目前为止没有什么特别的 当对象移动时,如果我单击窗体的边框,那么应用程序将停止,新图形不会出现,但应用程序会部分更新。我之所以这么说,部分是因为从下面的代码来看,前两行代码继续运行,而“冲突”检测则没有 transform
transform.position.x += velocity.x * xSign * Time.deltaTime;
transform.position.y += velocity.y * ySign * Time.deltaTime;
if (penguin.transform.position.x + penguin.sprite.texture.width / 2f > Engine.Screen.Width ||
penguin.transform.position.x - penguin.sprite.texture.width / 2f < 0) xSign *= -1;
if (penguin.transform.position.y + penguin.sprite.texture.height / 2f > Engine.Screen.Height ||
penguin.transform.position.y - penguin.sprite.texture.height / 2f < 0) ySign *= -1;
下面是应用程序的消息:
private void OnApplicationEnterIdle(object sender, EventArgs e)
{
Message msg;
while (!PeekMessage(out msg, IntPtr.Zero, 0, 0, 0))
{
_timer.SetTime();
Input.Update();
_callback();
}
}
我想问题就在其中一个。Update和Draw方法是从_callback()调用的;方法
仅供参考,当单击表单时,它不会停止应用程序,因此它必须处理基于单击边框的事件
有什么想法吗?这是正常的行为。移动和调整事件大小是阻塞的(这是默认WndProc的工作方式),并且不会调用OnApplicationEntriedle
AFAIK在调整窗口大小时继续更新的唯一方法是使用不同的线程进行渲染。在这种情况下,只有主线程将阻止移动并调整事件大小,而渲染线程将继续更新视口。我的想法是停止更新,而不是继续更新。延续是问题所在,也是为什么只考虑前两行。如果要停止更新,只需在移动/调整大小事件后重置Time.deltaTime。查看代码,我猜_timer.SetTime();将重置deltaTime。
private void OnApplicationEnterIdle(object sender, EventArgs e)
{
Message msg;
while (!PeekMessage(out msg, IntPtr.Zero, 0, 0, 0))
{
_timer.SetTime();
Input.Update();
_callback();
}
}