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:因此,即使其中一个形状只是通知animationStarthandler触发,命中测试为错误的其他形状类也会将动画设置为interrupt并且动画不会运行。
问题 2:当命中测试成功并且光标在该区域中超过1 sec时,命中测试将继续发送通知以启动动画(动画的持续时间约为 1.5 秒)如何限制命中测试触发动画只播放一次,然后一次又一次地触发相同的动画?

如果在我的应用程序的 main 方法中,我直接尝试通过调用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 回答