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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.11.2014, 23:21
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 11  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
1) import это не include, он не добавляет код импортируемого, смешивая его с текущим кодом. В AS3 используется концепция Объектно-ориентированного программирования, базирующаяся на понятии Объект. То есть код разделен на модули-объекты, каждый из которых имеет свою собственную Ответственность, определяемую кодом, который оформлен в Класс. То есть Класс — это код, который может быть выделен (абстрагирован) в отдельный набор свойств и методов, связанных по смыслу и прямо взаимодействующих для решения неких конкретных задач. Так вот импорт импортирует такие Классы, законченные осмысленные оформленные по правилам модули, а не просто строки кода или отдельные команды.Сама по себе директива import всего-лишь указывает компилятору, где найти текстовый файл с описанием конкретного Класса, который программа собирается использовать. Чтобы использовать Класс, программа должна создать его Экземпляр с помощью команды new. То есть Вы заявляете компилятору: "я буду здесь использовать класс животные.млекопитающие.ЧеловекРазумный". Если далее в коде компилятор встречает что-то типа var Петя:ЧеловекРазумный = new ЧеловекРазумный(); то он знает, где найти класс для создания этого экземпляра — в пакете "животные" есть пакет "млекопитающие", а в нем нужный Класс ЧеловекРазумный. Но если, просмотрев код программы перед компиляцией, компилятор ни разу не встретит использование класса, заявленного в импорте, он даже не станет включать его код в конечныйй файл swf — зачем, если класс не используется? В Вашем случае такой класс — SampleCode. Он нигде в коде не используется.
2) Вероятно, часть действий скрыта от меня, так как Вы используете код в кадрах (что вообще-то в AS3 не принято, хотя и допустимо для простых вещей вроде банера), и, возможно, добавляете экземпляр SampleCode "руками" на таймлайн. Однако, что дальше? Из своего menu Вы пытаетесь обращаться к root.nameB, но ведь у root, то есть класса основной флэшки, нет такого свойства — оно есть у класса SampleCode, а его экземпляр — не root.
3) При оформлении Класса требуется указывать модификатор доступа перед объявлением метода и тип возвращаемого методом значения, то есть в Вашем случае не "function functionBat1()", а " public function functionBat1():void". Если модификатор не указан, он автоматически считается как internal, а не public, и тогда методы "видны" только для классов из этого же пакета.
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 04.11.2014 в 00:07.
Старый 05.11.2014, 23:25
Маргарита62 вне форума Посмотреть профиль Отправить личное сообщение для Маргарита62 Найти все сообщения от Маргарита62
  № 12  
Ответить с цитированием
Маргарита62

Регистрация: Nov 2014
Сообщений: 10
Ага, с первым понятно, спасибо. Просто где-то нашла, что так нужно свой созданный класс добавлять в файл. А так я вписала в поле на панели Свойства/ Опубликовать/ Класс: SampleCode - у обоих файлов.
На счет того, где писать код - наша "система образования" учит нас писать в кадрах, про создание классов речи и не шло, поэтому вот и пытаюсь информацию по кусочкам собрать..
Так вот, возвращаясь к проблеме:
public function functionBat1():void - я исправила и осознала, спасибо.
Какая должна быть система происходящего? Как я понимала: файл main прослушивает событие щелчка мышью по кнопке, к примеру, but1. Как только событие наступает, файл обращается к добавленному к нему классу SampleCode и вызывает функцию functionBat1()(запоминает значение выбранной кнопки) и подгружает файл menu. А далее, в соответствии с моей плохой логикой, поскольку к файлу menu добавлен тот же самый класс SampleCode, он может считать уже новое значение переменной nameB.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну вот, поскольку Вам про Классы не давали, будет непросто объяснить...))
Есть Класс, и есть его экземпляр. Петя — экземпляр класса ЧеловекРазумный. То есть класс — нечто более общее, можно сказать Шаблон, или Чертеж, по которому штампуются одинаковые детали - экземпляры. У экземпляров есть все признаки общего класса, и никаких других нет. Однако значения этих признаков (свойств) могут быть индивидуальны — например экземпляры класса Прямоугольник имеют высоту и ширину, но у разных экземпляров значения высоты и ширины могут быть разные. У самого Класса Прямоугольник нет высоты и ширины. Неважно, на каком формате бумаги напечатан чертеж. Чертеж не обладает свойствами детали, которую он описывает. Однако у чертежа как объекта тоже есть свои свойства — есть они и у классов (не у всех). Такие свойства называются статические. Например, MouseEvent.CLICK это статическое свойство CLICK класса MouseEvent. Не экземпляров класса, а именно самого класса.
Цитата:
наша "система образования" учит нас писать в кадрах, про создание классов речи и не шло
Тот код, который Вы пишете "в кадре", при компиляции сама программа Adobe Flash преобразует в Класс. Все ваши функции оформляются как методы экземпляра, объявления переменных остаются в теле класса, а все действия, не оформленные в функции, собираются в функцию-конструктор. Таким образом ваш код в первом кадре превращается в класс Документа (принято называть его Main). И, по сути, ваш swf-файл это экземпляр [автоматически созданного] класса Main, наследующего класс MovieClip или Sprite. И вот этот экземпляр, основной контейнер для всех объектов в вашем приложении, является для них root, то есть корневой [контейнер]. В какой бы норе не сидел суслик, в конечном итоге он все-равно находится в этой Вселенной. И для подгружаемого извне ролика, после размещения того в Списке Отображения экземпляра класса Main в любом контейнере, свойство root будет указывать именно на этот экземпляр класса Main.
Так вот, если у вас "в кадре" основной флэшки не объявлена переменная var nameB, то такого свойства у root просто нет. Оно есть у экземпляра SampleCode.
А зачем Вы создавали этот класс, если Вас такому не учат? )) Почему не поместили обработчики нажатия кнопок просто в первый кадр? И теперь вынуждены читать весь этот выходящий за рамки школьной программы ..текст.
__________________
Reality.getBounds(this);

Старый 06.11.2014, 01:51
Маргарита62 вне форума Посмотреть профиль Отправить личное сообщение для Маргарита62 Найти все сообщения от Маргарита62
  № 14  
Ответить с цитированием
Маргарита62

Регистрация: Nov 2014
Сообщений: 10
просто по моей задумке курсового проекта есть определенный момент:
на форме имеется 12 кнопок, обозначающих разделы рецептов выпечки: пироги, кексы, булочки, пирожки и т.д.
Соответственно, имеется прослушиватель клика для каждой кнопки. При нажатии на кнопку переменная vibrRazdel присваивает значение имени выбранной кнопки
Код AS3:
vibrRazdel = event.currentTarget.name;
и в компонент ScrollPane загружается одноименный swf-файл со списком рецептов
Код AS3:
scroll.source = vibrRazdel+".swf";
и того, у меня имеется файл с кнопками и 12 подгружаемых swf, которые, по сути, выполняют одни и те же функции - подгружают из xml-документа текст рецептов для выбранного раздела и картинки.
К примеру, выбираем кнопку пирожки - в scroll подгружаются рецепты пирожков с картинками и прочей ерундой.
Т.е. в идеале было бы сделать файл с кнопками и один подгружаемый файл, в который передается значение переменной vibrRazdel и уже в зависимости от значения переменной будут подгружаться те или иные рецепты.

Добавлено через 7 минут
просто после сообщения от КорДум про интерфейсы я начала изучать этот вопрос и в итоге в конец запуталась что можно сделать в подобной ситуации

Добавлено через 12 минут
И, опять же, вы мне написали про то, что переменная должна быть public, а public может быть ведь только внутри пакета...так у меня каша и смешалась между классами и кодом в кадрах =D
Спасибо за приведенную доходчивую информацию о классах, теперь более-менее представление имею


Последний раз редактировалось Маргарита62; 07.11.2014 в 21:55.
Старый 06.11.2014, 06:09
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 15  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Как-то так
Код AS3:
package  
{
 
	import flash.display.MovieClip;
	import flash.display.Loader;
	import flash.net.URLRequest;
	import flash.events.Event;
 
	public class Main extends MovieClip
	{
		private var _source:IBridge;
 
		public function Main(){
 
			startLoading('LoadMain.swf');
		}
 
		private function startLoading(url:String):void {
		trace('start');
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler);
			loader.load(new URLRequest(url));
		}
		private function loadHandler(e:Event):void {
			e.target.removeEventListener(Event.COMPLETE, loadHandler);
			_source = e.target.content as IBridge;
			_source.addEventListener( VARS_EVENT.TRANSMITTER_REPORT, dataRecievedHandler );
 
			testCall()
		}
 
		private function testCall():void {
			_source.functionBat1();
			_source.functionBat1();
			_source.dataTransmitter('var1');
		}
 
		private function dataRecievedHandler(e:Event):void{
			trace('Загруженный ролик получил данные');
		}
	}	
}
Код AS3:
package  {
 
	import flash.events.IEventDispatcher;
 
	public interface IBridge extends IEventDispatcher{
 
		// Interface methods:
		function functionBat1():void
 
		function functionBat2():void
 
		function dataTransmitter(sendData:*=null):void
	}
 
}
Код AS3:
package  {
 
	import flash.display.MovieClip;
	import flash.events.Event;
 
 
	public class LoadMain extends MovieClip implements IBridge{
 
		public var nameB:String;
 
		public function LoadMain() {
			// constructor code
		}
 
		public function functionBat1():void
		{
			nameB = "but1"; 
			trace(nameB );
			transmitterReport();
		}
 
		public function dataTransmitter(sendData:*=null):void{
 
			transmitterReport();
		}
 
		private function transmitterReport():void {
 
			dispatchEvent( new Event(VARS_EVENT.TRANSMITTER_REPORT));
		}
 
		public function functionBat2():void
		{
			nameB = "but2"; 
			trace(nameB );
			transmitterReport();
		}
	}
 
}
Код AS3:
package  {
 
	public class VARS_EVENT {
 
		public static var TRANSMITTER_REPORT:String = 'dataReport';
 
		public function VARS_EVENT() {
			// constructor code
		}
 
	}
 
}
Вложения
Тип файла: zip SWFBridge.zip (9.2 Кб, 29 просмотров)
__________________
return this...

Старый 06.11.2014, 06:31
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 16  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
если нужно получать данные в ролике родители, диспачте DataEvent передавая объекты через свойство data, обработав их JSON'оном.

Код AS3:
dispatchEvent( new DataEvent(VARS_EVENT.TRANSMITTER_REPORT, false,false, JSON.stringify( {var1:'value1'} ) );
__________________
return this...

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Т.е. в идеале было бы сделать файл с кнопками и один подгружаемый файл, в который передается значение переменной vibrRazdel и уже в зависимости от значения переменной будут подгружаться те или иные рецепты.
Так и не понял, зачем нужен подгружаемый файл, даже один (не считая XML с рецептами, конечно). Почему нельзя подгружать XML в основную флэшку?
__________________
Reality.getBounds(this);

Старый 06.11.2014, 20:24
Маргарита62 вне форума Посмотреть профиль Отправить личное сообщение для Маргарита62 Найти все сообщения от Маргарита62
  № 18  
Ответить с цитированием
Маргарита62

Регистрация: Nov 2014
Сообщений: 10
Wolsh, там же не просто текст, но и кнопочки, картинки. а рецептов может быть много, поэтому нужна полоса прокрутки, поэтому грузится в ScrollBar

Добавлено через 20 минут
AlexCooper, спасибо большое! осталось только разобраться
не думала, что в AS3 будет так сложно осуществить подобное действие.

Старый 06.11.2014, 23:04
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 19  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Цитата:
не думала, что в AS3 будет так сложно осуществить подобное действие.
Маргарита62, можно сделать проще использовав callBack
Код AS3:
пример главного
package  
{
	import flash.display.*; import flash.events.*; import flash.system.*; 
	import flash.ui.*; import flash.utils.*; import flash.sampler.*; 
	import flash.net.*; import flash.media.*; import flash.net.*; 
	import flash.external.*; import flash.text.*;
	import flash.geom.*;
 
	/**
	 * ...
	 * @author Lexcuk
	 */
	public class DadDoc extends Sprite
	{
		public var htmStr:String = '';
		public var childrenObject:Object;
		public var hrefTxt:TextField;
		public var loader:Loader;
		public var request:URLRequest;
		public function DadDoc() 
		{
			addChild(hrefTxt = new TextField());
			hrefTxt.scaleX = hrefTxt.scaleY = 1.4;
			hrefTxt.autoSize = TextFieldAutoSize.LEFT;
			htmStr = 'DAD\n';
 
 
			htmStr +=  addStrHref('Load Masha');
			htmStr +=  addStrHref('Load Sasha');
			hrefTxt.htmlText = htmStr;
			hrefTxt.addEventListener("link", txtNavHandler);
		}
 
		private function txtNavHandler(e:TextEvent):void {
			if (e.text == 'Load Masha') {
				loader = new Loader();
				loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler);
				loader.load(request = new URLRequest('Masha.swf'))
			}
			if (e.text == 'Load Sasha') {
				loader = new Loader();
				loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderCompleteHandler);
				loader.load(request = new URLRequest('Sasha.swf'))
			}
		}
 
		public function loaderCompleteHandler(e:Event):void {
			hrefTxt.htmlText = htmStr + '\n загрузилось ' + request.url;
			if (childrenObject != null) removeChild(childrenObject as DisplayObject);
			childrenObject = loader.content;
			addChild(loader.content);
			loader.content.y = 100;
			childrenObject['dadCall'] = dadCall;
		}
 
		public function dadCall(childStr:String):void {
			hrefTxt.htmlText = htmStr + '\n' + childStr;
		}
 
		public function addStrHref(str:String, delimStr:String = ' | '):String {
			return "<a href='event:" + str + "'><u>" + str + "</u>"+delimStr;
		}
 
	}
 
}
Пример загружаемого
Код AS3:
package  
{
	import flash.display.*; import flash.events.*; import flash.system.*; 
	import flash.ui.*; import flash.utils.*; import flash.sampler.*; 
	import flash.net.*; import flash.media.*; import flash.net.*; 
	import flash.external.*; import flash.text.*;
	import flash.geom.*;
 
	/**
	 * ...
	 * @author Lexcuk
	 */
	public class ChildrenDoc extends Sprite
	{
		public var htmStr:String = '';
		public var childrenObject:Object;
		public var dad:Object;
		public var dadCall:Function;
		public var hrefTxt:TextField;
		public function ChildrenDoc() 
		{
			addChild(hrefTxt = new TextField());
			hrefTxt.scaleX = hrefTxt.scaleY = 1.4;
			hrefTxt.autoSize = TextFieldAutoSize.LEFT;
 
			htmStr = '<FONT FACE="Times New Roman" SIZE="12" COLOR="#FF0080" >I am Sasha!!!  ';
 
			htmStr +=  addStrHref('Hello DAD');
			hrefTxt.htmlText = htmStr;
			hrefTxt.addEventListener("link", txtNavHandler);
		}
 
 
		private function txtNavHandler(e:TextEvent):void {
			if (e.text == 'Hello DAD') {
				if (dadCall != null) dadCall("Sasha hi, Dad says nice to see you again!!!");
			}
		}
 
		public function addStrHref(str:String, delimStr:String = ' | '):String {
			return "<a href='event:" + str + "'><u>" + str + "</u>"+delimStr;
		}
 
	}
 
}
Нажимая на ссылки в текстовом поле Папы, можно загрузить разных детей. Папа поставит им callback и можно запускать папыны функции, если есть FlashDevelop программа можете глянуть демо в архиве.
Вложения
Тип файла: zip DadSayHelloAs3.zip (8.0 Кб, 21 просмотров)
__________________
Гоночка

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
"Проще можно сделать", если делать в соответствии с ООП, для которого AS3 и заточен, а не через аномальное отверстие. Что мешает после загрузки плагина передать ему привет от "папы" или вызвать его, подгруженного ребенка, метод? Зачем ребенку воровать у папы [деньги], если папа может сам ему дать всё, что необходимо?
Мда.. "Папе", конечно, для этого нужно знать, что этот подброшенный ребенок — его. Тут хорошо бы ввести Интерфейс... Только Интерфейс не папы, а ребенка.
__________________
Reality.getBounds(this);

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

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

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


 


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


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