从类中只调用一次方法

Invoke a method only once from a class

本文关键字:一次 方法 调用      更新时间:2023-10-16

我有一个形状类,其中有一个方法(hitTest(int,int)),连续检查鼠标是否在其边界内。在另一种方法中,我继续检查鼠标是否停留在那里超过1秒。
如果有,触发一个函数(通过notification/event)来运行动画
如果没有,则不要触发动画
如果它已经触发了动画,动画正在运行,但在此期间鼠标离开了该区域,触发一个中断函数(通过通知/事件)

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

上面的代码运行良好,但有一个逻辑问题,我所面临的,而试图使用。上面的Shape类有多个实例,因此每个类也有自己的update()方法。在整个应用程序中,具有animationStarthandleranimationStophandlers的鼠标光标为单个类。

Issue 1:所以,即使其中一个形状只是通知animationStarthandler触发,其他命中测试为false的形状类将动画设置为interrupt,动画也不会运行。
Issue 2:当命中测试成功并且光标在该区域超过1 sec时,命中测试将继续发送通知以开始动画(动画持续时间约1.5秒)。我如何限制命中测试只触发动画一次,并一次又一次地继续触发相同的动画?

如果在我的应用程序的主方法中,我直接尝试通过调用指针类中的playAnimation方法来触发动画,我得到了所需的结果。但我想把这个悬停计时和动画功能赋予ShapeClass本身。有什么建议吗?

我认为您应该考虑添加一个新的布尔值,它保存动画触发的信息(在代码示例_animationTriggered中调用)。这可以防止没有触发动画的形状停止动画,也可以防止触发动画的动画多次播放动画。

if(hitTest(getMouseX(), getMouseY()))
{
    if(!_initHover)
    {
        _initHover = true;
        _hoverStartTime = getCurrentTime();
        cout<<"Start hist testn";
    }
    if((ofGetElapsedTimef() - _hoverStartTime) > 1.0)
    {
        if (!_animationTriggered)
        {
            cout<<"Hitting continously for 1 secn";
            notificationCenter->postNotification(new AnimationStartNotification);
            _animationTriggered = true;
        }
    }
}
else
{
    if ( _animationTriggered )
    {
        _initHover = false;
        notificationCenter->postNotification(new AnimationInterruptNotification);
        _animationTriggered = false;
    }
}

不要忘记在与_initHover

相同的位置初始化这个新的布尔值