Показать сообщение отдельно
Старый 28.09.2010, 13:14
aintghost вне форума Посмотреть профиль Отправить личное сообщение для aintghost Найти все сообщения от aintghost
  № 9  
Ответить с цитированием
aintghost

Регистрация: Sep 2010
Сообщений: 5
Написал класс, который при запросе размеров спрайта будет выдавать фиксированные значения. Присвоил данный класс объекту sprite2, тем не менее, sprite1 по какой-то причине изменяет свою высоту до реальной высоты sprite2.

Код AS3:
package
{
	import flash.display.Sprite;
 
	public class UnresizableSprite extends Sprite
	{		
		private var _width: Number;
		private var _height: Number;
 
		public function UnresizableSprite(width: Number, height: Number): void
		{
			_width = width;
			_height = height;
		}
 
		public override function get width(): Number
		{
			return _width;
		}
 
		public override function get height(): Number
		{
			return _height;
		}
	}
}
Каким образом спрайт узнает размеры своих child?

Добавлено через 2 часа 53 минуты
У моей задачи есть 2 пути решения:

I.
1) Уточнить как Sprite определяют размеры child.
2) Подделать значения размеров при помощи расширения класса Sprite.
3) Присвоить новый класс sprite2.

Таким образом фактический размер sprite2 будет соответствовать данным на нем, а parent будет считать, что sprite2 меньше.


II.
Так как box (sprite0) реагирует на свойство height sprite1, то:

1) Уточнить как происходит изменение размеров Sprite из-за child.
2) При изменении размеров проверить, чтобы они не были вызваны sprite2.
3) Подделать значения размеров.
4) Присвоить новый класс sprite1.

Таким образом фактический размер sprite1 будет соответствовать данным на нем, но:

* В случае изменения размеров, вызванных sprite2 - parent (box (sprite0)) будет получать подделанное значение и не будет добавлять скролл. Данные, выходящие за ограничения размеров будут спрятаны при помощи mask или scrollRect непосредственно в sprite2.

* В случае изменения размеров, вызванных не sprite2, а другими child - box получит реальные размеры и будет добавлять скролл.

Второй способ уже реализован, так как уже известно, как box (sprite0) определяет размеры child, и подделать эти значения можно.
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.display.DisplayObject;
 
	public class UnresizableSprite extends Sprite
	{		
		private var _width: Number;
		private var _height: Number;
		private var _ignoreList: Array;
 
		public function UnresizableSprite(width: Number, height: Number): void
		{
			_width = width;
			_height = height;
		}
 
		public function set ingoreList(ignoreList: Array): void
		{
			_ignoreList = ignoreList;
		}
 
		override public function get width(): Number
		{
			return _width;
		}
 
		override public function get height(): Number
		{
			return _height;
		}
 
		override public function addChild(obj: DisplayObject): DisplayObject
		{
			if (!isIgnored(obj.name))
			{
				if (obj.x + obj.width > _width)
				{
					_width = obj.x + obj.width;
				}
 
				if (obj.y + obj.height > _height)
				{
					_height = obj.y + obj.height;
				}
			}
 
			return (super.addChild(obj));
		}
 
		private function isIgnored(name: String): Boolean
		{
			if (!_ignoreList)
				return false;
 
			var i: uint;
			var len: uint = _ignoreList.length;
 
			for (i = 0; i <= len - 1; i++)
				if (_ignoreList[i] == name)
					return true;
 
			return false;
		}
	}
}


Мне более импонирует первое решение - оно более логично, но, увы, пока не могу найти ответ на свой вопрос - как стандартный класс Sprite определяет размеры своих child?