Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   graphics и заливка (http://www.flasher.ru/forum/showthread.php?t=110441)

Rzer 02.04.2008 22:11

graphics и заливка
 
Работаю с заливкой. Собственно документ класс: (fps 31):

Код:

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

       
        public class Landscape extends Sprite {
                public var isMouseDown:Boolean;
                private var matrix:Matrix;
               
                public function Landscape(){
                        isMouseDown = false;
                        matrix = new Matrix();
                        configureListeners();
                }
               
                public function configureListeners():void{
                        this.stage.addEventListener(MouseEvent.MOUSE_DOWN, mousePress, false, 0, true);
                        this.stage.addEventListener(MouseEvent.MOUSE_UP, mouseRelease, false, 0, true);
                        this.stage.addEventListener(Event.ENTER_FRAME, update, false, 0, true);
                }
               
                public function mousePress(e:MouseEvent):void{
                       
                        isMouseDown = true;
                }
               
                public function mouseRelease(e:MouseEvent):void{
                        isMouseDown = false;
                }
               
                public function update(e:Event=null){
                        if(isMouseDown){
                               
                                  matrix.createGradientBox(100,100, 0,mouseX-50, mouseY-50);
                                  this.graphics.beginGradientFill(GradientType.RADIAL, [0x150D04, 0x150D04], [0.1, 0], [0x00, 0xFF], matrix,SpreadMethod.PAD); 
                                //this.graphics.beginFill(Number(Math.random()*255),0.1);
                                  this.graphics.drawCircle(mouseX,mouseY,50);
                                this.graphics.endFill();
                        }
                }
               
        }
       
}

У меня два вопроса:
1. Почему при длительном рисовании начинаются задержки и как по этому поводу сделать "кеш" рисунка чтобы каждый след кружок рисовался с одинаковой скоростью.

2. Почему на крае круга при длительном удержании мышки в одном и том же положении (не перемещая) - на крае образуется белая кромка (или кромка с цветом фона сцены) при условии что цвет градиента на крае имеет альфу 0.

silin 02.04.2008 22:53

1. задержки из-за того что по Event.ENTER_FRAME плодишь столько шейпов, которые плееру вообще-то нужно перерисовывать на каждом такте, что он затыкается..
2. откуда берется твердый цвет при нулевой альфе на краю градиента не могу сказать..

как вариант решения: на каждом такте enterFrame скидывать нарисованный шейп в битмап.., некотрые артефакты тоже имеют место быть, но не такие дикие..
и хотя бы производительность не страдает
Код:

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

       
        public class Landscape extends Sprite {
                public var isMouseDown:Boolean;
                private var matrix:Matrix;
                private var drawShape:Shape;
                private var drawCanvas:Graphics;
                private var resultBitmap:Bitmap;
               
                public function Landscape(){
                        isMouseDown = false;
                        matrix = new Matrix();
                       
                        resultBitmap = new Bitmap(new BitmapData(stage.stageWidth, stage.stageHeight, true, 0));
                        resultBitmap.smoothing = true;
                        addChild(resultBitmap);
                       
                        drawShape = new Shape();
                        drawCanvas = drawShape.graphics;
                        addChild(drawShape);
                       
                        configureListeners();
                }
               
                public function configureListeners():void{
                        stage.addEventListener(MouseEvent.MOUSE_DOWN, mousePress, false, 0, true);
                        stage.addEventListener(MouseEvent.MOUSE_UP, mouseRelease, false, 0, true);
                        stage.addEventListener(Event.ENTER_FRAME, update, false, 0, true);
                }

                public function mousePress(e:MouseEvent):void {
                        isMouseDown = true;
                }
               
                public function mouseRelease(e:MouseEvent):void{
                        isMouseDown = false;
                }
               
                public function update(e:Event=null):void{
                        if(isMouseDown){
                                  matrix.createGradientBox(100, 100, 0, mouseX - 50, mouseY - 50);
                                  drawCanvas.beginGradientFill(GradientType.RADIAL, [0x150D04, 0x150D04], [0.1, 0], [0x00, 0xFF], matrix,SpreadMethod.PAD); 
                                  drawCanvas.drawCircle(mouseX,mouseY,50);
                                //дорисовываем шейп к битпаму, а сам шейп очищаем
                                resultBitmap.bitmapData.draw(drawShape);
                                drawCanvas.clear();
                               
                        }
                }
               
        }
       
}


Rzer 02.04.2008 23:07

2 silin: Большое спасибо за совет. Не думал что так просто. И второй пункт потерял актуальность. Ещё раз спасибо.


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

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