Шейп и курсор

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
Аватара пользователя
Евгений
FL Team
FL Team
Сообщения: 776
Зарегистрирован: 10 июн 2010, 11:01

Шейп и курсор

Сообщение Евгений »

Добрый день! У меня есть код, который загружает картинку с компа, потом пользователь на ней что-нибудь рисует и сохраняется на комп!

Код: Выделить всё

import PNGEncoder;/* Шейп карандаша, все нарисованное с помощью этого инструмента и инструмента ластика   запоминается внутри board.pencilDraw */var pencilDraw:Shape = new Shape();/* Цвета */var colorsBmd:BitmapData;//мы будем использовать эту битмапдату, чтобы получить значение RGB для пиксела при клике  var pixelValue:uint;var activeColor:uint = 0x000000;//Это текущий цвет в использовании, отображается с помощью мувика shapeSize/* Шейп размера цвета */var ct:ColorTransform = new ColorTransform();/* Листенеры */saveButton.addEventListener(MouseEvent.MOUSE_UP, save);clearTool.addEventListener(MouseEvent.MOUSE_UP, clearBoard);/* Добавляем слушатели в мувиклип board , чтобы рисовать что-то в нем */board.addEventListener(MouseEvent.MOUSE_DOWN, startPencilTool);board.addEventListener(MouseEvent.MOUSE_UP, stopPencilTool);function startPencilTool(e:MouseEvent):void{    pencilDraw = new Shape();//Мы добавляем новый шейп, чтобы рисовать всегда сверху (в случае с текстом или стиранием ластиком)      board.addChild(pencilDraw);    //добавляем этот шейп в мувик board  ;    pencilDraw.graphics.moveTo(mouseX, mouseY);    //сдвигаем положение отрисовки к положению мыши ;    pencilDraw.graphics.lineStyle(10, activeColor);    //Устанавливаем толщину линии равной размеру мувика ShapeSize и устанавливаем ее цвет в текущий активный цвет;    board.addEventListener(MouseEvent.MOUSE_MOVE, drawPencilTool);}//добавляем слушатель к следующей функции  function drawPencilTool(e:MouseEvent):void{    pencilDraw.graphics.lineTo(mouseX, mouseY);}function stopPencilTool(e:MouseEvent):void{    board.removeEventListener(MouseEvent.MOUSE_MOVE, drawPencilTool);}//Сахраняемfunction export():void{    var bmd:BitmapData = new BitmapData(pLoader.width,pLoader.height);//Создаем новую битмапдату с размером  board     bmd.draw(board);    //Рисуем мувиклип board в рисунок битмап в битмапдате;    var ba:ByteArray = PNGEncoder.encode(bmd);//Создаем ByteArray для битмапдаты, закодированный как PNG      var file:FileReference = new FileReference();// Новый экземпляр  объекта File Reference , чтобы управлять сохранением    file.addEventListener(Event.COMPLETE, saveSuccessful);    //Добавляем новый слушатель, чтобы слушать, когда закончится сохранение;    file.save(ba, "MyDrawing.png");}//Сохраняем ByteArray как PNG ;function saveSuccessful(e:Event):void{    trace("Сохранено!");}function save(e:MouseEvent):void{    export();//Вызываем функцию export , чтобы начать процесс сохранения  }function clearBoard(e:MouseEvent):void{    pencilDraw.graphics.clear();}function highlightTool(tool:DisplayObject):void{    tool.visible = true;//Подсвеченный инструмент в параметре  }/* Скрываем инструменты в параметрах */function hideTools(tool1:DisplayObject, tool2:DisplayObject):void{    tool1.visible = false;    tool2.visible = false;} //загрузка фотоvar fileRef:FileReference;var pLoader:Loader;var resizeObject = {w:450,h:450};var textTypeFilter:FileFilter;var bmp:Bitmap;pLoader=new Loader(); fileRef=new FileReference();textTypeFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)","*.jpg;*.jpeg;*.gif;*.png"); fileRef.addEventListener(Event.SELECT, onFileSelected);fileRef.addEventListener(Event.CANCEL, onCancel);fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError);fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);selectBTN.addEventListener("mouseDown",selectFotoPressedHandler); function onFileSelected(evt:Event):void{    fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress);    fileRef.addEventListener(Event.COMPLETE, onComplete);    fileRef.load();}function onProgress(evt:ProgressEvent):void{    trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes.");}function onCancel(evt:Event):void{    trace("The browse request was canceled by the user.");}function onComplete(evt:Event):void{    pLoader.contentLoaderInfo.addEventListener(Event.INIT,imageInited);    pLoader.loadBytes(fileRef.data);}function imageInited(evt:Event):void{    var myBitmapData:BitmapData = new BitmapData(pLoader.width,pLoader.height);    myBitmapData.draw(pLoader);    //// если пока не объявлен битмап - объявляем а если он уже существует - в его свойство bitmapData запихиваем объект myBitmapData;    // это сделано для множественного выбора фото    if (bmp == null)    {  bmp = new Bitmap(myBitmapData);    }    else    {  bmp.bitmapData = myBitmapData;    }    if (board.contains(bmp))    {  board.removeChild(bmp);    }     board.addChild(bmp);     resizePicture();}function onIOError(evt:IOErrorEvent):void{    trace("There was an IO Error.");}function onSecurityError(evt:Event):void{    trace("There was a security error.");}function GoSelectFoto(){    fileRef.browse([textTypeFilter]);}function selectFotoPressedHandler(e:Event){    trace("selectFotoPressed");    GoSelectFoto();}function resizePicture(){    var delitel = 0;     if (board.width > resizeObject.w)    {  delitel = board.width / resizeObject.w;  board.width = board.width / delitel;  board.height = board.height / delitel;    }     if (board.height > resizeObject.h)    {  delitel = board.height / resizeObject.h;  board.height = board.height / delitel;  board.width = board.width / delitel;    }    trace("resized");}
При добавлении мувика к шейпу:

Код: Выделить всё

board.addChild(pencilDraw);
когда рисуешь рисуется на несколько пикселей дальше от курсора (заметил, что растояние от курсора зависит от размера загруженного фото)
А когда убираю добавление мувика к шейпу:

Код: Выделить всё

addChild(pencilDraw);
то рисуется все ровно точно по центру курсора, но мне не надо убирать добавление мувика к шейпу т.к. тогда сохраниться один мувик....как быть?!

Исходник: draw_in_foto.rar
Ответить