Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Заливка Битмапой со Scale (http://www.flasher.ru/forum/showthread.php?t=205051)

Isfet 16.11.2013 17:25

Заливка Битмапой со Scale
 
Здравствуйте, помогите решить проблему. Нужно замостить спрайт, отрисованный через графикс, чтобы при скейле он не терял своего внешнего вида, а то начинает один кусок повторяющейся битмапы заезжать на другой, можно ли как нибудь обойти эту проблему?

caseyryan 16.11.2013 17:33

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

Akopalipsis 17.11.2013 00:36

Цитата:

надо каждый раз перерисовывать графикс при изменении размеров спрайта. И лучше размеры менять не через скейл, а так же просто менять границы прямоугольника заливки
Меня эти слова немного расстроили, только недавно закончил со масштабированием, которое не так просто мне далось. И сейчас я пребываю в подвешенном состоянии, потому что точно не уверен, в правильности своего класса. По этому два вопроса - когда скалируешь Bitmap её нужно перерисовывать? И когда скалируешь вектор, его нужно перерисовывать заново? Вектором я Graphics назвал.
Класс у меня масштабирует за счет увеличения ширины\высоты.. Это не правильно? я сегодня первый раз прочёл эту тему и задумался, а сейчас пролез в поиск и нечаянно наткнулся на тему, в которой вскользь затронули масштаб.

Dukobpa3 17.11.2013 00:49

У спрайта скейл или изменение размеров?
Пропорции при этом скейле меняются или остаются как есть?

Если размеры базового спрайта неизменны то можно замостить битмапой как удобно, потом сфоткать в другую битмапу и уже не с замощенным фоном скейлить, а с одной картинкой на фоне.

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

Akopalipsis 17.11.2013 00:58

Вообще я когда думал, для чего может понадобится класс масштабирования, то не задавался вопросом о "как будет", я делал, чтобы по всякому мог. Но наверное, он будет только bitmap увеличивать ширина\высота и так же с Graphics. Вот если я зарисовал десять спрайтов biginFill и потом самый главный контейнер буду увеличивать в ширину и высоту ( пропорционально ), отображение всё испортится?
Вот класс... Но он ужасен наверное :)
Код AS3:

package 
{
        import a_test.IAnimator;
        import a_test.IScaleCenter;
        import flash.events.EventDispatcher;
        import flash.display.DisplayObject;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        /**
        * IScaleCenter - интерфейс служит дополнительным типом
        * IAnimator - интерфейс содержит метод advanceTime(time:Number):void
        */

        public class ScaleContainer  extends EventDispatcher implements IScaleCenter,IAnimator
        {
                private var _object:DisplayObject;
                private var _point:Point;
                private var _bounding:Rectangle;
 
                private var _factorWidth:Number;
                private var _factorHeight:Number;
 
                private var _defaultWidth:Number;
                private var _defaultHeight:Number;
 
                private var _finishWidth:Number;
                private var _finishHeight:Number;
 
                private var _speedWidth:Number;
                private var _speedHeight:Number;
 
                private var _speedX:Number;
                private var _speedY:Number;
 
                private var _finishX:Number;
                private var _finishY:Number;
 
                private var _offsetWidth:Number;
                private var _offsetHeight:Number;
 
                private var _offsetX:Number;
                private var _offsetY:Number;
 
                private var _moreWidth:Boolean;
                private var _lessWidth:Boolean;
 
                private var _moreHeight:Boolean;
                private var _lessHeight:Boolean;
 
                private var _moreX:Boolean;
                private var _lessX:Boolean;
 
                private var _moreY:Boolean;
                private var _lessY:Boolean;
 
                private var _isWidth:Boolean;
                private var _isHeight:Boolean;
 
                private var _isX:Boolean;
                private var _isY:Boolean;
 
 
 
                public function ScaleContainer()
                {
 
                }
                public function add(object:DisplayObject,
                                                                                  scaleX:Number = 1.0,
                                                                                  scaleY:Number = 1.0,
                                                                                  speedX:Number = 1.0,
                                                                                  speedY:Number = 1.0,
                                                                                  point:Point = null,
                                                                                  bounding:Rectangle=null):ScaleContainer
                {
                        if (!_object)
                        {
                                _object = object;
                                _defaultWidth = _object.width;
                                _defaultHeight = _object.height;
                                _bounding = bounding;
 
                                //коэфициент размеров ( 1% от размеров по умолчанию )
                                _factorWidth = _defaultWidth / 100;
                                _factorHeight = _defaultHeight / 100;
                        }
                        if (!point)
                        {
                                _point = new Point();
                                _point.x = _object.width / 2 + _object.x;
                                _point.y = _object.height / 2 + _object.y;
                        }
                        else
                        {
                                _point = point;
                        }
 
                        _moreWidth = false;
                        _lessWidth = false;
                        _moreHeight = false;
                        _lessHeight = false;
                        _moreX = false;
                        _lessX = false;
                        _moreY = false;
                        _lessY = false;
                        _isWidth = false;
                        _isHeight = false;
                        _isX = false;
                        _isY = false;
 
                        _finishWidth = _defaultWidth * scaleX;
                        _finishHeight = _defaultHeight * scaleY;
 
                        //коэфициент скорости ( 1% скорости )
                        var factorSpeedX:Number = speedX * 1000 / 100;
                        var factorSpeedY:Number = speedY * 1000 / 100;
 
                        //разница между текущеми и финишными размерами
                        var differenceWidth:Number = _finishWidth - _object.width;
                        var differenceHeight:Number = _finishHeight - _object.height;
 
                        //время которое будет затрачено на увеличение
                        var timeScaleWidth:Number = differenceWidth / _factorWidth * factorSpeedX;
                        var timeScaleHeight:Number = differenceHeight / _factorHeight * factorSpeedY;
 
                        //если время отрицательное делаем его положительным
                        if (timeScaleWidth < 0) timeScaleWidth *= -1;
                        if (timeScaleHeight < 0) timeScaleHeight *= -1;
 
                        _speedWidth = differenceWidth / timeScaleWidth;
                        _speedHeight = differenceHeight / timeScaleHeight;
 
                        //узнаем разницу между выбранной точкой и координатами обьекта
                        var shiftX:Number = _point.x -_object.x;
                        var shiftY:Number = _point.y - _object.y;
 
                        //вычитаемое - растояние, уменьшив на которое значение координат обьекта, получим финишные координаты
                        var subtrahendX:Number = shiftX - _finishWidth / (_object.width / shiftX);
                        var subtrahendY:Number = shiftY - _finishHeight / (_object.height / shiftY);
 
                        _finishX = _object.x + subtrahendX;
                        _finishY = _object.y + subtrahendY;
 
                        if (_bounding)
                        {
                                if (_finishX > _bounding.x)_finishX = _bounding.x;
                                if (_finishY > _bounding.y)_finishY = _bounding.y;
                                if (_finishX < _bounding.x - (_finishWidth - _defaultWidth))_finishX = _bounding.x - (_finishWidth - _defaultWidth);
                                if (_finishY < _bounding.y - (_finishHeight - _defaultHeight))_finishY = _bounding.y - (_finishHeight - _defaultHeight);
                        }
 
                        _speedX = (_finishX - _object.x) / timeScaleWidth;
                        _speedY = (_finishY - _object.y) / timeScaleHeight;
 
                        _offsetWidth = _object.width;
                        _offsetHeight = _object.height;
                        _offsetX = _object.x;
                        _offsetY = _object.y;
 
                        if (_finishWidth >= _object.width)_moreWidth = true;
                        else _lessWidth = true;
                        if (_finishHeight >= _object.height)_moreHeight = true;
                        else _lessHeight = true;
                        if (_finishX >= _object.x)_moreX = true;
                        else _lessX = true;
                        if (_finishY >= _object.y)_moreY = true;
                        else _lessY = true;
 
                        return this;
                }
                public function restart():void
                {
                        //
                }
                private function state():void
                {
                        if (_isWidth && _isHeight && _isX && _isY)
                        {
                                //сли мы тут, то масштабирование закончено 
                        }
                }
                /* INTERFACE a_test.IAnimator */
                public function advanceTime(time:Number):void
                {
                        _offsetWidth += time * _speedWidth;
                        if (_moreWidth)
                        {
                                if (_offsetWidth >= _finishWidth)
                                {
                                        _offsetWidth = _finishWidth;
                                        _isWidth = true;
                                        this.state();
                                }
                        }
                        else
                        {
                                if (_offsetWidth <= _finishWidth)
                                {
                                        _offsetWidth = _finishWidth;
                                        _isWidth = true;
                                        this.state();
                                }
                        }
                        _object.width = _offsetWidth;
 
                        _offsetHeight += time * _speedHeight;
                        if (_moreHeight)
                        {
                                if (_offsetHeight >= _finishHeight)
                                {
                                        _offsetHeight = _finishHeight;
                                        _isHeight = true;
                                        this.state();
                                }
                        }
                        else
                        {
                                if (_offsetHeight <= _finishHeight)
                                {
                                        _offsetHeight = _finishHeight;
                                        _isHeight = true;
                                        this.state();
                                }
                        }
                        _object.height = _offsetHeight;
                        _offsetX += time * _speedX;
                        if (_moreX)
                        {
                                if (_offsetX >= _finishX)
                                {
                                        _offsetX = _finishX;
                                        _isX = true;
                                        this.state();
                                }
                        }
                        else
                        {
                                if (_offsetX <= _finishX)
                                {
                                        _offsetX = _finishX;
                                        _isX = true;
                                        this.state();
                                }
                        }
                        _object.x = _offsetX;
                        _offsetY += time * _speedY;
                        if (_moreY)
                        {
                                if (_offsetY >= _finishY)
                                {
                                        _offsetY = _finishY;
                                        _isY = true;
                                        this.state();
                                }
                        }
                        else
                        {
                                if (_offsetY <= _finishY)
                                {
                                        _offsetY = _finishY;
                                        _isY = true;
                                        this.state();
                                }
                        }
                        _object.y = _offsetY;
                }
                override public function toString():String
                {
                        return '[ScaleCenter] width - ' + _object.width + ' height - ' + _object.height + ' x - ' + _object.x + ' y - ' + _object.y;
                }
        }
 
}


Wolsh 17.11.2013 01:15

Akopalipsis, обсуждается совсем другая проблема: масштабирование вектора, нарисованного с graphics.beginBitmapFill().

Akopalipsis 17.11.2013 01:20

Wolsh уж не знаю, намекаете ли Вы о "не правильно выбранной теме" или говорите, что biginFill и bitmap -ы , это не касается... Но вот про второе, я тоже так с утра подумал, но потом напал на тему, где Psycho Tiger, что при увеличение widt\height класса Graphics, его нужно перерисовывать. Вот тут то меня и вернуло сюда.

Wolsh 17.11.2013 01:35

Не касается. Речь о векторе, "затайленном" битмапдатой, то есть залитым ("покрытым плиткой") пикселями, а не ровным векторным цветом или градиентом. Проблема здесь не в масштабировании битмапа как такового, а в "стыках" между плитками-тайлами, которые при масштабировании ведут себя неудобно, образуя то щели между плитками, то наезды одних на другие. Перерисовывание вектора здесь предлагается для того, чтобы оставить битмапдату "как есть", изменяя только размер вектора, но не масштабируя заливку (а увеличивая соответственно количество плиток). Что, конечно же, не всегда подходит в конкретной задаче... Перерисовывание же обычного векторного вектора :) вместо масштабирования связано больше с сохранением надежного контроля за всевозможными вычислениями, основанными на размерах, когда приходится учитывать не только width и height, но и скейл. Поскольку затраты на перерисовку сопоставимы с затратами на масштабирование, проще и надежней перерисовать вектор и иметь его в реальном масштабе. Лично я всегда перерисовываю, даже особо не задумываясь, зачем)) Кроме того, замечание Тигры могло относится к какой-то конкретной ситуации, например изменения размеров кнопки со скругленными углами (например движок в скроллбаре, реагирующий на размер контента). Scale9Grid далеко не всегда радует бескосячностью.

in4core 17.11.2013 01:42

Akopalipsis - класс жесть. Основной вопрос зачем? Это даже не велосипед, непонятно именно ЗАЧЕМ. Для масштабирования никаких секретных оберток не делается, все спокойно решается нативом.

Akopalipsis 17.11.2013 01:44

Wolsh Спасибо!

Добавлено через 1 минуту
Цитата:

Akopalipsis - класс жесть. Основной вопрос зачем?
Жесть!) Но работает как карты яндекс :)

Добавлено через 6 минут
Тут масштаб от указанной точки, расчет границ, не показывает пустоту, фрайм по времени, скорость масштабирования каждого направления, изменение координат с учетом всего и ещё подгон под настоящие координаты и размеры. Как это можно сделать лучше?

Добавлено через 7 минут
я бы рад был посмотреть на тоже самое, но правильно.


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

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