Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как стереть нарисованное не целеком а по области курсора мышки (http://www.flasher.ru/forum/showthread.php?t=98390)

p.kiev.ua 12.07.2007 14:45

Вот функция которая ресует мышкой:

Код:

function onMousedown(event:MouseEvent):void {
        var to_x = event.localX;
        var to_y = event.localY;
       
        child.graphics.lineStyle(jir, colors, 100, true, "normal", "none");
        child.graphics.moveTo(to_x,to_y);
       
       
        avatar_mc.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

нужно при нажатии на кнопку чтоб появлялась "Стиралка" нарисованного рисунка

как сделать чтоб стерлось все что нарисованно я знаю:

Код:


clear_mc.addEventListener(MouseEvent.CLICK, clickHandler);
function clickHandler(event:MouseEvent):void {
        child.graphics.clear();
}

а вот как зделать чтоб удалялось только при клике и ведении мышки непонятно... уже и так пробывал и так...

подскажите плиз

ну как в фотошопе резинка или в поинте

BigDan 12.07.2007 14:55

зарисовываешь нужную область цветом фона

p.kiev.ua 12.07.2007 14:57

я так тоже думал, но у меня там фон меняется да и фон - это разные фотографии тоесть неполучится зарисовать под фотку :)

BigDan 12.07.2007 16:13

тогда BitmapData

p.kiev.ua 12.07.2007 16:21

а пример напиши пожалуйсто! Ато я не представляю немного как оно будет выглядеть

silin 12.07.2007 16:55

как вариант: рисовать линию не в общем мувике/спрайте, а для каждого отрезка создавать свой.., 'стеркой' потом их просто удалять при наезде..

p.kiev.ua 12.07.2007 17:04

Цитата:

Сообщение от silin
как вариант: рисовать линию не в общем мувике/спрайте, а для каждого отрезка создавать свой.., 'стеркой' потом их просто удалять при наезде..

а в коде как это выглядит? :umnik2:

BigDan 12.07.2007 17:07

Цитата:

Сообщение от silin
как вариант: рисовать линию не в общем мувике/спрайте, а для каждого отрезка создавать свой.., 'стеркой' потом их просто удалять при наезде..

это много ресурсов сожрёт....

etc 12.07.2007 17:23

Цитата:

Сообщение от p.kiev.ua
а в коде как это выглядит? :umnik2:

Вам направление дали? Дали. Вот и разбирайтесь с BitmapData.

silin 12.07.2007 17:52

Цитата:

Сообщение от BigDan
это много ресурсов сожрёт....

да сожрет.., хотя это сильно зависит от длины отрезков, которыми будем рисовать: чем мельче ( стало быть более гладкая кривая), тем больше этого добра надо громоздить..
к слову, тоже самое относится и к рисованию в одном спрайте: если рисовать линию на каждый маусМув, то будет их(линий) немерянно и все быстро застопорится..
вариант с с BitmapData тогда лучше смотрится..
Цитата:

а в коде как это выглядит?
да нормально это в коде выглядит.., к сожалению готового примера нет, а соорудить сейчас недосуг..

p.kiev.ua 12.07.2007 21:25

А как для каждого отрезка создавать новый мувик?

BigDan 12.07.2007 22:18

Цитата:

Сообщение от p.kiev.ua
А как для каждого отрезка создавать новый мувик?

Вам же сказали, что этот метод отпадает... Изучайте класс BitmapData...

з.ы. через BitmapData я бы так делал: в том месте, где находится ластик, копировал пиксели фона и переносил бы на основное изображение

silin 12.07.2007 23:16

примерная схема
Код:

package {
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Point;

        public class  Test extends Sprite{
                private var render:Function=myNull;
                private var canvas:Sprite;
                private var pen:Point;
                private var maxLength:Number=7;
                private var drawBut:But;
                private var clearBut:But;
                public function Test(){
                        canvas=new Sprite();
                        canvas.graphics.beginFill(0xCCCCCC);
                        canvas.graphics.drawRect(0,0,550,400);
                        addChild(canvas);
                        drawBut=new But("draw");
                        addChild(drawBut);
                        clearBut=new But("clear");
                        clearBut.x=drawBut.width+10;
                       
                        addChild(clearBut);
                        drawBut.addEventListener(MouseEvent.CLICK,drawClick);
                        clearBut.addEventListener(MouseEvent.CLICK,clearClick);
                        canvas.addEventListener(MouseEvent.MOUSE_DOWN,startRender);
                        canvas.addEventListener(MouseEvent.MOUSE_UP,stopRender);
                }
                private function drawClick(evnt:MouseEvent):void{
                        render=myDraw;
                        drawBut.backgroundColor=0xFFFFFF;
                        clearBut.backgroundColor=0x999999;
                }
                private function clearClick(evnt:MouseEvent):void{
                        render=myClear;
                        drawBut.backgroundColor=0x999999;
                        clearBut.backgroundColor=0xFFFFFF;
                }
               
                private function startRender(evnt:MouseEvent):void{
                        canvas.addEventListener(MouseEvent.MOUSE_MOVE,render);
                        pen=new Point(mouseX,mouseY);
                }
                private function stopRender(vnt:MouseEvent):void{
                        canvas.removeEventListener(MouseEvent.MOUSE_MOVE,render);
                }
                private function myDraw(evnt:MouseEvent):void{
                        var p:Point=new Point(mouseX,mouseY);
                        //рисуем только больше минимальной длины..
                        if(Point.distance(p,pen)>=maxLength){
                                var s:Sprite=new Sprite();
                                canvas.addChild(s);
                                s.graphics.lineStyle(1,0xFF0000);
                                s.graphics.moveTo(pen.x,pen.y);
                                s.graphics.lineTo(mouseX,mouseY);
                                pen=p;
                        }
                }
                private function myClear(evnt:MouseEvent):void{
                        for(var i:int=0;i<canvas.numChildren;i++){
                                var line:Sprite=canvas.getChildAt(i) as Sprite;
                                if(line.hitTestPoint(mouseX,mouseY)) canvas.removeChild(line);
                        }
                }
                private function myNull(evnt:MouseEvent):void{
                }
        }
}

import flash.text.TextField;
class But extends TextField{
        public function But(txt:String){
                text=txt;
                autoSize="left";
                selectable=false;
                background=true;
                backgroundColor=0x999999;
        }
}


wandr1 24.07.2007 20:33

Если фон не однотонный, как задать именно те пиксели которые должны быть в данном месте?

BigDan 24.07.2007 20:35

Цитата:

Сообщение от wandr1
Если фон не однотонный, как задать именно те пиксели которые должны быть в данном месте?

Через BitmapData.getPixel() :)
з.ы. а лучше пиксели изображения(которое мы стираем) делать просто прозрачными.

wandr1 25.07.2007 16:34

В битмап загнал, спасибо. Но как делать его прозрачным при ster = true
if ((m_x>0 && m_x<310) && (m_y>0 && m_y<310)) {
child.graphics.lineTo(avatar_mc.mouseX, avatar_mc.mouseY);
}if(ster){??????????}else{
canvas.bitmapData.draw(child);}
}

BigDan 25.07.2007 16:45

Код:

setPixel32(x,y,0x00000000);

etc 25.07.2007 17:04

wandr1, отредактируйте свой пост и оформите код тегами [code][/code].

silin 25.07.2007 21:47

с битмапом, канеш удобнее..
как вариант: рисовать в невидимом шейпе, который срисовывать в битмап с разным блендМод, в зависимости от режима рисования или стерки:

Код:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        import flash.text.TextField;

        public class DrawTest extends Sprite {
               
                var colors:Array=[0,0xFF0000,0x00FF00,0x0000FF];
                var sizes:Array=[8,12,16,20];
                var drawColor:Number=0;
                var drawSize:Number=12;
                var drawMode:Boolean=true;
               
                var modeSelector:TextField;
                var drawSprite:Sprite;
                var drawShape:Shape=new Shape();
               
                var canvas:Bitmap;
                var startPoint:Point;

                public function DrawTest(){
                        modeSelector=new TextField();
                        modeSelector.selectable=false;
                        modeSelector.background=true;
                        modeSelector.backgroundColor=0xEEEEEE;
                        modeSelector.text="draw";
                        modeSelector.width=50;
                        modeSelector.height=20;
                        modeSelector.addEventListener(MouseEvent.CLICK,switchMode);
                        addChild(modeSelector);
                       
                        var i:Number=0;
                        for(i=0;i<colors.length;i++){
                                var cs:ColorSelector=new ColorSelector(colors[i]);
                                cs.x=100+60*i;
                                cs.y=20;
                                addChild(cs);
                                cs.addEventListener(MouseEvent.CLICK,switchColor);
                        }
                        ////////////////
                        for(i=0;i<sizes.length;i++){
                                var ss:SizeSelector=new SizeSelector(sizes[i]);
                                ss.x=100+60*i;
                                ss.y=60;
                                addChild(ss);
                                ss.addEventListener(MouseEvent.CLICK,switchSize);
                        }
                        //////////////
                        drawSprite=new Sprite();
                        drawSprite.y=80;
                        drawSprite.graphics.beginFill(0xF5F5F5);
                        drawSprite.graphics.drawRect(0,0,550,300);
                        //просто закрасил, можно картнку  пложить или еще чего..
                        //drawSprite.addChild(new Bitmap(new Pic(0,0)));//Pic-картинка в библиотеке
                        addChild(drawSprite);
                       
                        canvas=new Bitmap(new BitmapData(550,300,true,0));
                        drawSprite.addChild(canvas);
                       
                        drawSprite.addEventListener(MouseEvent.MOUSE_DOWN,startDraw);
                        drawSprite.addEventListener(MouseEvent.MOUSE_UP,stopDraw);
                }
                private function switchMode(e:MouseEvent):void{
                        drawMode=!drawMode;
                        modeSelector.text=drawMode ?  "draw" : "erase";
                }
                private function switchColor(e:MouseEvent):void{
                        var s=e.target as ColorSelector;
                        drawColor=s.color;
                }
                private function switchSize(e:MouseEvent):void{
                        var s=e.target as SizeSelector;
                        drawSize=s.size;
                }
                private function startDraw(e:MouseEvent):void{
                        drawSprite.addEventListener(Event.ENTER_FRAME,render);
                        startPoint=new Point(drawSprite.mouseX,drawSprite.mouseY);
                }
                private function stopDraw(e:MouseEvent):void{
                        drawSprite.removeEventListener(Event.ENTER_FRAME,render);
                }
                private function render(e:Event):void{
                        drawShape.graphics.lineStyle(drawSize,drawColor);
                        drawShape.graphics.moveTo(startPoint.x,startPoint.y);
                        startPoint=new Point(drawSprite.mouseX,drawSprite.mouseY);
                        drawShape.graphics.lineTo(startPoint.x,startPoint.y);
                        canvas.bitmapData.draw(drawShape,null, null,drawMode? null:BlendMode.ERASE);
                        drawShape.graphics.clear();
                }
        }
}
/////////////////////////////////
import flash.display.Sprite;
class SizeSelector extends Sprite{
        public var size:Number;
        public function SizeSelector(d:Number){
                size=d;
                graphics.beginFill(0xCCCCCC);
                graphics.drawCircle(0,0,d/2);
        }
}
////////////////////////////////////////
class ColorSelector extends Sprite{
        public var color:Number;
        public function ColorSelector(clr:Number){
                color=clr;
                graphics.beginFill(clr);
                graphics.drawCircle(0,0,15);
        }
}



Часовой пояс GMT +4, время: 15:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.