我有一个形状类,其中有一个方法(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
要触发,其他命中测试为false的形状类也将动画设置为{{1}并且动画没有运行
问题2:当命中测试成功并且光标在区域内的时间超过interrupt
时,命中测试将继续发送通知以启动动画(动画的持续时间为1.5秒)约。)如何限制命中测试只触发动画一次并继续反复发射相同的动画?
如果在我的应用程序的main方法中,我直接尝试通过调用指针类中的方法1 sec
来触发动画,我得到了所需的结果。但是我想把这个悬停定时和动画功能赋予ShapeClass本身。有什么建议吗?
答案 0 :(得分: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