Форум Flasher.ru

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

Alexmody 05.01.2013 10:05

Прорисовка клипа в BitmapData с сохранением масштабирования
 
- Создаю черный круг (BallVis)
- Увеличиваю/масштабирую его размер по ширине, через свойство width/scaleX.
- Создаю объект BitmapData и ф-ей draw() прорисовываю BallVis используя для расположения матрицу.

В итоге BallVis появляется на экране, но не увеличенный по ширине? Вероятно, в матрицу нужно добавить как-то параметры width/scaleX…


Код AS3:

import flash.display.BitmapData;
 
var objMatrix:Matrix = new Matrix();
 
var ball:BallVis = new BallVis();
//this.addChild(ball);
ball.x = 320;
ball.y = 200;
 
var deltaSize:Number = 100;
ball.width+= deltaSize;
//ball.scaleX = 2;
 
var objectsMap:BitmapData = new BitmapData(640, 480, true, 0x00000000);
var objectBitmap:Bitmap = new Bitmap(objectsMap);
this.addChild(objectBitmap);
 
objMatrix.tx= ball.x;
objMatrix.ty= ball.y;
waterMatrix.scale(ball.scaleX);
 
objectsMap.draw(ball, objMatrix);


caseyryan 05.01.2013 12:17

Код AS3:

import flash.display.BitmapData;
 
var ball:BallVis = new BallVis();
ball.x = 320;
ball.y = 200;
 
var deltaSize:Number = 100;
ball.width+= deltaSize;
 
var objectsMap:BitmapData = new BitmapData(640, 480, true, 0x00000000);
var objectBitmap:Bitmap = new Bitmap(objectsMap);
this.addChild(objectBitmap);
 
 
objectsMap.draw(ball, ball.transform.matrix);


Alexmody 05.01.2013 13:29

Дело в том, в реальной программе visual.x/y= 0, получается что мне нужно взять масштабирование у матрицы объекта, а вот положение из физического тела.
Делаю так (body.Item.visual - это условно ball):

Код:
item.visual.transform.matrix.tx = item.body.position.x;
item.visual.transform.matrix.ty = item.body.position.y;

//Но, почему то после присваивания положения item.visual.transform.matrix.tx равен нулю
(хотя в item.body.position.x = 400) ?
objectsMap.draw(item.visual, item.visual.transform.matrix);

Можно, конечно обновить x/y визуального объекта, но в моем случае у меня все будет притормаживать,
в сцене больше 200 физ. объектов, и все работает норм, если не трогать item.visual.x/y,
а сразу прорисовать в битмапу с помощью матрицы.
Код AS3:

item.visual.x = item.body.position.x;
item.visual.y = item.body.position.y;
objectsMap.draw(item.visual, item.visual.transform.matrix);


СлаваRa 05.01.2013 14:24

Код AS3:

package {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Shape;
        import flash.display.Sprite;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.geom.Matrix;
 
        [SWF(width="640",height="480",frameRate="30")]
 
        /**
        * @author SlavaRa
        */

        public class Main extends Sprite {
 
                public function Main():void {
                        super();
 
                        if (stage) {
                                onAddedToStage();
                        } else {
                                super.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
                        }
                }
 
                private function onAddedToStage(e:Event = null):void {
                        super.removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        super.stage.scaleMode = StageScaleMode.NO_SCALE;
                        super.stage.align = StageAlign.TOP_LEFT;
 
                        const shape:Shape = new Shape();
                        shape.x = 0;
                        shape.y = 0;
                        shape.graphics.beginFill(0x008080);
                        shape.graphics.drawCircle(50, 50, 50);
                        shape.graphics.endFill();
 
                        shape.x = 100;
                        shape.y = 100;
                        shape.scaleX = 2;
 
                        const bitmapData:BitmapData = new BitmapData(640, 480, true, 0x000000);
                        const bitmap:Bitmap = new Bitmap(bitmapData);
 
                        bitmapData.draw(shape, new Matrix(shape.scaleX, 0, 0, shape.scaleY, shape.x, shape.y));
                        super.addChild(bitmap);
                }
        }
}


Alexmody 05.01.2013 14:43

Спасибо всем, примерно так и сделал:

Код AS3:

waterMatrix.a = item.visual.transform.matrix.a;
waterMatrix.d = item.visual.transform.matrix.d;
waterMatrix.tx= item.body.position.x;
waterMatrix.ty = item.body.position.y;
objectsMap.draw(item.visual, waterMatrix);


СлаваRa 05.01.2013 14:52

небольшой оффтоп.
Код AS3:

item.visual.transform.matrix

каждый раз создает новую матрицу, это конечно может быть и не критично, но я бы обошелся без этого.
ну и вместо вместо a=.d= существует метод scale, а вместо tx=,ty= translate, для изменения всех параметров setTo

Alexmody 05.01.2013 15:07

>>каждый раз создает новую матрицу, это конечно может быть и не критично, но я бы обошелся без этого.
Да, спасибо я уже в объекте создал переменные хранящие скейл матрицы a/d, чтобы не обращаться к геттеру.

gagaga 06.01.2013 00:07

waterMatrix - это что?


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

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