【问题标题】:Invoke a method only once from a class从一个类中只调用一次方法
【发布时间】:2013-01-04 11:33:22
【问题描述】:

我有一个形状类,其中有一个方法 (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() 方法。具有animationStarthandleranimationStophandlers 的鼠标光标是整个应用程序中的一个类。

问题 1: 因此,即使其中一个形状只是通知 animationStarthandler 触发,命中测试为错误的其他形状类也会将动画设置为 interrupt 和动画
问题2:当命中测试成功且光标在区域内停留时间超过1 sec时,命中测试会继续发送启动动画的通知(动画的持续时间大约为 1.5 秒)如何限制命中测试只触发一次动画并继续一次又一次地触发相同的动画?

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

【问题讨论】:

  • 这是否意味着每个Shape 类都有一个单独的计时器?制作动画时的常见做法是使用单个计时器,它跟踪整体 fps 并同时调用所有重绘。此外,我根本没有理由轮询Update 方法。您应该简单地处理MouseMoveMouseEnter 和其他鼠标事件并从那里调用Update,而一个单独的(单个)计时器呈现所有形状。

标签: c++ algorithm events logic


【解决方案1】:

我认为你应该考虑添加一个新的布尔值,它保存动画触发的信息(在代码示例_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 相同的位置初始化这个新的布尔值

【讨论】:

  • 次要评论:检查开始动画时,我会先检查布尔值,然后再检查时间。这是一种微优化,但可以对经常调用的例程产生影响(并且它不会以任何方式影响可读性/可维护性)。
  • 酷!这行得通。但是有一定的毛病。动画运行一次,下次我尝试进行命中测试并在任何其他形状上获取动画时,动画不会运行。我会检查我的代码,看看我做错了什么
  • 确实很奇怪。您可以尝试在不同的形状上按顺序从指针类(来自您的问题)触发动画,看看这是否有效。这可能有助于了解错误在哪里。
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 2020-05-19
  • 2019-09-24
  • 2010-09-22
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多