0

只是想知道这是否是正常行为以及是否有任何可以阻止它的东西。

我在 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 方法;方法

仅供参考,单击表单时,它不会停止应用程序,因此它与基于单击边框的事件有关。

任何想法?

4

1 回答 1

0

这是正常行为。移动和调整事件大小是阻塞的(这是默认 WndProc 的工作方式),并且不会调用 OnApplicationEnterIdle。

AFAIK 在调整窗口大小时继续更新的唯一方法是使用不同的线程进行渲染。在这种情况下,只有主线程会阻塞移动和调整大小事件,而渲染线程将继续更新视口。

于 2013-10-14T06:12:26.460 回答