2013-03-19 51 views
2

我試圖寫一個簡單的AS3繪圖類,但它不工作。甚至沒有事件發生。可能是什麼問題呢?的Actionscript徒手繪畫類不工作

用法:

var drawingBoard:Drawing = new Drawing(); 
drawingBoard.x = 0; 
drawingBoard.y = 0; 
drawingBoard.width = 200; 
drawingBoard.height = 100; 

addChild(drawingBoard); 

類:

都設置一個空的Sprite的 width/height沒有做任何事情的
package { 
    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class Drawing extends Sprite { 
     private var prevX:Number = 0; 
     private var prevY:Number = 0; 
     private var board:Shape = new Shape(); 

     public function Drawing() { 
      trace("Drawing initialized."); 

      addChild(board); 

      addEventListener(MouseEvent.MOUSE_DOWN, startDrawing); 
      addEventListener(MouseEvent.MOUSE_UP, stopDrawing); 
      addEventListener(MouseEvent.MOUSE_OUT, stopDrawing); 
     } 

     private function startDrawing(event:MouseEvent):void { 
      trace("Start drawing."); 

      addEventListener(MouseEvent.MOUSE_MOVE,handleDrawing); 
     } 

     private function stopDrawing(event:MouseEvent):void { 
      trace("Stop drawing."); 

      prevX = 0; 
      prevY = 0; 
      removeEventListener(MouseEvent.MOUSE_MOVE,handleDrawing,false); 
     } 

     private function handleDrawing(event:MouseEvent):void { 
      trace("Handling drawing."); 

      if (prevX == 0 || prevY == 0) { 
       prevX = event.localX; 
       prevY = event.localY; 
      } else { 
       board.graphics.lineStyle(10, 0x000000, 1); 
       board.graphics.moveTo(prevX, prevY); 
       board.graphics.lineTo(event.localX, event.localY); 
       prevX = event.localX; 
       prevY = event.localY; 
      } 
     } 
    } 
} 
+1

當你的繪圖精靈開始就註冊了一些事件,並且becaise有沒有任何內容,你不能接收任何事件,你應該爲waith添加到舞臺活動再添加這些事件舞臺上,或者你可以添加畫布背景這個精靈。 – 2013-03-19 14:24:45

回答

3

第一。如果您wan't到有維度一個空的Sprite 200/100你需要畫的東西進去。

我修改您的類,以便它開始工作,你把它添加到舞臺後:

package { 
    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 

    public class Drawing extends Sprite { 
     private var prevX:Number = 0; 
     private var prevY:Number = 0; 
     private var board:Shape = new Shape(); 

     public function Drawing() { 
      trace("Drawing initialized."); 

      addChild(board); 
      //clear board to white 
      board.graphics.beginFill(0xffffff,1); 
      board.graphics.drawRect(0,0,200,100); 
      board.graphics.endFill(); 

      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     } 

     private function onAddedToStage(e:Event):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

      addEventListener(MouseEvent.MOUSE_DOWN, startDrawing); 
      addEventListener(MouseEvent.MOUSE_UP, stopDrawing); 
      addEventListener(MouseEvent.MOUSE_OUT, stopDrawing); 
     } 

     private function startDrawing(event:MouseEvent):void { 
      trace("Start drawing."); 

      addEventListener(MouseEvent.MOUSE_MOVE,handleDrawing); 
     } 

     private function stopDrawing(event:MouseEvent):void { 
      trace("Stop drawing."); 

      prevX = 0; 
      prevY = 0; 
      removeEventListener(MouseEvent.MOUSE_MOVE,handleDrawing,false); 
     } 

     private function handleDrawing(event:MouseEvent):void { 
      trace("Handling drawing."); 

      if (prevX == 0 || prevY == 0) { 
       prevX = event.localX; 
       prevY = event.localY; 
      } else { 
       board.graphics.lineStyle(10, 0x000000, 1); 
       board.graphics.moveTo(prevX, prevY); 
       board.graphics.lineTo(event.localX, event.localY); 
       prevX = event.localX; 
       prevY = event.localY; 
      } 
     } 
    } 
} 
0

關於到巴里斯Uşaklı先生的回答,我修改了類,所以它是完全功能。

而且,我修改了事件處理,使性能更好,因爲添加新的事件偵聽器,並刪除它們真的很慢。

初始化:

var drawingBoard:Drawing = new Drawing(stage.stageWidth, stage.stageHeight); 
addChild(drawingBoard); 

清算:

drawingBoard.clearDrawing(); 

修改色彩和鉛筆寬度:

drawingBoard.drawingColor = 0x123456; 
drawingBoard.drawindWidth = 16; 

類:

package { 
    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 

    public class Drawing extends Sprite { 
     private var prevX:Number = 0; 
     private var prevY:Number = 0; 
     private var board:Shape = new Shape(); 
     private var isDrawing:Boolean = false; 

     public var drawingColor:uint = 0x6666aa; 
     public var drawingWidth:int = 2; 

     public function Drawing(width:int, height:int) { 
      trace("Drawing initialized."); 

      addChild(board); 

      board.graphics.beginFill(0xffffff, 0); // I like transparent things 
      board.graphics.drawRect(0, 0, width, height); 
      board.graphics.endFill(); 

      addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 
     } 

     private function onAddedToStage(event:Event):void { 
      removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); 

      addEventListener(MouseEvent.MOUSE_DOWN, startDrawing); 
      addEventListener(MouseEvent.MOUSE_UP, stopDrawing); 
      addEventListener(MouseEvent.MOUSE_OUT, stopDrawing); 
      addEventListener(MouseEvent.MOUSE_MOVE, handleDrawing); 
     } 

     public function clearDrawing():void { 
      board.graphics.clear(); 
     } 

     private function startDrawing(event:MouseEvent):void { 
      trace("Start drawing."); 
      isDrawing = true; 
     } 

     private function stopDrawing(event:MouseEvent):void { 
      trace("Stop drawing."); 

      prevX = 0; 
      prevY = 0; 
      isDrawing = false; 
     } 

     private function handleDrawing(event:MouseEvent):void { 
      if (isDrawing == true){ 
       trace("Handling drawing at " + event.localX + " x " + event.localY); 

       if (prevX != 0 && prevY != 0) { 
        board.graphics.lineStyle(drawingWidth, drawingColor, 1); 
        board.graphics.moveTo(prevX, prevY); 
        board.graphics.lineTo(event.localX, event.localY); 
       } 

       prevX = event.localX; 
       prevY = event.localY; 
      } 
     } 
    } 
}