Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.11.2013, 17:25
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 1  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
По умолчанию Заливка Битмапой со Scale

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

Старый 16.11.2013, 17:33
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 2  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
надо каждый раз перерисовывать графикс при изменении размеров спрайта. И лучше размеры менять не через скейл, а так же просто менять границы прямоугольника заливки

Старый 17.11.2013, 00:36
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 3  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

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

Старый 17.11.2013, 00:49
Dukobpa3 вне форума Посмотреть профиль Отправить личное сообщение для Dukobpa3 Найти все сообщения от Dukobpa3
  № 4  
Ответить с цитированием
Dukobpa3
 
Аватар для Dukobpa3

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
У спрайта скейл или изменение размеров?
Пропорции при этом скейле меняются или остаются как есть?

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

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

Старый 17.11.2013, 00:58
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 5  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Вообще я когда думал, для чего может понадобится класс масштабирования, то не задавался вопросом о "как будет", я делал, чтобы по всякому мог. Но наверное, он будет только 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;
		}
	}
 
}

Старый 17.11.2013, 01:15
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Akopalipsis, обсуждается совсем другая проблема: масштабирование вектора, нарисованного с graphics.beginBitmapFill().
__________________
Reality.getBounds(this);

Старый 17.11.2013, 01:20
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 7  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

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

Старый 17.11.2013, 01:35
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Не касается. Речь о векторе, "затайленном" битмапдатой, то есть залитым ("покрытым плиткой") пикселями, а не ровным векторным цветом или градиентом. Проблема здесь не в масштабировании битмапа как такового, а в "стыках" между плитками-тайлами, которые при масштабировании ведут себя неудобно, образуя то щели между плитками, то наезды одних на другие. Перерисовывание вектора здесь предлагается для того, чтобы оставить битмапдату "как есть", изменяя только размер вектора, но не масштабируя заливку (а увеличивая соответственно количество плиток). Что, конечно же, не всегда подходит в конкретной задаче... Перерисовывание же обычного векторного вектора вместо масштабирования связано больше с сохранением надежного контроля за всевозможными вычислениями, основанными на размерах, когда приходится учитывать не только width и height, но и скейл. Поскольку затраты на перерисовку сопоставимы с затратами на масштабирование, проще и надежней перерисовать вектор и иметь его в реальном масштабе. Лично я всегда перерисовываю, даже особо не задумываясь, зачем)) Кроме того, замечание Тигры могло относится к какой-то конкретной ситуации, например изменения размеров кнопки со скругленными углами (например движок в скроллбаре, реагирующий на размер контента). Scale9Grid далеко не всегда радует бескосячностью.
__________________
Reality.getBounds(this);

Старый 17.11.2013, 01:42
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 9  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Akopalipsis - класс жесть. Основной вопрос зачем? Это даже не велосипед, непонятно именно ЗАЧЕМ. Для масштабирования никаких секретных оберток не делается, все спокойно решается нативом.
__________________
Марк Tween

Старый 17.11.2013, 01:44
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 10  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Wolsh Спасибо!

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

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

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 14:48.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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