Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Плавное перемещение bitmap (http://www.flasher.ru/forum/showthread.php?t=144297)

Tr1te 09.09.2010 15:58

ДА именно так:
Код AS3:

                private var DrawSegSizeX:int=4000;
                private var DrawSegSizeY:int=DrawSegSizeX;
                private function DrawvrSeg():BitmapData {
                        var Canvas:Sprite=new Sprite();
                        addChild(Canvas);
 
                        for (var v:int=0; v<600; v++) {
                                var _vr:vr=new vr();
                                _vr.x=Math.random()*(DrawSegSizeX-_vr.width);
                                _vr.y=Math.random()*(DrawSegSizeY-_vr.height);
                                _vr.scaleX=.5;
                                _vr.scaleY=.5;
                                Canvas.addChild(_vr);
                        }
                        for (v=0; v<300; v++) {
                                _vr=new vr();
                                _vr.x=Math.random()*(DrawSegSizeX-_vr.width);
                                _vr.y=Math.random()*(DrawSegSizeY-_vr.height);
                                _vr.scaleX=.75;
                                _vr.scaleY=.75;
                                Canvas.addChild(_vr);
                        }
                        for (v=0; v<50; v++) {
                                _vr=new vr();
                                _vr.x=Math.random()*(DrawSegSizeX-_vr.width);
                                _vr.y=Math.random()*(DrawSegSizeY-_vr.height);
                                _vr.scaleX=1;
                                _vr.scaleY=1;
                                Canvas.addChild(_vr);
                        }
 
                        var vrPicData:BitmapData=new BitmapData(DrawSegSizeX,DrawSegSizeY,true,0x00FFFFFF);
                        vrPicData.draw(Canvas);
 
                        while (Canvas.numChildren>0) {
                                Canvas.removeChild(Canvas.getChildAt(0));
                        }
 
                        removeChild(Canvas);
                        Canvas=null;
                        return (vrPicData);
                }


derhab 09.09.2010 16:22

ну похоже да)

а по поводу кода.. зачем 3 цикла?

Код AS3:

for (var v:int = 0; v < 600; v++) {
 
        var _vr:vr = new vr();
        _vr.x = Math.random() * (DrawSegSizeX-_vr.width);
        _vr.y = Math.random() * (DrawSegSizeY-_vr.height);
 
        if(v <= 50){
            _vr.scaleX = 1;
            _vr.scaleY = 1;
        }else if(v > 50 && v <= 300){
            _vr.scaleX = .75;
            _vr.scaleY = .75;
        }else{
            _vr.scaleX = .5;
            _vr.scaleY = .5;
        }
 
        Canvas.addChild(_vr);
}

и зачем удалять всех детей из контейнера, если в следующей строчке вы удаляете сам контейнер?)

gloomyBrain 09.09.2010 16:23

Мне лень лезть в Ваш код.

Вот пример: создаем 200 Bitmap с одной и той же BitmapData
Код AS3:

package {
 
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
 
        public class Holder extends Sprite {
 
                public function Holder() {
 
                        super();
 
                        var bd:BitmapData = new BitmapData(4000, 4000, true, Math.random() * int.MAX_VALUE);
 
                        for (var i:int = 0; i < 200; i++) {
 
                                var bp:Bitmap = new Bitmap(bd);
 
                                bp.x = Math.random() * 800;
                                bp.y = Math.random() * 600;
                                bp.smoothing = false;
 
                                this.addChild(bp);
 
                        }
 
                }
 
        }
 
}

дальше - добавляем на сцену и начинаем перетаскивать
Код AS3:

package  {
 
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Main extends Sprite {
 
                public function Main():void {
                        if (this.stage) this.init();
                        else this.addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(evt:Event = null):void {
                        this.removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        // entry point
 
                        var h:Holder = new Holder();
                        this.addChild(h);
                        h.startDrag();
 
                }
 
        }
 
}

У меня загрузка близка к смертельной

Tr1te 09.09.2010 16:35

Цитата:

Сообщение от derhab (Сообщение 934598)
а по поводу кода.. зачем 3 цикла?

Ну можно это описать в одном, ну для примера я просто копипастил.

Цитата:

Сообщение от derhab (Сообщение 934598)
и зачем удалять всех детей из контейнера, если в следующей строчке вы удаляете сам контейнер?)

Потому что я не уверен в том что удаляется.

Цитата:

Сообщение от gloomyBrain (Сообщение 934599)
Мне лень лезть в Ваш код. У меня загрузка близка к смертельной

ТОгда зачем спрашивали ссылку? :)
В примере я также создаю битмапы, и загрузка секунда, может 2. Можите сами попробовать.

gloomyBrain 09.09.2010 16:48

Цитата:

ТОгда зачем спрашивали ссылку?
Ссылка на ваш код мне без надобности. Вероятно, по этому я ее и не спрашивал.
А вообще так можно долго спорить.
Может я как-то плохо создаю Bitmap, что у меня тормозит, а у Вас - нет? =)

derhab 09.09.2010 16:58

Цитата:

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

всмысле в итоге вы таскаете все-таки не 255 объектов каждый по 4000х4000, я это имел ввиду..

Tr1te 09.09.2010 17:02

У вас в коде:
На сцене создаете один экземпляр класса в котором создаете дату, и в цикле создаете битмапы, в которую запихивайте ранее созданаю дату.

В моем варианте:
Я на сцене создаю дату и в цикле создаю 200 экземпляров класса, в который передаю дату, а уже внутри экземпляра создается битмапа.

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

Цитата:

Сообщение от derhab (Сообщение 934614)
да.. а вот странно, почему ваш пример не тормозит.. там явно что-то не так, а по разрозненным кускам кода трудно понять..

Вот код поля:
Код AS3:

package Scr{
 
        import flash.display.*;
        import flash.events.*;
        import flash.geom.*;
        import flash.utils.*;
 
        public class vrField extends vZoom {
                //---------------------------------------------------------------------------
 
                //--------------------------------------------------------------------------- Vars
                private var DrawSegSizeX:int=4000;
                private var DrawSegSizeY:int=DrawSegSizeX;
                private var SegSizeX:int=3700;
                private var SegSizeY:int=SegSizeX;
                private var SegMultiplyer:int=1;
                //---------------------------------------------------------------------------
 
                //--------------------------------------------------------------------------- vrField
                public function vrField():void {
                        SegSizeX*=SegMultiplyer;
                        SegSizeY*=SegMultiplyer;
 
                        var bd_0:BitmapData=DrawvrSeg();
 
                        for (var vY:int=0; vY<=14; vY++) {
                                for (var vX:int=0; vX<=14; vX++) {
                                        var _vrSeg:vrSeg=new vrSeg(bd_0,vX,vY,DrawSegSizeX,DrawSegSizeY,SegMultiplyer);
                                        _vrSeg.x=vX*SegSizeX;
                                        _vrSeg.y=vY*SegSizeY;
                                        _vrSeg.scaleX=SegMultiplyer;
                                        _vrSeg.scaleY=SegMultiplyer;
                                        addChild(_vrSeg);
                                }
                        }
                }
                //---------------------------------------------------------------------------
 
                //--------------------------------------------------------------------------- DrawvrSeg
                private function DrawvrSeg():BitmapData {
                        var Canvas:Sprite=new Sprite();
                        addChild(Canvas);
 
                        for (var v:int=0; v<600; v++) {
                                var _vr:vr=new vr();
                                _vr.x=Math.random()*(DrawSegSizeX-_vr.width);
                                _vr.y=Math.random()*(DrawSegSizeY-_vr.height);
                                _vr.scaleX=.5;
                                _vr.scaleY=.5;
                                Canvas.addChild(_vr);
                        }
                        for (v=0; v<300; v++) {
                                _vr=new vr();
                                _vr.x=Math.random()*(DrawSegSizeX-_vr.width);
                                _vr.y=Math.random()*(DrawSegSizeY-_vr.height);
                                _vr.scaleX=.75;
                                _vr.scaleY=.75;
                                Canvas.addChild(_vr);
                        }
                        for (v=0; v<50; v++) {
                                _vr=new vr();
                                _vr.x=Math.random()*(DrawSegSizeX-_vr.width);
                                _vr.y=Math.random()*(DrawSegSizeY-_vr.height);
                                _vr.scaleX=1;
                                _vr.scaleY=1;
                                Canvas.addChild(_vr);
                        }
 
                        var vrPicData:BitmapData=new BitmapData(DrawSegSizeX,DrawSegSizeY,true,0x00FFFFFF);
                        vrPicData.draw(Canvas);
 
                        while (Canvas.numChildren>0) {
                                Canvas.removeChild(Canvas.getChildAt(0));
                        }
 
                        removeChild(Canvas);
                        Canvas=null;
                        return (vrPicData);
                }
                //---------------------------------------------------------------------------
 
                //---------------------------------------------------------------------------
        }//class
}//package

Это код сегмента:
Код AS3:

package Scr{
 
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
 
    public class vrSeg extends Sprite {
        //---------------------------------------------------------------------------
 
        //--------------------------------------------------------------------------- Vars
        private var vrPic:Bitmap=new Bitmap();
        public var CurPos:Point=new Point();
        private var SegSizeX:int;
        private var SegSizeY:int;
        private var MultiplySegSizeX:int;
        private var MultiplySegSizeY:int;
        //---------------------------------------------------------------------------
 
        //--------------------------------------------------------------------------- vrSeg
        public function vrSeg(a_vrPicDate:BitmapData,a_X:int,a_Y:int,a_SegSizeX:int,a_SegSizeY:int,a_Multiply:int):void {
            var vrPic:Bitmap=new Bitmap(a_vrPicDate);
            addChild(vrPic);
 
            CurPos.x=a_X;
            CurPos.y=a_Y;
        }
        //---------------------------------------------------------------------------
 
        //---------------------------------------------------------------------------
    }//class
}//package

Я бы скинул исходник, но он дочерта весит.

i.o. 09.09.2010 17:29

Абсолютно нечитаемый код... это раз. Да и люди на этом форуме вроде не враги вам, чтобы их запутывать (по крайней мере в одном месте нашел передачу фэйковых параметров) - это два. И три: у вас все наоборот - классы с маленькой буквы, а переменные и пакеты с большой.. не по конвенции - http://opensource.adobe.com/wiki/dis...ng+Conventions, понимаешь ))

Насколько я понял, в данном примере битмапдата не клонируется, а просто используется инстансом во всех 255 битмапах.
Проц не грузиться скорее всего потому, что внутри контейнера битмапы стоят неподвижно и не двигаются относительно друг друга. Скорее всего, плеер их как то кэширует и просто не перерисовывает.

gloomyBrain 09.09.2010 17:33

В моем примере Bitmap'ы тоже стоят на месте

Tr1te 09.09.2010 17:46

Цитата:

Сообщение от i.o. (Сообщение 934620)
Абсолютно нечитаемый код... это раз. Да и люди на этом форуме вроде не враги вам, чтобы их запутывать (по крайней мере в одном месте нашел передачу фэйковых параметров) - это два. И три: у вас все наоборот - классы с маленькой буквы, а переменные и пакеты с большой..

Я не отношусь, как к врагам. Фэйковые ссылки потому, что это копипаст с оригинала. Я вынес только то что необходимо к теме, и естественно где-то что-то забыл удалить.

Цитата:

Сообщение от i.o. (Сообщение 934620)
Проц не грузиться скорее всего потому, что внутри контейнера битмапы стоят неподвижно и не двигаются относительно друг друга. Скорее всего, плеер их как то кэширует и просто не перерисовывает.

В обоих случаях контейнеры, и не двигаются относительно друг-друга.
А про кэширование, если создавать множество случайно нарисованных картинок, то тоже не тормозит, но долго создается, чтобы 200 картинок отрисовать, очень много времени потратить.


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

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