2013-01-21 36 views
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()方法。在整個應用程序中,鼠標光標具有其中的一個類別animationStarthandleranimationStophandlers

問題1:所以,即使形狀的一個剛剛通知animationStarthandler火,其他形狀類上擊中測試爲假集動畫interrupt和動畫不運行。
問題2:當命中測試成功並且光標在該區域中超過1 sec時,命中測試將繼續發送通知以開始動畫(動畫的持續時間約1.5秒)。如何限制命中測試只啓動一次動畫並繼續一次又一次地發射相同的動畫?

如果在我的應用程序的主要方法中,我直接嘗試通過調用指針類中的方法playAnimation來觸發動畫,我會得到所需的結果。但我想給這個懸停時間和動畫功能給ShapeClass本身。有什麼建議麼?

+0

這是否意味着每個'Shape'類都有一個單獨的計時器?做動畫時的常見做法是有一個**單個定時器**,它跟蹤整體fps並同時調用所有重繪。另外,我沒有看到輪詢'Update'方法的原因。您應該簡單地處理'MouseMove','MouseEnter'和其他鼠標事件,並從那裏調用'Update',而單獨的(單個)定時器渲染所有形狀。 – Groo

回答

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; 
    } 
} 

不要忘記在同一個地方initialie這個新的布爾作爲_initHover

+2

次要評論:當檢查開始動畫時,我會首先檢查布爾值,並且僅在該時間之後。這是一種微型優化,但可以在頻繁調用的例程中發揮作用(並且不會以任何方式影響可讀性/可維護性)。 –

+0

酷!這工作。但是有一些小故障。動畫運行一次,並且下次嘗試進行點擊測試並在任何其他形狀上獲取動畫時,動畫不會運行。我會檢查我的代碼,看看是否有什麼,我做錯了 – user1240679

+0

奇怪的確。您可以嘗試從指針類(從您的問題)中按順序在不同形狀上觸發動畫,並查看它是否有效。這可能有助於瞭解錯誤在哪裏。 –