Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   BitmapData.draw || Поворот в Matrix (http://www.flasher.ru/forum/showthread.php?t=177328)

MikroAcse 29.03.2012 19:14

BitmapData.draw || Поворот в Matrix
 
Итак, у меня есть такая маленькая функция для перерисовывания объекта в BitmapData:
Код AS3:

public static function toBitmapData(target:DisplayObject):BitmapData {
                var rect:Rectangle=toRect(target);
                var bmd:BitmapData=new BitmapData(rect.width, rect.height, true, 0);
                var mtrx:Matrix = new Matrix(target.scaleX, 0, 0, target.scaleY, target.x, target.y);
 
                mtrx.translate( -rect.left, -rect.top);
 
                bmd.draw(target, mtrx);
                return bmd;
}

Все работает нормально, scaleX и scaleY нормально перерисовывает.
А вот с поворотами проблема.
Что здесь надо добавить, чтобы матрица повернулась на заданный угол?
Код AS3:

mtrx.rotate(Math.PI * (180/target.rotation))

Не работает :(
Нужна срочная помощь.

Добавлено через 3 минуты
Кстати, toRect:
Код AS3:

public static function toRect(target:DisplayObject):Rectangle {
        var main:Stage=target.root.stage;
        var rect:Rectangle=target.getBounds(main);
        return rect;
}


Genzo 29.03.2012 19:21

Поидее
Код AS3:

mtrx.rotate(target.rotation * Math.PI/180);


MikroAcse 29.03.2012 20:32

Сейчас попробую...

MikroAcse 29.03.2012 21:08

Вложений: 1
:(
Код Main.as:
Код AS3:

package {
        import com.mikroacse.display.utils.*;
        import com.mikroacse.display.utils.log.*;
        import com.mikroacse.motion.*;
        import com.mikroacse.motion.easing.*;
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
        import flash.filters.*;
        import flash.system.System;
        /**
        * ...
        * @author MikroAcse studio
        */

 
        public class Main extends Sprite {
                public var obj1:DisplayObject;
                public var obj2:DisplayObject;
 
                public function Main():void {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        this.loaderInfo.addEventListener(Event.COMPLETE, start);
                }
 
                private function start(e:Event):void {
                        obj2 = addChild(DrawTool.newCircle([200, 200, 50], [0x0000FF]));
                        obj1 = addChild(DrawTool.newBox([-25, -25, 50, 50], [0xFF0000]));
 
                        obj1.scaleX = 0.5;
                        obj2.scaleY = 2;
                        obj1.rotation = 10;
                        obj1.x = obj1.y = 100;
 
                        DisplayTool.toBitmapData(obj1);
                }
        }
 
}

Код DisplayTool.as:
Код AS3:

package  com.mikroacse.display.utils {
        import com.mikroacse.utils.*;
        import flash.display.*;
        import flash.geom.*;
 
                public static function toBitmapData(target:DisplayObject):BitmapData {
                        var rect:Rectangle = toRect(target);
                        var bmd:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
                        var mtrx:Matrix = new Matrix(target.scaleX, 0, 0, target.scaleY, target.x, target.y);
 
 
                        mtrx.translate( -rect.left, -rect.top);
                        mtrx.rotate(target.rotation * Math.PI/180);
 
                        bmd.draw(target, mtrx);
                        target.root.stage.addChild(new Bitmap(bmd));
                        return bmd;
                }
 
                public static function toRect(target:DisplayObject):Rectangle {
                        var main:Stage=target.root.stage;
                        var rect:Rectangle=target.getBounds(main);
                        return rect;
                }
 
                public static function addChilds(container:DisplayObjectContainer, ...childs):void {
                        for (var i:uint = 0; i < childs.length; i++) {
                                container.addChild(childs[i] as DisplayObject);
                        }
                }
        }
}


anmelegov 29.03.2012 21:26

а зачем вы транслэйт делаете если в конструктуре 5 и 6 параметры задают оффсет?

MikroAcse 29.03.2012 21:30

А если точка регистрации объекта не слева сверху?
Без этого параметра, перерисованный квадрат вообще не будет видно.

strangedk 29.03.2012 22:32

На своем опыте скажу, НИКОГДА не используйте не стандартную точку регистрации. По началу кажется удобно, потом замучаетесь.

Genzo 30.03.2012 11:07

Вчера запускал ваш код, все работает, только у вас не правильный
Код AS3:

var bmd:BitmapData = new BitmapData(rect.width, rect.height, true, 0);

, rect.width, rect.height - попробуйте поставить 500,500 и посмотрите.

Добавлено через 1 минуту
Хотя вру, я делал так :
Код AS3:

var mtrx:Matrix = target.transform.matrix.clone();
bmd.draw(target, mtrx);


MikroAcse 30.03.2012 12:37

Все, справился, спасибо всем.
Особенно Genzo.


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

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