【发布时间】: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() 方法。具有animationStarthandler 和animationStophandlers 的鼠标光标是整个应用程序中的一个类。
问题 1: 因此,即使其中一个形状只是通知 animationStarthandler 触发,命中测试为错误的其他形状类也会将动画设置为 interrupt 和动画
问题2:当命中测试成功且光标在区域内停留时间超过1 sec时,命中测试会继续发送启动动画的通知(动画的持续时间大约为 1.5 秒)如何限制命中测试只触发一次动画并继续一次又一次地触发相同的动画?
如果在我的应用程序的 main 方法中,我直接尝试通过调用指针类中的方法playAnimation 来触发动画,我得到了所需的结果。但我想将这种悬停时间和动画功能赋予 ShapeClass 本身。有什么建议吗?
【问题讨论】:
-
这是否意味着每个
Shape类都有一个单独的计时器?制作动画时的常见做法是使用单个计时器,它跟踪整体 fps 并同时调用所有重绘。此外,我根本没有理由轮询Update方法。您应该简单地处理MouseMove、MouseEnter和其他鼠标事件并从那里调用Update,而一个单独的(单个)计时器呈现所有形状。
标签: c++ algorithm events logic