Показать сообщение отдельно
Старый 24.11.2009, 16:38
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 9  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Код в кадрах писать можно, но нежелательно, если вы хотите делать что-нибудь более-менее серъёзное.

Классы подключать очень просто. Попробуйте:

Код AS3:
package {
	import flash.text.TextFormat;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextField;
	import flash.display.MovieClip;
 
	/**
	 * Основной класс документа (Document Class).
	 * Является потомком MovieClip. Это значит, что любой объект этого класса будет иметь
	 * те же свойства и методы, что и MovieClip, плюс те, которые определите вы. Также это
	 * значит, что с любым объектом этого класса можно обращаться, как с объектом MovieClip.
	 */
	public class MainClass extends MovieClip {
 
		/**
		 * Закрытое свойство. Доступ к нему будет возможен только изнутри этого класса.
		 */
		private var did_field:TextField;
 
		/**
		 * Конструктор класса. Вызывается при создании экземпляра класса (в нашем случае –
		 * при запуске флешки).
		 */
		public function MainClass() {
			//создаём текстовое поле
			did_field = new TextField();
			did_field.defaultTextFormat = new TextFormat('_sans', 14);
			did_field.selectable = false;
			did_field.autoSize = TextFieldAutoSize.LEFT;
			did_field.x = did_field.y = 20;
 
			//добавляем его в контейнер (аналогично помещению на рабочую область в Flash IDE)
			addChild(did_field);
 
			//пользуемся методом-сеттером для установки текста поля.
			fieldText = 'Текст поля did_field';
		}
 
		/**
		 * Метод-геттер. Позволяет получить текст поля.
		 * Ключевое слово public означает, что доступ к свойству fieldText для чтения
		 * можно будет получить извне.
		 */
		public function get fieldText():String{
			return did_field.text;
		}
 
		/**
		 * Метод-геттер. Позволяет установить текст поля.
		 * Ключевое слово public означает, что доступ к свойству fieldText для записи
		 * можно будет получить извне.
		 */
		public function set fieldText(value:String):void {
			did_field.text = value;
		}
 
	}
}
Этот текст задаёт Document Class – основной класс документа. Его нужно сохранить в файл "MainClass.as". Далее создайте в той же папке .fla - файл, и пропишите в поле "Class" имя основного класса – MainClass. После запуска флешки будет создано текстовое поле, и ему будет установлен текст.

К экземпляру класса обращаться можно, как к любой другой переменной (точнее, любая переменная во флеше на самом деле хранит ссылку на экземпляр какого-то класса, будь то String, MovieClip или TextField). Однако важно помнить, что для доступа к членам класса (свойствам и методам) переменная, хранящая ссылку на экземпляр, должна быть нужного типа.

Например, определим класс ColorRect:

Код AS3:
package {
	import flash.display.Sprite;
 
	/**
	 * Закрашенный прямоугольник.
	 */
	public class ColorRect extends Sprite {
 
		/**
		 * Конструктор.
		 */
		public function ColorRect() {
			super();
		}
 
		/**
		 * Закрашивает заданным цветом прямоугольник 50x50.
		 * 
		 * @param newColor:uint Цвет заполнения.
		 */
		public function fillBy(newColor:uint = 0xA2A2A2):void{
			with(graphics){
				clear();
				lineStyle(0, newColor);
				beginFill(newColor);
				drawRect(0, 0, 50, 50);
				endFill();
			}
		}
 
	}
}
Данный класс имеет публичный метод fillRect(). Сохраним этот класс в файле ColorRect.as в той же папке, что и MainClass.as. Изменим MainClass.as следующим образом:

Код AS3:
package {
	import flash.display.MovieClip;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
 
	/**
	 * Основной класс документа (Document Class).
	 */
	public class MainClass extends MovieClip {
 
		/**
		 * Закрытое свойство. Доступ к нему будет возможен только из этого класса.
		 */
		private var did_field:TextField;
 
		/**
		 * Конструктор класса. Вызывается при создании экземпляра класса (в нашем случае –
		 * при запуске флешки).
		 */
		public function MainClass() {
			//создаём текстовое поле
			did_field = new TextField();
			did_field.defaultTextFormat = new TextFormat('_sans', 14);
			did_field.selectable = false;
			did_field.autoSize = TextFieldAutoSize.LEFT;
			did_field.x = did_field.y = 20;
 
			//добавляем его в контейнер (аналогично помещению на рабочую область в Flash IDE)
			addChild(did_field);
 
			//пользуемся методом-сеттером для установки текста поля.
			fieldText = 'Текст поля did_field';
 
			var colorRect:ColorRect;
			//var colorRect:Sprite;
 
			//создаём экземпляр ColorRect
			colorRect = new ColorRect();
			colorRect.x = did_field.x - 5;
			colorRect.y = did_field.y - 5;
			colorRect.width = did_field.width + 10;
			colorRect.height = did_field.height + 10;
 
			//добавляем его в контейнер.
			addChildAt(colorRect, 0);
 
			//вызываем метод класса ColorRect.
			colorRect.fillBy(0x9EACE0);
		}
 
		/**
		 * Метод-геттер. Позволяет получить текст поля.
		 */
		public function get fieldText():String{
			return did_field.text;
		}
 
		/**
		 * Метод-геттер. Позволяет установить текст поля.
		 */
		public function set fieldText(value:String):void {
			did_field.text = value;
		}
 
	}
}
В конструкторе мы объявляем переменную типа ColorRect и присваиваем ей новый экземпляр класса ColorRect. Далее задаём его положение и добавляем в контейнер, а затем вызываем публичный метод, определённый в классе ColorRect.

Если же мы теперь вместо var colorRect:ColorRect напишем var colorRect:Sprite, то возникнет ошибка в строчке colorRect.fillBy(0x7285D1). Почему именно там? До этого всё будет нормально, так как ColorRect является потомком Sprite, и мы можем присвоить его переменной типа Sprite. Также можно пользоваться свойствами x, y, width и height, которые класс Sprite унаследовал от DisplayObject. А вот метод fillBy() в классе Sprite не определён, мы ведь его определили только в ColorRect. Поэтому, если объявить переменную как Sprite, то этот метод вызвать не удастся, несмотря на то, что он публичный. Однако можно в этом случае привести тип переменной: (colorRect as ColorRect).fillBy(0x7285D1), и всё пройдёт удачно, так как переменная colorRect на самом деле хранит экземпляр класса ColorRect.

Именно поэтому у вас и возникала ошибка с текстовым полем. Флеш при компиляции создаст класс, являющийся наследником DisplayObject, в котором будет свойство did_field типа TextField, так как вы добавили текстовое поле с этим именем на сцену. Экземпляром этого класса и будет являться объект root. Но к объекту в памяти мы можем обратиться только через переменную. А переменная (свойство) DisplayObject.root имеет тип DisplayObject, в котором свойство did_field не определено. Отсюда ошибка.


Последний раз редактировалось SamFR; 24.11.2009 в 16:43.