2012-02-19 63 views
0

我刷新了我的AS3基礎知識。現在我正在創建尺寸由鼠標距離指定的影片剪輯。Actionscript 3在鼠標移動性能上的重繪線

這是我的全碼:

http://pastebin.com/4jpqFn7N

package { 

    import flash.display.MovieClip; 
    import flash.display.Shape; 
    import flash.display.Graphics; 
    import flash.events.MouseEvent; 
    import wck.World; 

    public class Game extends World { 
     private var isDragging:Boolean = false; 
     private var line:Shape = new Shape(); 
     private var lineInfo:Array = []; 
     public function Game() { 
      addEventListener(MouseEvent.MOUSE_DOWN, startDragging); 
      addEventListener(MouseEvent.MOUSE_MOVE, recalcDrag); 
      addEventListener(MouseEvent.MOUSE_UP, stopDragging); 
     } 

     private function addIt(dist:Number):void { 
      var i:Rect = new Rect(); 
      i.x = mouseX; 
      i.y = mouseY; 
      i.width = dist; 
      i.height = dist; 

      addChild(i); 
     } 

     private function startDragging(e:MouseEvent):void { 
      if(!(e.target is Rect)) { 
       isDragging = true; 
       lineInfo['bX'] = mouseX; 
       lineInfo['bY'] = mouseY; 
       line.graphics.moveTo(mouseX, mouseY); 
       addChild(line); 
      } 
     } 

     private function recalcDrag(e:MouseEvent):void { 
      if(isDragging) {     
       line.graphics.clear(); 
       line.graphics.lineStyle(10, 0x000, .65); 
       line.graphics.moveTo(lineInfo['bX'], lineInfo['bY']); 
       line.graphics.lineTo(mouseX, mouseY); 
      } 
     } 

     private function stopDragging(e:MouseEvent):void { 
      if(isDragging) { 
       var distance = DistanceTwoPoints(mouseX, lineInfo['bX'], mouseY, lineInfo['bY']); 
       line.graphics.clear(); 
       isDragging = false; 
       if(!(e.target is Rect) && distance != 0) addIt(distance); 
      } 
     } 

     public function DistanceTwoPoints(x1:Number, x2:Number, y1:Number, y2:Number): Number { 
      var dx:Number = x1-x2; 
      var dy:Number = y1-y2; 
      return Math.sqrt(dx * dx + dy * dy); 
     } 
    } 

} 

不過,我已經感覺這個鼠標移動重繪整條生產線可能是資源昂貴。我怎樣才能讓它輕鬆一點?

回答

1

您可以使用ENTER_FRAME事件而不是MOUSE_MOVE事件。 MOUSE_MOVE是一個相當昂貴的通話,尤其是在移動設備上,如果設置正確,它不會比ENTER_FRAME更有效。

另外,如果你不使用時間軸中Flash Professional中,你應該使用Sprite對象,而不是MovieClip對象。

注:the following code是未經測試:

package 
{ 
    //Imports 
    import flash.display.Sprite; 
    import flash.display.Shape; 
    import flash.display.Graphics; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import wck.World; 

    //Class 
    public class Game extends World 
    { 
     //Properties 
     private var line:Shape; 
     private var lineInfo:Array; 

     //Constructor 
     public function Game() 
     { 
      addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventListener); 
     } 

     //Mouse Down Event Listener 
     private function mouseDownEventListener(e:MouseEvent):void 
     { 
      if (!(e.target is Rect)) 
      { 
       removeEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventListener); 
       addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventListener); 

       lineInfo = new Array(); 
       lineInfo['bX'] = mouseX; 
       lineInfo['bY'] = mouseY; 

       line = new Shape(); 
       line.graphics.moveTo(mouseX, mouseY); 

       addChild(line); 
      } 
     } 

     //Mouse Move Event Listener 
     private function mouseMoveEventListener(e:MouseEvent):void 
     { 
      removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventListener); 
      addEventListener(Event.ENTER_FRAME, enterFrameEventListener); 
      addEventListener(MouseEvent.MOUSE_UP, mouseUpEventListener); 
     } 

     //Enter Frame Event Listener 
     private function enterFrameEventListener(e:Event):void 
     { 
      line.graphics.clear(); 
      line.graphics.lineStyle(10, 0x000, .65); 
      line.graphics.moveTo(lineInfo['bX'], lineInfo['bY']); 
      line.graphics.lineTo(mouseX, mouseY); 
     } 

     //Mouse Up Event Listener 
     private function mouseUpEventListener(e:MouseEvent):void 
     { 
      removeEventListener(Event.ENTER_FRAME, enterFrameEventListener); 
      removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventListener); 
      addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventListener); 

      line.graphics.clear(); 

      var distance:Number = distanceBetweenTwoPoints(mouseX, lineInfo['bX'], mouseY, lineInfo['bY']); 

      if (!(e.target is Rect) && distance != 0) 
      { 
       addRectangle(distance); 
      } 
     } 

     //Distance Between Two Points 
     public function distanceBetweenTwoPoints(x1:Number, x2:Number, y1:Number, y2:Number):Number 
     { 
      var dx:Number = x1 - x2; 
      var dy:Number = y1 - y2; 

      return Math.sqrt(dx * dx + dy * dy); 
     } 

     //Add Rectangle 
     private function addRectangle(distance:Number):void 
     { 
      var rect:Rect = new Rect(); 
      rect.x = mouseX; 
      rect.y = mouseY; 
      rect.width = distance; 
      rect.height = distance; 

      addChild(rect); 
     } 
    } 
} 
+0

有因爲設置之前,檢查距離值只有一個錯誤,並且我也得到了有利於輸入框擺脫鼠標移動監聽器都沒有。感謝您的解釋 – Misiur 2012-02-19 17:23:16

+1

您應該使用'MOUSE_MOVE'事件偵聽器作爲啓動「ENTER_FRAME」事件的工具,否則無論是否需要,「ENTER_FRAME」事件都將始終運行,這比僅使用資源只有一個MOUSE_MOVE事件。 – TheDarkIn1978 2012-02-19 17:43:53

+0

也,我解決了我的例子中的錯誤。哎呀! :) – TheDarkIn1978 2012-02-19 17:46:23

1

由於MOUSE_MOVE可以每幀觸發多次,並且畫面每幀只能重繪一次,因此可能會有一些不必要的計算。當使用ENTER_FRAME事件代替時,性能可能會提高。