只是想知道这是否是正常行为以及是否有任何可以阻止它的东西。
我在 Windows 窗体上使用 OpenGL 和 TaoClassic(可能与问题无关,但很好)。目前,我有一个非常基本的正方形,它在窗口周围移动,当到达窗口边缘时,速度会反转(左/右时为 x,上/下时为 y)。
到目前为止,没有什么花哨的。
它变得花哨的地方是当对象移动时,如果我单击表单的边框,那么应用程序会停止,新的绘图不会发生,但应用程序会部分保持更新。我说部分是因为从前两行下面的代码继续运行,而“碰撞”检测不是
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;
没有天才的把戏。当我释放鼠标按钮时,对象会跳到应该意味着更新在后面继续运行的位置。但是,如果我按住足够长的时间,物体就会脱离界限但不会反弹。当我释放时,我把我的方格拿出窗外,并开始在边界处抖动。
我懂了:
protected override void OnClientSizeChanged(EventArgs e)
{
base.OnClientSizeChanged(e);
Engine.Screen.Width = this.ClientSize.Width;
Engine.Screen.Height = this.ClientSize.Height;
// This is just to set the window size and the position of origin
App.SetProjection2D(Engine.Screen.Width, Engine.Screen.Height, App.Projection);
Gl.glViewport(0, 0, Engine.Screen.Width, Engine.Screen.Height);
}
这是应用程序的 PeekMessage:
private void OnApplicationEnterIdle(object sender, EventArgs e)
{
Message msg;
while (!PeekMessage(out msg, IntPtr.Zero, 0, 0, 0))
{
_timer.SetTime();
Input.Update();
_callback();
}
}
我猜问题出在其中之一。从 _callback() 调用 Update 和 Draw 方法;方法
仅供参考,单击表单时,它不会停止应用程序,因此它与基于单击边框的事件有关。
任何想法?