Показать сообщение отдельно
Старый 17.11.2009, 13:58
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 15  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
1. _level0 - это сама сцена. В принципе, можно события onEnterFrame вешать на любой мувик.
2. Это к делу не относится - сделано для блокировки активных элементов игры, которые могут находится под блокирующим меню, чтобы пользователь, когда игра на паузе, не нажал чего-нибудь. Ну и слушание клавиатуры надо удалять-ставить (removeListener - addListener).
3. Нет, нельзя, пишите в кадре. Вообще никогда не пишите код на мувиках.
4. Нормально код, без допила, будет работать только в примере, аналогичном моему - два кадра (начало и сама игра) - там же прописан, например, номер кадра (1) и функции стартуют именно в кадре 2.

Идея состоит в том что отслушать потерю фокуса средствами флешки мы можем не всегда - только когда фокус установлен на каком-то объекте (используя onKillFocus).
Когда фокус установлен на null, отследить в AS2 событие потери фокуса никак (по крайней мере мне это неизвестно). Поэтому я сделал перевод фокуса на специальный объект при попадании фокуса на null :
Код AS1/AS2:
function  setFocusOnNullObject () { //принудительная установка фокуса на специальный объект вместо null
	if (!focusOnNullSet && Selection.getFocus() == null) {//если фокус переходит на null, переводим его один раз  на специальный объект
		Selection.setFocus(null_mc);
		focusOnNullSet = true ;
	}
}
Эта функция вызывается постоянно, когда игра работает (т.е. не поставлена на паузу). Как только игра ставится на паузу, функция onEnterFrame удаляется.
И когда этот объект теряет фокус - в примере считается , что пользователь свернул страницу, ушел на другое приложение и т.д.

Добавлено через 12 минут
Если выкинуть все лишнее (оставив блокирующее меню), все сводится к этому:
Код AS1/AS2:
function pauseFunc () {
	delete _level0.onEnterFrame ;
	manageMenu ('on');
}
 
function startShowCount () {
	_level0.onEnterFrame = setFocusOnNullObject;
}
 
function  setFocusOnNullObject () { //принудительная установка фокуса на специальный объект вместо null
	if (!focusOnNullSet && Selection.getFocus() == null) {//если фокус переходит на null, переводим его один раз  на специальный объект
		Selection.setFocus(null_mc);
		focusOnNullSet = true ;
	}
}
 
null_mc.onKillFocus = pauseFunc; // при потере фокуса приостанавливают игру
startShowCount(); //установка функции EnterFrame для _level0
 
////// БЛОКИРУЮЩЕЕ МЕНЮ ///////////////////////////////////////////
menu_mc.bg.onPress = function  () {
	//пустой обработчик. По идее, нужно еще отключать функции игры
}
 
menu_mc.bg.useHandCursor = false ;
 
menu_mc.contin_mc.onRelease = function  () {
	manageMenu ('off');
	startShowCount ();
	focusOnNullSet = false ;
}
 
menu_mc.exit_mc.onRelease = function  () {
	gotoAndStop(1);
	focusOnNullSet = false ;
}
 
function manageMenu (dir:String) {
	switch (dir) {
		case 'on':
			menu_mc._alpha = 100;
			menu_mc._visible = true ;
		break;
		case 'off':
			menu_mc._alpha = 0;
			menu_mc._visible = false ;
		break;
	}
}
manageMenu ('off');
Смысл примера - показать идею. Доработать код под ваш случай в принципе можно, но вы должны сделать это сами, разобравшись в алгоритме.. ну либо выложите исходник, я посмотрю.

Добавлено через 42 минуты
Попробуйте допилить. Запишите все функции в первом кадре, а действия
Код AS1/AS2:
null_mc.onKillFocus = pauseFunc; // при потере фокуса приостанавливают игру
startShowCount(); //установка функции EnterFrame для _level0
- в кадре текущего уровня.
Мувик null_mc должен находится во всех кадрах уровней (уберите его за границы сцены).


Последний раз редактировалось mooncar; 17.11.2009 в 14:50.