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

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

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
По умолчанию общение между классами и базовые концепции

Надо сделать такую штуку: появляется текстовое поле со словом (вариант ответа теста), оно таскается мышью, через 10 секунд исчезает и появляется следующее. За эти 10 с слово (если ответ верный) надо оттащить на мувик, который так или иначе среагирует.
С помощью советов форума, хелпа, О'Рейли и Гурского удалось сделать появление и исчезновение слов, и мышью они успешно таскаются.
Дальше картинку кораблика на сцене конвертирую в символ, класс назначаю "ship", базовый класс - flash.display.Sprite, instance name - caravella. Почему-то в Output всё равно считается MovieClip-ом. В ship.as создаю одноимённый класс, наследуя его от Sprite, импортирую и основной класс документа. В основной функции ship пытаюсь для начала оттрассировать hitTestObject каравеллы с объектом box из осн. класса документа (в нём сидит вариант ответа). Должно бы появиться "false", а появляется ругань на "possibly undefined variables". Проверял видимость переменных одного класса из другого в той же директории на более простых вещах (оттрассировать функцией одного класса переменную из другого) - то же самое. Всё объявлял "public". Ничего не понимаю! В хелпе и О'Рейли не смог найти объяснения, вроде, сказано, что если в публичном классе объявить публичную переменную или функцию, то её вполне можно прочитать в другом классе. Пожалуйста, если у кого найдётся время помотреть исходники и объяснить ошибки, сделайте это!
Я какие-то базовые понятия путаю? В php, например, переменные любого публичного класса можно (импортировав) прочитать и даже переопределить в любом же.
Исходники не могу загрузить. Вставляю код основного класса:
Код:
package 
{
	import flash.display.Sprite;
	import flash.text.*;
	import flash.events.MouseEvent;
	import flash.events.TimerEvent;
	import flash.utils.Timer;

	public class answers extends Sprite
	{
		var words:Array =[
		{val:"Гаити",flag:true},  
		{val:"Ньюфаундленд",flag:false},  
		{val:"Гренландия",flag:false},  
		{val:"Куба",flag:true},  
		{val:"Цейлон",flag:false},
		{val:"Великобритания",flag:false},  
		{val:"Ямайка",flag:true}, 
		{val:"Антарктида",flag:false},
		{val:"табак",flag:true},
		{val:"индейцы",flag:true},
		{val:"золото",flag:false},
		{val:"Тринидад",flag:true},
		{val:"Шпицберген",flag:false},
		{val:"мыс Дежнёва",flag:false},
		{val:"Амазонка",flag:false}
		  ];
		var i:int =0;// итератор слов
		// создаём 10-секундный таймер и поле отсчёта
		var timer:Timer = new Timer(1000, 10);
		var timerField:TextField=new TextField;
		// создаём клип-контейнер
		var box:Sprite=new Sprite;
		// создаем поле ответа
		var tf:TextField=new TextField;

		public function answers():void
		{
			//добавляем листенеры к таймеру
			timer.addEventListener(TimerEvent.TIMER, onTick);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
			// Перехватываем нажатие кнопки мыши
			box.addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown);
			// Отпускание мышки
			box.addEventListener(MouseEvent.MOUSE_UP,handleMouseUp);
			//Отпускание мышки за пределами флэшки
			box.addEventListener(MouseEvent.MOUSE_OUT,handleMouseUp);

			//запускаем первое слово
			newWord(i);
		}
		//собственно функция появления варианта ответа
		private function newWord(i):void
		{
			//запускаем таймер
			timer.reset();
			timer.start();
			//поле таймера
			timerField.x =450;
			timerField.text = "Осталось " + timer.repeatCount + " с.";
			addChild(timerField);
			//заполняем и форматируем поле ответа
			tf.autoSize=TextFieldAutoSize.LEFT;
			tf.selectable=false;
			tf.text=words[i].val;
			var format:TextFormat=new TextFormat;
			format.font="Verdana";
			format.size=16;
			format.bold=true;
			tf.setTextFormat(format);
			//выводим клип и суём туда текстовое поле
			box.x =10;
			box.y =10;
			addChild(box);
			box.addChild(tf);
		}
		//Функции Drag&Drop
		private function handleMouseDown(event:MouseEvent):void
		{
			box.startDrag();
		}
		private function handleMouseUp(event:MouseEvent):void
		{
			box.stopDrag();
		}
		//функции таймера
		private function onTick(event:TimerEvent):void
		{
			// показывает счётчик
			var t:int = event.target.repeatCount-event.target.currentCount;
			timerField.text="Осталось " + t + " с.";
		}
		private function onTimerComplete(event:TimerEvent):void
		{
			//клип-контейнер и счётчик исчезают
			removeChild(timerField);
			box.removeChild(tf);
			removeChild(box);
			//если не дошли до конца, сдвигаем итератор и запускаем следующее слово
			if (i < words.length-1) {
				i++;
				newWord(i);
			}

		}
	}
}
...и класса ship:
Код:
package 
{
	import flash.display.Sprite;
	import answers;
	public class ship extends Sprite
	{
		public function ship():void
		{
			trace(this.caravella.hitTestObject(answers.box));
		}
	}
}
Заранее благодарен, хотя, похоже, вакансию я уже пролохал

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
Граждане, это я такую каку написал, что отвечать противно, или что-то непонятно?

Старый 27.06.2007, 14:46
derhab вне форума Посмотреть профиль Отправить личное сообщение для derhab Найти все сообщения от derhab
  № 3  
Ответить с цитированием
derhab
 
Аватар для derhab

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
Если хочешь обратится из конструктора ship к box, то напиши так:
Код:
Object(root).box
__________________
freelance | Раздор


Последний раз редактировалось derhab; 27.06.2007 в 15:24.
Старый 27.06.2007, 15:13
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
не очень-то ясно как объяснить:
вот ты смотришь хиттест this.caravella с неким answers.box
оба объекта не существуют :
-у this(т.е. ship) нет сойства caravella , если надо смотреть хиттест этого объекта (ship), то и пиши this.hitTestObject, а по сути просто trace(hitTestObject(answers.box));
-дальше: у answers нет статического свойства box, сделай его статическим (static var box:Sprite=new Sprite; в классе answers)и тогда ship его увидит..
зы: а иначе, правильно derhab говорит, надо искать этот бокс не в классе, а в экземпляре (руте или где-ты там это добро создаешь)


Последний раз редактировалось silin; 27.06.2007 в 15:17.
Старый 27.06.2007, 15:18
danhuu вне форума Посмотреть профиль Отправить личное сообщение для danhuu Найти все сообщения от danhuu
  № 5  
Ответить с цитированием
danhuu
 
Аватар для danhuu

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
Цитата:
Object(root).box
Я правильно понял, что Object - это класс Object, а root - это сцена (основная timeline?), где живут все дети DisplayObject? Или root - это Document Class, в моём случае - answers?
Надоело извиняться за глупые вопросы, но если я их не буду задавать, то ничему не научусь.

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
Цитата:
Сообщение от silin
не очень-то ясно как объяснить:
вот ты смотришь хиттест this.caravella с неким answers.box
оба объекта не существуют :
-у this(т.е. ship) нет сойства caravella , если надо смотреть хиттест этого объекта (ship), то и пиши this.hitTestObject, а по сути просто trace(hitTestObject(answers.box));
-дальше: у answers нет статического свойства box, сделай его статическим (static var box:Sprite=new Sprite; в классе answers)и тогда ship его увидит..
зы: а иначе, правильно derhab говорит, надо искать этот бокс не в классе, а в экземпляре (руте или где-ты там это добро создаешь)
Вот, пока писал ответ derhab-у, ещё появилось... СПАСИБО! Буду разбираться.

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

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
Цитата:
Сообщение от silin
-дальше: у answers нет статического свойства box, сделай его статическим (static var box:Sprite=new Sprite; в классе answers)и тогда ship его увидит..
зы: а иначе, правильно derhab говорит, надо искать этот бокс не в классе, а в экземпляре (руте или где-ты там это добро создаешь)
ну да...я просто решил, что если danhuu не сделал box статическим, значит ему так нужно..
__________________
freelance | Раздор

Старый 27.06.2007, 15:33
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 8  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
я со своей стороны подумал: раз answers.box, то имеется ввиду статик..
чего лучше, не всегда ясно, хотя если это document class, то чего бы ему не быть статиком

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

Регистрация: Jun 2007
Адрес: Москва
Сообщений: 27
Цитата:
Сообщение от derhab
ну да...я просто решил, что если danhuu не сделал box статическим, значит ему так нужно..
Вы меня сильно переоцениваете
Спасибо за советы! Сделал box статическим, каравеллу добавил, как на AS3.ru написано (и Miramax спасибо!), вроде заработало. Но, естественно, один раз - листенер ENTER_FRAME после срабатывания убирается, иначе постоянно генерит. Пытаюсь присобачить проверку столкновения к box:
Код:
package 
{
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.text.*;
	import flash.events.*;
	import flash.utils.Timer;

	public class answers extends Sprite
	{
		var words:Array=[{val:"Гаити",flag:true},{val:"Ньюфаундленд",flag:false},{val:"Гренландия",flag:false},{val:"Куба",flag:true},{val:"Цейлон",flag:false},{val:"Великобритания",flag:false},{val:"Ямайка",flag:true},{val:"Антарктида",flag:false},{val:"табак",flag:true},{val:"индейцы",flag:true},{val:"золото",flag:false},{val:"Тринидад",flag:true},{val:"Шпицберген",flag:false},{val:"мыс Дежнёва",flag:false},{val:"Амазонка",flag:false}];
		var i:int=0;// итератор слов
		// создаём 10-секундный таймер и поле отсчёта
		var timer:Timer=new Timer(1000,10);
		var timerField:TextField=new TextField  ;
		// создаём клип-контейнер
		static var box:Sprite=new Sprite  ;
		// создаем поле ответа
		var tf:TextField=new TextField  ;

		public function answers():void
		{
			//создаём каравеллу
			var caravella:ship=new ship  ;
			caravella.x=stage.stageWidth / 2;
			caravella.y=stage.stageHeight / 2;
			addChild(caravella);
			//добавляем листенеры к таймеру
			timer.addEventListener(TimerEvent.TIMER,onTick);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE,onTimerComplete);
			// Перехватываем нажатие кнопки мыши
			box.addEventListener(MouseEvent.MOUSE_DOWN,handleMouseDown);
			// Отпускание мышки
			box.addEventListener(MouseEvent.MOUSE_UP,handleMouseUp);
			//Отпускание мышки за пределами флэшки
			box.addEventListener(MouseEvent.MOUSE_OUT,handleMouseUp);
			//запускаем первое слово
			newWord(i);
		}
		//собственно функция появления варианта ответа
		private function newWord(i):void
		{
			//запускаем таймер
			timer.reset();
			timer.start();
			//поле таймера
			timerField.x=450;
			timerField.text="Осталось " + timer.repeatCount + " с.";
			addChild(timerField);
			//заполняем и форматируем поле ответа
			tf.autoSize=TextFieldAutoSize.LEFT;
			tf.selectable=false;
			tf.text=words[i].val;
			var format:TextFormat=new TextFormat  ;
			format.font="Verdana";
			format.size=16;
			format.bold=true;
			tf.setTextFormat(format);
			//выводим клип и суём туда текстовое поле
			box.x=10;
			box.y=10;
			addChild(box);
			box.addChild(tf);
			box.addEventListener(Event.ENTER_FRAME,efHandler);
		}
		//Функции Drag&Drop
		private function handleMouseDown(event:MouseEvent):void
		{
			box.startDrag();
		}
		private function handleMouseUp(event:MouseEvent):void
		{
			box.stopDrag();
		}
		//функция столкновения
		private function efHandler(event:Event):void
		{
			if (box.hitTestObject(Object(answers).caravella)) {
				trace("ку-ку");
				removeEventListener("enterFrame",efHandler);
			}
		}
		//функции таймера
		private function onTick(event:TimerEvent):void
		{
			// показывает счётчик
			var t:int=event.target.repeatCount - event.target.currentCount;
			timerField.text="Осталось " + t + " с.";
		}
		private function onTimerComplete(event:TimerEvent):void
		{
			//клип-контейнер и счётчик исчезают
			removeChild(timerField);
			box.removeChild(tf);
			removeChild(box);
			//если не дошли до конца, сдвигаем итератор и запускаем следующее слово
			if (i < words.length - 1) {
				i++;
				newWord(i);
			}

		}
	}
}
Класс ship пока пустой, туда собираюсь сделать функцию утопления/всплывания.
Теперь соответственно, ругань на каравеллу. Статической я её сделать не могу, так? По-всякому пробовал к ней обращаться - либо undefined, либо possibly undefined, либо, в последнем варианте (в коде выделено красненьким) Type error: hitTestObject param must not be null. Почему такой вариант - trace(caravella.parent), если добавить сразу после addChild(caravella), выводит [object answers]
Просветите, пожалуйста, где я опять ошибся?

Старый 28.06.2007, 14:47
derhab вне форума Посмотреть профиль Отправить личное сообщение для derhab Найти все сообщения от derhab
  № 10  
Ответить с цитированием
derhab
 
Аватар для derhab

Регистрация: Apr 2001
Адрес: Berlin
Сообщений: 1,862
Отправить сообщение для derhab с помощью ICQ Отправить сообщение для derhab с помощью Skype™
что ж ты пишешь?)
Код:
(box.hitTestObject(Object(answers).caravella))
у тебя answers документ класс, базовый, это твой рут. А каравелла это объект в руте. Из класса answers обращайся к нему просто:
Код:
(box.hitTestObject(caravella))
__________________
freelance | Раздор

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

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

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


 


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


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