AS3: Изменение размера спрайта без изменения размера его BitmapFill (или его содержимого в этом отношении)? - PullRequest
2 голосов
/ 02 ноября 2010

Редактировать # 2 Я нашел решение, оно оказалось более простым, чем я мог надеяться. Спасибо за ваше время. =) (Ответил на мой вопрос с полным решением)

Редактировать: Мои извинения за то, что мой пост был недостаточно прозрачным ... Я попытаюсь повторить для большей ясности. Я не просто пытаюсь вместить вещи и изменить размер контейнера без изменения размера содержимого. Я бы просто использовал для этого простой MovieClip .. Мое основное внимание уделено использованию BitmapFill . Я пытаюсь сделать повторяющееся фоновое изображение для контейнера; пока я могу нарисовать мой спрайт BitmapFill до нужного мне размера. (Это высота сцены), но когда размер сцены изменяется, я хочу изменить размер моего контейнера, но мои контейнеры должны обрезать BitmapFill или добавить больше, когда размер окна увеличивается или уменьшается. Позвольте мне проиллюстрировать, что я имею в виду:

alt text

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

------- Исходное сообщение:

У меня есть простой прямоугольный спрайт, который заполняется растровым изображением из библиотеки, и простая функция обработчика изменения размера, которая определяет, когда окно было изменено.

То, что я хотел бы сделать, это изменить размер прямоугольника до высоты stage.stageHeight, сохраняя его растровое заполнение, но без изменения размера растровое заполнение или любые дочерние элементы в спрайте.

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

в моей библиотеке есть изображение с именем 'pattern', и мой код выглядит так:

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

stage.addEventListener(Event.RESIZE, resizeHandler, false, 0, true);

var bgData:pattern = new pattern(0,0);
var bg:Sprite = new Sprite();

bg.graphics.beginBitmapFill(bgData, null, true, false);
bg.graphics.drawRect( 0, 0, 80, stage.stageHeight);
bg.graphics.endFill();
addChild(bg);

function resizeHandler(e:Event=null):void 
{
 trace("dimensions are: " + stage.stageWidth + " x " + stage.stageHeight);
 bg.height = stage.stageHeight;  //simply makes the fill resize also
}

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

О, ну я тупая.Ответ был довольно прост.

Все, что мне нужно было сделать, это очистить графику, а затем перерисовать ее ..

Я не знал об очистке ();function ..

полный пересмотренный код выглядит следующим образом:

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;

stage.addEventListener(Event.RESIZE, resizeHandler, false, 0, true);

var bgData:pattern = new pattern(0,0);
var bg:Sprite = new Sprite();

bg.graphics.beginBitmapFill(bgData, null, true, false);
bg.graphics.drawRect( 0, 0, 80, stage.stageHeight);
bg.graphics.endFill();
addChild(bg);

function resizeHandler(e:Event=null):void 
{
 trace("dimensions are: " + stage.stageWidth + " x " + stage.stageHeight);
 bg.graphics.clear();

 bg.graphics.beginBitmapFill(bgData, null, true, false);
 bg.graphics.drawRect( 0, 0, 80, stage.stageHeight);

 bg.graphics.endFill();
}

спасибо всем, извините за эту потенциальную трату пространства.

1 голос
/ 02 ноября 2010

Поскольку Sprite изменяет размеры своего содержимого, вы можете использовать Shape для изменения размера Sprite. Изменение размера фигуры эффективно изменит размер спрайта без изменения размера других детей спрайта.


var bg:Sprite = new Sprite();
addChild( bg );

var fill:Shape = new Shape();
//you can make the fill transparent
with( fill )
{
   graphics.beginFill( 0 , 0 );
   graphics.drawRect( 0 , 0 , anyWidth  , anhyHeight );
   graphics.endFill();
}
bg.addChild(fill);

//then add the fill that you want visible
var bgFill:Sprite = new Sprite();
//add the graphics here
bg.addChild(bgFill );


function resizeSprite(event:Event ):void
{
    // bgFill will not be resized
    fill.width = stage.stageWidth;
    fill.height = stage.stageHeight;
}

...