チェンジセット 1096

差分発生行の前後
無視リスト:
コミット日時:
2008/08/27 18:16:22 (5 年前)
コミッタ:
tasuku
ログメッセージ:

r47@poppop (orig r46): tasuku | 2008-04-06 05:47:55 +0900
ドットが描けるようになった。
マウス押下状態のままキャンバスから出て、マウス押下状態のままキャンバスに戻るとひと続きの描画とするようにした。ただし、キャンバス外でマウス押下状態が戻ったときに
描画をコミットする必要あり。

ファイル:

凡例:

変更無し
追加
削除
更新
コピー
移動
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint.as

    r1095 r1096  
    2424 
    2525private const ALERT_TITLE:String = 'お絵カキコ'; 
     26private const DEBUG:Boolean = true; 
    2627 
    2728public function init():void {   
     
    4546    } 
    4647  } else { 
    47     //undoBufferSize = 16; 
    48     return; 
     48    if (DEBUG) { 
     49      undoBufferSize = 16; 
     50    } else { 
     51      return; 
     52    } 
    4953  } 
    5054  if (parameters['oekakiId'] && parameters['baseImgUrl']) { 
     
    6670      } 
    6771    } else { 
    68       //canvasWidth = 16; canvasHeight = 16; 
    69       return; 
     72      if (DEBUG) { 
     73        canvasWidth = 300; canvasHeight = 400; 
     74      } else { 
     75        return; 
     76      } 
    7077    } 
    7178    gpCanvas = new gunyarapaint.Canvas(canvasWidth, canvasHeight, undoBufferSize, null, null); 
  • as3/gunyarapaint/trunk/gunyarapaint/src/gunyarapaint/Canvas.as

    r1095 r1096  
    1212  import flash.events.Event; 
    1313  import flash.events.MouseEvent; 
     14  import flash.geom.Point; 
    1415  import flash.utils.ByteArray; 
    1516  import flash.utils.clearInterval; 
     
    254255          this.dispatchEvent(new Event('changeColor')); 
    255256        } 
     257        // 描画関係のフラグ 
     258        private var isMouseDownAndOut:Boolean = false; 
     259        private var isMoveTo:Boolean = false; 
     260        private var isDrawnLine:Boolean; 
     261        private var currentPoint:Point = new Point; 
    256262        private function moveTo(x:Number, y:Number):void { 
    257263      lineShape.graphics.moveTo(x, y); 
    258264      setLineStyle(); 
    259265      logWrite(['moveTo', x, y]); 
     266      isDrawnLine = false; 
     267      isMoveTo = true; 
     268      currentPoint.x = x; 
     269      currentPoint.y = y; 
    260270        } 
    261271        private function lineTo(x:Number, y:Number):void { 
    262272      lineShape.graphics.lineTo(x, y); 
    263273      logWrite(['lineTo', x, y]); 
     274      isDrawnLine = true; 
     275      currentPoint.x = x; 
     276      currentPoint.y = y; 
    264277        } 
    265278        public function mouseDown(evt:MouseEvent):void { 
     
    273286          } 
    274287        } 
     288         
     289        private function isInCanvas(evt:MouseEvent):Boolean { 
     290      return (evt.localX >= 0 && evt.localY >= 0 && 
     291               evt.localX < canWidth && evt.localY < canHeight); 
     292        } 
     293         
    275294    public function mouseMove(evt:MouseEvent):void { 
    276295      if (evt.buttonDown) { 
    277         if (evt.localX < 0 || evt.localY < 0 || 
    278             evt.localX > canWidth || evt.localY > canHeight) { 
    279           mouseUp(evt); 
    280         } 
    281296        switch (penMode) { 
    282297        case MODE_PEN: 
    283           if (lineShape) { 
    284             lineTo(evt.localX, evt.localY); 
    285           } else {           
    286             // マウス押しっぱなしで領域外に出て、また戻ってきた場合 
    287             mouseDown(evt); 
     298          if (isInCanvas(evt)) { 
     299            if (isMouseDownAndOut) { 
     300              // マウス押しっぱなしで領域外に出て、また戻ってきた場合 
     301              mouseDown(evt); 
     302              isMouseDownAndOut = false; 
     303            } else { 
     304              lineTo(evt.localX, evt.localY); 
     305            }             
     306          } else { 
     307            // TODO: 直線と枠との交点を座標とする。 
    288308          } 
    289309          break; 
    290310        case MODE_DROPPER: 
    291           getColor(evt); 
     311          if (isInCanvas(evt)) { 
     312            getColor(evt); 
     313          } 
    292314          break; 
    293315        } 
     
    306328        undoFirstIndex = (undoFirstIndex + 1) % undoBufferSize; 
    307329      } 
    308       // 描画用シェイプは空にしておく 
     330      // 描画用シェイプは空にしておく 
    309331      lineShape.graphics.clear(); 
     332      isMoveTo = false; 
    310333      this.dispatchEvent(new Event('changeUndoRedo')); 
    311334      logWrite(['drawShapeOnBitmap']); 
    312335    } 
    313336    public function mouseUp(evt:MouseEvent):void { 
    314       if (lineShape) { 
    315         drawShapeOnBitmap(); 
    316       } 
     337      if (!isDrawnLine) { 
     338        lineShape.graphics.drawRect(currentPoint.x, currentPoint.y, 1, 1); 
     339      } 
     340      drawShapeOnBitmap(); 
    317341        } 
    318342        public function mouseOut(evt:MouseEvent):void { 
    319       if (evt.buttonDown) { 
    320           // マウスボタンを離したことにする 
    321             mouseUp(evt); 
     343      if (isMoveTo) { 
     344        isMouseDownAndOut = true; 
    322345      } 
    323346        } 
     
    386409          return log.getCompressedLog(); 
    387410        } 
    388          
     411   
     412    // ログ関係のローカル変数 
    389413        private var playLogIntervalId:uint; 
    390414        private var playLogSpeed:uint;