|
|
|||||
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
Заливка Битмапой со Scale
Здравствуйте, помогите решить проблему. Нужно замостить спрайт, отрисованный через графикс, чтобы при скейле он не терял своего внешнего вида, а то начинает один кусок повторяющейся битмапы заезжать на другой, можно ли как нибудь обойти эту проблему?
|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Класс у меня масштабирует за счет увеличения ширины\высоты.. Это не правильно? я сегодня первый раз прочёл эту тему и задумался, а сейчас пролез в поиск и нечаянно наткнулся на тему, в которой вскользь затронули масштаб. |
|
|||||
У спрайта скейл или изменение размеров?
Пропорции при этом скейле меняются или остаются как есть? Если размеры базового спрайта неизменны то можно замостить битмапой как удобно, потом сфоткать в другую битмапу и уже не с замощенным фоном скейлить, а с одной картинкой на фоне. Проблема ваша из-за нечетных координат тайлов плитки. Надо сделать так чтоб этого не было.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Вообще я когда думал, для чего может понадобится класс масштабирования, то не задавался вопросом о "как будет", я делал, чтобы по всякому мог. Но наверное, он будет только bitmap увеличивать ширина\высота и так же с Graphics. Вот если я зарисовал десять спрайтов biginFill и потом самый главный контейнер буду увеличивать в ширину и высоту ( пропорционально ), отображение всё испортится?
Вот класс... Но он ужасен наверное 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; } } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Akopalipsis, обсуждается совсем другая проблема: масштабирование вектора, нарисованного с graphics.beginBitmapFill().
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Wolsh уж не знаю, намекаете ли Вы о "не правильно выбранной теме" или говорите, что biginFill и bitmap -ы , это не касается... Но вот про второе, я тоже так с утра подумал, но потом напал на тему, где Psycho Tiger, что при увеличение widt\height класса Graphics, его нужно перерисовывать. Вот тут то меня и вернуло сюда.
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Не касается. Речь о векторе, "затайленном" битмапдатой, то есть залитым ("покрытым плиткой") пикселями, а не ровным векторным цветом или градиентом. Проблема здесь не в масштабировании битмапа как такового, а в "стыках" между плитками-тайлами, которые при масштабировании ведут себя неудобно, образуя то щели между плитками, то наезды одних на другие. Перерисовывание вектора здесь предлагается для того, чтобы оставить битмапдату "как есть", изменяя только размер вектора, но не масштабируя заливку (а увеличивая соответственно количество плиток). Что, конечно же, не всегда подходит в конкретной задаче... Перерисовывание же обычного векторного вектора вместо масштабирования связано больше с сохранением надежного контроля за всевозможными вычислениями, основанными на размерах, когда приходится учитывать не только width и height, но и скейл. Поскольку затраты на перерисовку сопоставимы с затратами на масштабирование, проще и надежней перерисовать вектор и иметь его в реальном масштабе. Лично я всегда перерисовываю, даже особо не задумываясь, зачем)) Кроме того, замечание Тигры могло относится к какой-то конкретной ситуации, например изменения размеров кнопки со скругленными углами (например движок в скроллбаре, реагирующий на размер контента). Scale9Grid далеко не всегда радует бескосячностью.
__________________
Reality.getBounds(this); |
|
|||||
[+4 06.05.14]
|
Akopalipsis - класс жесть. Основной вопрос зачем? Это даже не велосипед, непонятно именно ЗАЧЕМ. Для масштабирования никаких секретных оберток не делается, все спокойно решается нативом.
__________________
Марк Tween |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Wolsh Спасибо!
Добавлено через 1 минуту Цитата:
Добавлено через 6 минут Тут масштаб от указанной точки, расчет границ, не показывает пустоту, фрайм по времени, скорость масштабирования каждого направления, изменение координат с учетом всего и ещё подгон под настоящие координаты и размеры. Как это можно сделать лучше? Добавлено через 7 минут я бы рад был посмотреть на тоже самое, но правильно. |
Часовой пояс GMT +4, время: 14:48. |
|
« Предыдущая тема | Следующая тема » |
|
|