0

それが正常な動作であるかどうか、それを防ぐことができるものがあるかどうかを知りたいだけです。

WindowsフォームでOpenGLとTaoClassicを使用しています(問題には関係ないかもしれませんが)。現時点では、ウィンドウの周りを移動する非常に基本的な正方形があり、ウィンドウの端に到達すると、速度が反転します (左/右の場合は x、上/下の場合は y)。

これまでのところ、空想的なものは何もありません。

面白いのは、オブジェクトが移動するときです。フォームの境界をクリックすると、アプリケーションが停止し、新しい描画は行われませんが、アプリケーションは部分的に更新され続けます。以下のコードから、「衝突」検出が行われていない間、最初の2行が実行され続けるため、私は部分的に言います

        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();    
     }
 }

問題はそれらのいずれかにあると思います。Update メソッドと Draw メソッドは、_callback(); から呼び出されます。方法

参考までに、フォームをクリックしてもアプリケーションは停止しないため、境界線のクリックに基づくイベントに関係しています。

何か案が?

4

1 に答える 1