Форум 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() (http://www.flasher.ru/forum/showthread.php?t=174710)

s3dworld 31.01.2012 16:38

Расчет размеров BitmapData::Draw()
 
Всем доброго дня!

У меня есть Sprite, который будет в себе хранить Bitmap. Sprite можно было бы вообще не использовать, но пришлось, так как хочу задействовать его свойство scrollRect. В Bitmap будут рисоваться множество картинок. Проблема в следующем, чтобы создать BitmapData, нужно указать размер. Но я не могу знать точный размер, точнее мне сложно его рассчитать, так как в него будут копироваться изометрические тайлы. Сейчас у меня код такой:

Код AS3:

for(var j:uint=0;j<mapRows;j++)
{
        for(var i:uint=0;i<mapColumns;i++)
        {
                var bitmap:Bitmap=Bitmap(mapFields.GetOnID(fields[j*mapColumns+i].area).loader.content);
                var bitmapData:BitmapData=new BitmapData(bitmap.width,bitmap.height,true,0);
 
                bitmapData.draw(bitmap);
 
                var image:Bitmap=new Bitmap(bitmapData);
 
                image.x=0+(i*listAllFields.fieldWidth/2)-(j*listAllFields.fieldWidth/2);
                image.y=0+(i*listAllFields.fieldHeight/2)+(j*listAllFields.fieldHeight/2);
 
                layerGround.addChild(image);
        }
}

Но тут получается что в layerGround хранится множество изображений. А я хочу чтобы только одно. Можно как-то выкрутиться?

Jarproger 31.01.2012 16:54

Не стоит в цикле создавать bitmapData много раз.
Вы можете использовать одну и ту же картинку много раз, а сами объекты Bitmap занимают немного

Genzo 31.01.2012 17:01

Сначала циклом посчитайте общий размер, и потом отрисовывайте

Добавлено через 7 минут
Не проверял правильно или нет... но все же :
Код AS3:

var totalHeight:Number , totalWidth:Number;
for(var j:uint=0;j<mapRows;j++)
{
        for(var i:uint=0;i<mapColumns;i++)
        {
                var do:DisplayObject = mapFields.GetOnID(fields[j*mapColumns+i].area).loader.content as DisplayObject;
                if(i == 0){
                        totalHeight += do.height;
                }
                totalWidth += do.width;
        }
}
var bitmapData:BitmapData=new BitmapData(totalHeight,totalWidth,true,0);
 
for(var j:uint=0;j<mapRows;j++)
{
        for(var i:uint=0;i<mapColumns;i++)
        {       
                var do:DisplayObject = mapFields.GetOnID(fields[j*mapColumns+i].area).loader.content as DisplayObject;
                var matrix:Matrix = new Matrix();
                matrix.translate((i*listAllFields.fieldWidth/2)-(j*listAllFields.fieldWidth/2) , (i*listAllFields.fieldHeight/2)+(j*listAllFields.fieldHeight/2));
                bitmapData.draw(do, matrix);
        }
}
var image:Bitmap=new Bitmap(bitmapData);
layerGround.addChild(image);


s3dworld 31.01.2012 17:35

Либо рассчитать позиции крайних объектов и на основании их координат рассчитать занимаемую ими прямоугольную область.

HardCoder 31.01.2012 17:57

А что мешает в цикле насоздавать битмап в некоем контейнере. А потом весь этот контейнер отрисовать в битмапдату?

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

for(var j:uint=0;j<mapRows;j++)
{
        for(var i:uint=0;i<mapColumns;i++)
        {
                var image:Bitmap = Bitmap(mapFields.GetOnID(fields[j*mapColumns+i].area).loader.content);
                image.x=0+(i*listAllFields.fieldWidth/2)-(j*listAllFields.fieldWidth/2);
                image.y=0+(i*listAllFields.fieldHeight/2)+(j*listAllFields.fieldHeight/2);
 
                layerGround.addChild(image);
        }
}
var bmd:BitmapData = new BitmapData(layerGround.width, layerGround.height);
bmd.draw(layerGround);
var layerGroundBitmap:Bitmap = new Bitmap(bmd);
addChild(layerGroundBitmap);


s3dworld 31.01.2012 18:06

Ну я пока так сделал:

Код AS3:

var imageWidth:uint=0;
var imageHeight:uint=0;
var mapX1:int=0;
var mapY1:int=0;
var mapX2:int=0;
var mapY2:int=0;
 
mapX1=(0*Game.fieldWidth/2)-((map.mapRows-1)*Game.fieldWidth/2);
mapY1=(0*Game.fieldHeight/2)+(0*Game.fieldHeight/2);
 
mapX2=((map.mapColumns-1)*Game.fieldWidth/2)-(0*Game.fieldWidth/2);
mapY2=((map.mapColumns-1)*Game.fieldHeight/2)+((map.mapRows-1)*Game.fieldHeight/2);
 
imageWidth=(-1*mapX1)+mapX2;
imageHeight=mapY1+mapY2;


HardCoder 31.01.2012 18:10

Короче, я ничего не понял. Но, если вы хотите из многих картинок создать одну - см. пост №5.


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

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