2008-11-24 143 views
2

我正在建設一個圖形板,就像我正面臨設計問題的項目。概念性問題:鬆耦合

主類是Board,它是一個負責繪製形狀時處理鼠標事件的畫布。它還具有上下文變量,例如currentShape或snapFlag來激活柵格磁性。

爲了處理形狀的移動/大小調整/旋轉,它們繼承自名爲ObjectHandles(flex)的第三方開源工具。

我有一個baseShape擴展ObjectHandles主類來覆蓋它的一些內部函數,如onMove函數。

當創建一個形狀(鼠標向下,移動,鼠標向上)時,這是董事會處理,它知道他自己的快照標誌。

var mouseUpPoint:Point = boardCanvas.globalToLocal(new Point(event.stageX,event.stageY)); var snapMouseUpPoint = snapPoint(mouseUpPoint.x,mouseUpPoint.y);

在我的overidden onMove方法中,我希望形狀能夠意識到Board snap標誌以及它的更改時間。我該怎麼做呢 ?

我是否在我的basicShape構造函數中將參數作爲參數傳遞,以便我可以檢查snap?

我是否將標誌作爲參數傳遞,並以某種方式讓所有形狀監聽變化?

什麼是最乾淨的解決方案?

非常感謝。

回答

1

我會從稍微不同的角度來解決這個問題。我假定Board對象首先捕捉鼠標事件,以便它可以決定哪個形狀被點擊。我會讓電路板捕捉鼠標移動,並將正確的(捕捉或未捕捉的)座標傳遞給選定的對象,而不是讓形狀對象識別出來。

這使得網格捕捉處理到Board,並保持您的Shape對象onMove方法免於混亂。

+0

實際上它沒有,它稍後收到它。使用objectHandles的每個形狀都是其選擇的自組織形式。 Objecthandles有一個selectionManager,它可以選擇/取消選擇/添加/刪除。 但是,我的主板可以知道對象何時移動。但已經太晚了。 – coulix 2008-11-24 22:00:19

+0

事件從小孩到父母,董事會是父母。 – coulix 2008-11-24 22:02:49

+0

嗯,說實話,我不認爲這是正確的做法。當然這是你的項目,所以你更多地瞭解這些設計選擇的成本和收益。我支持我的回答,但我期待着閱讀其他答覆。偉大的問題! – 2008-11-24 22:20:34

0

只是想和你一起思考.. 我看到在形狀有IBoard界面沒有什麼大不了的。 雖然,我不喜歡這個想法,他們必須檢查板上的標誌...

你會如何通過標誌作爲參數?在OnMove()方法?沒有很好地理解這個......你能擴展嗎?

雖然.. 如果您嘗試思考SRP - 單一責任原則... Shape類的責任是什麼? 是的,這是eJames寫的。

我覺得他們的主要責任可能不是處理鼠標事件......這裏需要了解更多關於你的應用程序的知識,但是我的一般感覺是爲什麼不讓別人把這個鼠標放下來,然後弄清楚形狀應該如何處理它,例如用新的座標在形狀上調用Draw()?

假設你想要應用類似複合模式(形狀內的形狀...),你希望他們能夠處理這些鼠標事件本身...但是然後 然後,如果他們覺得這是合乎邏輯的鼠標事件在它們的本地座標中,但是我認爲你應該通過這個事件(本地座標,鼠標狀態......)提供所有的信息,以便它們不必要求板上的「全局」變量......

0

將標誌作爲形狀構造函數的參數傳遞。但它不會很好,因爲國旗會發生變化,我必須讓每一個形狀在更改時更新旗標副本。

它的確是形狀的責任是不知道如何處理鼠標事件。但是,這就是ObjectHandles所做的:對事件作出反應,更新形狀的高度寬度旋轉參數。

也許我應該在我的板類中傳輸一些庫代碼來處理形狀選擇和移動/調整大小/旋轉。

+0

您可能不需要傳輸太多內容。我會說董事會應該做一個快速有效的檢查,看看鼠標點擊哪個形狀的矩形,然後簡單地問這些形狀:「這個鼠標位置在你的邊界內嗎?」 – 2008-11-24 22:49:54

1

不知道你的應用程序:

有沒有可能的形狀有它自己的「捕捉」行爲?也就是說,一個Shape可以被排除在捕捉之外,而另一個則不可以?如果是這樣,請使snapFlag成爲Shape的成員。在Board上設置snapFlag時,遍歷Shapes並根據您的規則設置或不設置。

如果捕捉行爲適用於棋盤上的所有形狀,請考慮事件驅動模型(如果可用 - 我是Flex noob)。當Shape移動時,讓它引發一個OnMove事件。然後,董事會可以做出迴應,並決定如果合適,將Shape對齊。

如果對齊行爲適用於所有形狀並且事件不可用,那麼在這種情況下,我只是說鬆散耦合的地獄 - 讓形狀板感知。這聽起來像你通過使用ObjectHandle來保存一堆代碼。這種好處可能會超出耦合UI元素的成本。

0

的OnMouseMove ObjectHandles

 protected function onMouseMove(event:MouseEvent) : void 
    { 
     if(! visible) { return; } 

     if(! event.buttonDown) 
     { 
      setMouseCursor(event.stageX, event.stageY); 
      return; 
     } 

     if(parent == null) 
     { 
      return; 
     } 


     var dest:Point = parent.globalToLocal(new Point(event.stageX, event.stageY)); 
     var desiredPos:Point = new Point(); 
     var desiredSize:Point = new Point(); 
     var desiredRotation:Number = 0; 

... plenty more 
then 

      if(wasMoved) { dispatchMoving() ; } 
      if(wasResized) { dispatchResizing() ; } 
      if(wasRotated) { dispatchRotating(); } 

,所以我不能聽的移動事件,並告訴董事會捕捉它,因爲形狀已經自由移動。我應該在這裏添加對齊:

var dest:Point = parent.globalToLocal(new Point(event.stageX,event.stageY));

所有形狀遵循捕捉規則,不能有一個捕捉和其他自由。

0

解決這樣說:

因爲我overridde的OnMouseMove在我baseShape類和我使用PureMVC的框架,我只是做了baseShape知道我boardMediator的。

覆寫保護函數onMouseMove(event:MouseEvent):void {...}]

// added on override 
var board:BoardMediator = ApplicationFacade.getInstance().retrieveMediator(BoardMediator.NAME) as BoardMediator; 

然後

desiredPos = board.snapPoint(desiredPos.x, desiredPos.y); 

也許不是超級漂亮,但它的工作原理,鄰 Overridding給globalToLocal方法在我的板視圖做的工作太多,但更多的計算是裏面的OnMouseMove做導致的出對齊卡扣移動。

0

使用ObjectHandles版本2,然後創建一個約束來做你想做的。