3

hitTest(int,int)マウスが境界内にあるかどうかを継続的にチェックするメソッド ( ) がある形状クラスがあります。別の方法では、マウスが 1 秒以上そこに留まっているかどうかをチェックし続けます。
ある場合は、アニメーションを実行する機能を (通知/イベントによって)トリガーします ない場合
は、アニメーションをトリガーしません アニメーション
が既にトリガーされていて、アニメーションが実行されているが、マウスがこの間に領域を離れた場合、トリガーします割り込み機能(通知・イベントによる)

//OnLoad _initHover = false;

void update() //called continously in the application per frame
{
if(hitTest(getMouseX(), getMouseY())){
                if(!_initHover){
                    _initHover = true;
                    _hoverStartTime = getCurrentTime(); //start hover time
                    cout<<"Start hist test\n";
                }

                //If it has hovered over the video for 1.0 sec
                if((ofGetElapsedTimef() - _hoverStartTime) > 1.0){
                    cout<<"Hitting continously for 1 sec\n";
                    notificationCenter->postNotification(new AnimationStartNotification);
                }
            }
            else{
                    _initHover = false;
                    notificationCenter->postNotification(new AnimationInterruptNotification);
            }
}

上記のコードは正常に実行されますが、使用しようとしているときに直面している論理的な問題があります。上記の Shape クラスには複数のインスタンスがあり、各クラスにはそれぞれのupdate()メソッドもあります。マウスカーソルは、アプリケーション全体で単一のクラスを持っていanimationStarthandlerます。animationStophandlers

問題 1:そのため、シェイプの 1 つが起動するように通知しただけでも、animationStarthandlerヒット テストが false である他のシェイプ クラスがアニメーションを設定し、interruptアニメーションが実行されません。
問題 2:ヒット テストが成功し、カーソルが領域内に を超える1 secと、ヒット テストはアニメーションを開始する通知を送信し続けます (アニメーションの持続時間は約 1.5 秒です)。アニメーションは一度だけで、同じアニメーションを何度も発射し続けますか?

アプリケーションのメイン メソッドでplayAnimation、ポインター クラスのメソッドを呼び出してアニメーションを直接起動しようとすると、必要な結果が得られます。しかし、このホバー タイミングとアニメーション機能を ShapeClass 自体に提供したいと考えています。助言がありますか?

4

1 に答える 1

2

アニメーションのトリガーの情報を保持する新しいブール値を追加することを検討する必要があると思います (コード サンプルで呼び出されます_animationTriggered)。これにより、アニメーションをトリガーしていないシェイプが停止したり、トリガーしたアニメーションが何度もアニメーションを停止したりするのを防ぎます。

if(hitTest(getMouseX(), getMouseY()))
{
    if(!_initHover)
    {
        _initHover = true;
        _hoverStartTime = getCurrentTime();
        cout<<"Start hist test\n";
    }

    if((ofGetElapsedTimef() - _hoverStartTime) > 1.0)
    {
        if (!_animationTriggered)
        {
            cout<<"Hitting continously for 1 sec\n";
            notificationCenter->postNotification(new AnimationStartNotification);
            _animationTriggered = true;
        }
    }
}
else
{
    if ( _animationTriggered )
    {
        _initHover = false;
        notificationCenter->postNotification(new AnimationInterruptNotification);
        _animationTriggered = false;
    }
}

この新しいブール値を同じ場所で初期化することを忘れないでください_initHover

于 2013-01-21T12:31:51.380 に答える