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

Вернуться   Форум Flasher.ru > Блоги > As3 изучение и немного As2

Оценить эту запись

MultiMenu ( horizontal ) ala 2advanced v.5

Запись от in4core размещена 25.01.2012 в 14:46
Обновил(-а) in4core 25.01.2012 в 17:08

Оказалось довольно простой задачей на пару часов, зато выглядит шикарно...

Код AS3:
package com.in4core.navigation 
{
	import com.greensock.TweenMax;
	import flash.display.DisplayObjectContainer;
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.events.EventDispatcher;
	import flash.events.MouseEvent;
 
	/**
	 * ...
	 * @author in4core lab
	 */
	public class MultiLevelMenu extends EventDispatcher 
	{
		private var _container:DisplayObjectContainer;
		private var _levelsVector:Vector.<LevelContainer> = new Vector.<LevelContainer>;
 
		private namespace utils;
 
		private var _levels:int 		= -1;
		private var _xml:XML 			= null;
		private var _separatorW:int 	= 1;
		private var _separatorH:int 	= 1;
		private var _elementWidth:int 	= 220;
		private var _elementHeight:int 	= 20;
		private var _extra:String 		= '/';
		private var _maskHeight:int     = -1;
 
		public function MultiLevelMenu(container:DisplayObjectContainer , maskHeight:int) {
 
			this._maskHeight = maskHeight;
			this._container = container;
		}
 
		public function generateFromXML ( xml : XML , separatorW:int = 1, separatorH:int = 1 ) : void {
 
			this._separatorH = separatorH;
			this._separatorW = separatorW;
			this._xml = xml;
			this._levels = this.getOpenLevels();
 
			const mask:Shape = new Shape();
			mask.graphics.beginFill(0, 0);
			mask.graphics.drawRect(0, 0, _levels * ( _elementWidth + _separatorW ) , _maskHeight);
			mask.graphics.endFill();
			mask.y = _container.y;
 
			this._container.mask = mask;
			this._container.parent.addChild(mask);
 
			trace('#MultiMenu openLevels : ' + _levels);
 
			this.createContainersToLevels();
 
			this.prepareToOpenLevel(null);
		}
 
		private function createContainersToLevels():void {
 
			for (var i:int = 0; i < _levels ; i++ ) {
 
				const levelContainer:LevelContainer = new LevelContainer();
				const g:Graphics = levelContainer.graphics;
 
				g.beginFill	(0, 0);
				g.drawRect	(0, 0, _elementWidth , _elementHeight);
				g.endFill	();
				levelContainer.x = ( _elementWidth + _separatorW ) * i;
				levelContainer.level = i + 1;
				levelContainer.addEventListener(MouseEvent.MOUSE_MOVE , onMove);
 
				this._container.addChild(levelContainer);
				this._levelsVector.push (levelContainer);
			}
		}
 
		private function onMove(e:MouseEvent):void {
 
			var t:LevelContainer = e.currentTarget as LevelContainer;
			var m:int = _maskHeight;
			var s:int = e.stageY;
			var y:int = _container.y;
 
			if (t.height > m ) t.y = int ( - ( ( t.height - m  ) / m ) * (s - y ) );
		}
 
		private function prepareToOpenLevel(e:MouseEvent):void {
 
			var lst:XMLList = null;
			var link:String = '';
			var level:int = -1;
			var len:int = -1;
 
			if ( ! e ) {
 
				lst = _xml.children();
				level = 0;
			}
 
			else {
 
				const curItem:Item = e.currentTarget as Item;
				const curCont:LevelContainer = curItem.parent as LevelContainer;
				level = curCont.level;
				lst = curItem.subLevels;
				link = curItem.link + _extra;
				this.clearNextLevels(e);
			}
 
			len = lst.length();
 
			const l:LevelContainer = this._levelsVector[level];
 
			if (lst == null || len == 0 ) return;
 
			for (var i:int = 0; i < len; i++) {
 
				const item:Item = new Item( _elementWidth , _elementHeight );
				item.link = link + lst[i].@name;
				item.title = lst[i].@name;
				item.y = ( _elementHeight + _separatorH ) * i;
 
				if ( lst[i].hasComplexContent() ) {
 
					item.subLevels = lst[i].children();
					item.addEventListener(MouseEvent.MOUSE_OVER , prepareToOpenLevel );
					item.showIfSubMenu();
				}
 
				else item.addEventListener(MouseEvent.MOUSE_OVER , clearNextLevels );
 
				item.addEventListener(MouseEvent.CLICK , setLink);
 
				l.addChild ( item );
			}
 
			if(level) TweenMax.fromTo ( l , 0.5 , { y: - l.height } , { y:0 } );
		}
 
		private function setLink(e:MouseEvent):void {
 
			const tar:Item = e.currentTarget as Item;
			this.dispatchEvent( new MultiMenuEvent ( MultiMenuEvent.LINKED , tar.link ) );
		}
 
		private function clearNextLevels(e:MouseEvent):void {
 
			var curItem:Item = e.currentTarget as Item;
			var curCont:LevelContainer = curItem.parent as LevelContainer;
			var level:int = curCont.level;
 
			for (var i:int = level; i < _levelsVector.length; i++) {
 
				this._levelsVector[i].y = 0;
 
				while ( this._levelsVector[i].numChildren ) this._levelsVector[i].removeChildAt(0);
			}
		}
 
 
		private function getOpenLevels():int {
 
			return _xml.@levels;
		}
 
	}
 
}
 
import com.greensock.TweenMax;
import com.in4core.text.DisplayText;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.MouseEvent;
import flash.text.TextField;
 
internal class Item extends Sprite {
 
	private var _title:String;
	private var _link:String;
	private var _sh:Shape = new Shape();
	private var _tf:TextField = DisplayText.addField('f_2', 8, true);
	private var _nx:TextField = DisplayText.addField('f_2', 8, true);
	private var _subLevel:XMLList;
 
	public function Item(w:int , h:int):void {
 
		_sh.graphics.beginFill(0);
		_sh.graphics.drawRect(0, 0, w, h);
		_sh.graphics.endFill();
 
		_tf.textColor = 0xFFFFFF;
		_tf.text = 'test';
		_tf.x = 10;
		_tf.width = w - 20;
		_tf.height = h;
 
		_nx.textColor = 0xFFFFFF;
		_nx.text = '>';
		_nx.width = 10;
		_nx.height = h;
		_nx.x = w - _nx.width - 5;
 
		this.addChild(_sh);
		this.addChild(_tf);
 
		this.mouseChildren = false;
		this.buttonMode = true;
 
		this.addEventListener(MouseEvent.MOUSE_OVER , onOver);
		this.addEventListener(MouseEvent.MOUSE_OUT , onOut);
 
		_sh.alpha = 0.5;
	}
 
	private function onOut(e:MouseEvent):void  {
 
                  TweenMax.to(_sh , 0.5 , { alpha : 0.5 } );
	}
 
	private function onOver(e:MouseEvent):void {
		TweenMax.to(_sh , 0.5 , { alpha : 0.7 } );
	}
 
	public function showIfSubMenu():void {
 
		this.addChild(_nx);
	}
 
	public function set title(n:String):void {
 
		_title = n;
		_tf.text = _title;
	}
 
	public function set subLevels(xmlList:XMLList):void {
 
		_subLevel = xmlList;
	}
 
	public function get title():String {
		return _title;
	}
 
	public function get subLevels():XMLList{
		return _subLevel;
	}
 
	public function get link():String {
		return _link;
	}
 
	public function set link(value:String):void {
		_link = value;
	}
}
 
internal class LevelContainer extends Sprite {
 
	private var _level:int;
 
	public function LevelContainer(  ) {
 
		super();
	}
 
	public function get level():int {
		return _level;
	}
 
	public function set level(value:int):void {
		_level = value;
	}
}
Собственно кастомизацию проводить в интернал Item. Маску для общего контейнера можно бы вынести отдельно без this._container.parent.addChild(mask); такой страшной конструкции, просто решил всю кашу в одном котелке сварить.
Да, и нафига тут неймспейс... а для понта)
На самом деле, писать метод для просчета макс кол-ва нодов мне стало лень, поэтому вынес кол-во уровней в атрибут хмл.

Ну вот получилось под-копирку как у 2A, только на as3. Странно, что в сети, реализаций такого меню я не нашел, может конечно и есть где, хз.
Код:
<?xml version="1.0" encoding="utf-8" ?>
<core levels="4">
	<item name="item1">
		<item name="subitem1"></item>
		<item name="subitem2"></item>
		<item name="subitem8"></item>
		<item name="subitem9"></item>
		<item name="subitem10"></item>
		<item name="subitem11"></item>
		<item name="subitem12"></item>
		<item name="subitem13"></item>
		
	</item>
	<item name="item2"></item>
	<item name="item3"></item>
	<item name="item4"></item>
	<item name="item5">
		<item name="subitem1">
			<item name="SSsubitem4"></item>
			<item name="SSsubitem5"></item>
			<item name="SSsubitem6"></item>
		</item>
		<item name="subitem2">
			<item name="SSsubitem7"></item>
			<item name="SSsubitem8"></item>
			<item name="SSsubitem9"></item>
		</item>
		<item name="subitem3">
			<item name="SSsubitem10"></item>
			<item name="SSsubitem11"></item>
			<item name="SSsubitem12">
				<item name="level4"></item>
				<item name="level4"></item>
				<item name="level4"></item>
				<item name="level4"></item>
				<item name="level4"></item>
				<item name="level4"></item>
				<item name="level4"></item>
			</item>
		</item>
	</item>
</core>
Пощупать что вышло тут , пруф

P.s. для скроллинга использую метод Wolsh всегда и везде, за что ему и огромное спасибо.
Всего комментариев 56

Комментарии

Старый 25.01.2012 16:19 Котяра вне форума
Котяра
 
Аватар для Котяра
На удивление чистый код. Точно сам писал?
Поправь форматирование в
Код AS3:
        public function get level():int 
	{
		return _level;
	}
А то неаккуратненько. Кругом египетские скобку, а в гетерах частично нет.
Старый 25.01.2012 16:26 in4core вне форума
in4core
 
Аватар для in4core
Я вообще то всегда так пишу, когда final ( конечно если сравнить с кодом рулеточные столы... - но там суть была не в коде, а в реализации вообщем то) , пример AdvancedMovieClip - такой же чистый код. Ну скобки так генеририует FD я обычно на это уже внимания не обращаю, может есть какая то настройка, чтобы скобки делал нормально? И кстати в новом FD бесит автогенератор приватов this.private = private , вместо того как было раньше _private = private
Обновил(-а) in4core 25.01.2012 в 16:37
Старый 25.01.2012 16:43 Котяра вне форума
Котяра
 
Аватар для Котяра
А с какой целью ты использовал
Код AS3:
utils function getOpenLevels...
Чем это круче паблика или привата?
Старый 25.01.2012 16:47 in4core вне форума
in4core
 
Аватар для in4core
Собственно в комментах к коду я об этом написал. Чисто для понта, никакой смысловой нагрузки не несет совершенно. С другой стороны, когда начал писать, а обычно в таких классах у меня очень много утилитных методов, решил заюзать неймспейс как бы разделяя основную реализацию от утилсов, экая замена блочных комментариев аля MOUSE HANDLERS и т.д. Поэтому , допиливая под себя, я думаю люди не глупые догадаются заменить на приват.
Старый 25.01.2012 16:51 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
люди неглупые приват и напишут, а не будут вспенивать мозг читателям
Старый 25.01.2012 16:53 alatar вне форума
alatar
 
Аватар для alatar
Подменю всегда открываются сверху (на уровне первого элемента), перейти с нижнего пункта меню на подменю практически нереально.
Старый 25.01.2012 16:55 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Ну скобки так генеририует FD
А ты каким -нибудь автоформатером пользуешься?
Старый 25.01.2012 16:57 Котяра вне форума
Котяра
 
Аватар для Котяра
И ещё. А зачем константы то? Внутри метода?
Код AS3:
const levelContainer:LevelContainer = new LevelContainer();
Старый 25.01.2012 17:05 in4core вне форума
in4core
 
Аватар для in4core
Котяра, это мой стиль и все. Котяра, нет наверное не пользуюсь, я никаких плагов в фд не ставил, вообщем то всегда хватало и того функционала , что есть. Что посоветуешь?
Старый 25.01.2012 17:06 in4core вне форума
in4core
 
Аватар для in4core
alatar не понял где и что нереально, по мне все очень удобно, так как и должно быть.
Сменил на приват.
alatar только , что проверил у 2А точно так же. А если они для Вас, не являются эталоном того как надо делать навигацию, то для меня - да
Обновил(-а) in4core 25.01.2012 в 17:10
Старый 25.01.2012 17:11 Dima_DPE вне форума
Dima_DPE
Мнение программиста очень часто расходится с мнением конечного пользователя. Я про понятность и удобство. Ваш вариант меню имеет право на жизнь, но скролы подменю не интуитивные, нет визуального прогрессбара, а значит не понятно сколько там еще. И не говорите мне, что положение курсора по оси ординат и есть этот визуальный прогресс. Это понимают программисты, но не юзеры.

Всплывающие подменю всегда на уровне первого элемента - это тоже ваше право, но в 95% подменю вырастает на уровне пункта меню (win, mac, linux проверено).

Все выше сказанно не в коем случае не говорит, что ваше меню плохое. Оно прекрасно, но для некоторых людей оно не интуитивно, на что я и попытался указать.
Обновил(-а) Dima_DPE 25.01.2012 в 17:16
Старый 25.01.2012 17:14 in4core вне форума
in4core
 
Аватар для in4core
Dima_DPE , собственно я ответил на этот вопрос выше. Если же делать визуальные скроллы будет выглядеть не кашерно, но проблем добавить видимый скролл 2 строчками кода, я не вижу.

Dima_DPE собственно я вас и понял, никаких вопросов не имею, у каждого просто свое мнение, кому как удобно. И опять же повторюсь сделать так, как на мак и вин ( проверено ) сложности никакой нет, допилить под себя дело 10 минут
Обновил(-а) in4core 25.01.2012 в 17:23
Старый 25.01.2012 17:24 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
А мне понравилось - все интуитивно понятно и без глюков. Неожиданно.
Старый 25.01.2012 17:26 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
alatar не понял где и что нереально, по мне все очень удобно, так как и должно быть.
При переводе курсора с item 5 на подменю зацеплял item 4 и меню сворачивалось.
Старый 25.01.2012 17:37 ChuwY вне форума
ChuwY
 
Аватар для ChuwY
Вот еще бы магические константы в именованные вынести.
Старый 25.01.2012 17:40 GBee вне форума
GBee
 
Аватар для GBee
alatar имеет в виду http://dl.************/u/6132064/menu.png - обычно в меню пункты выпадают на уровне родителя, а тут сверху. Когда начинаешь двигать мышку к ним, пересекаешь другие, и подменю тютю. А так неожиданно красиво сделано.
Старый 25.01.2012 17:41 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Вот еще бы магические константы в именованные вынести.
Если будете пользоваться, так и сделаете для себя именованные
Старый 25.01.2012 17:42 in4core вне форума
in4core
 
Аватар для in4core
Волгоградец , GBee - спасибо.

Насчет неожиданно тока обидно, я навигационных элементов много написал в своей жизни, это так скажем мой хлеб, тоесть на as у меня вообщем то и специализация создание программно-визуальных интерфейсов клиентских приложений. С другой стороны, я просто не выкладываю их суда, дабы каждый для себя пишет подобные штуки, а вот с меню, ссылок в нете не нашел, поэтому выложил.
Обновил(-а) in4core 25.01.2012 в 17:48
Старый 25.01.2012 18:06 GBee вне форума
GBee
 
Аватар для GBee
Цитата:
С другой стороны, я просто не выкладываю их суда, дабы каждый для себя пишет подобные штуки, а вот с меню, ссылок в нете не нашел, поэтому выложил.
Я думаю, что полезней выкладывать как раз их, и новичкам полезно и опытные что-нить новое найдут, а не простыни проектов.

А то что неожиданно, так это ваша вина. :о))
Старый 25.01.2012 20:16 Rzer вне форума
Rzer
 
Аватар для Rzer
Самое интересное "ala advanced v.5" - это наверное, чтобы новичков заманить. А так - прогресс на лицо. Ещё год и можешь браться за свой собственный MMORPG! =)
Старый 25.01.2012 20:28 in4core вне форума
in4core
 
Аватар для in4core
Я не пишу ММОРПГ , мне не нравится в этом варится, вот стратегии для ВК еще туда сюда, но мне для этого года не надо = ) Честно говоря опять не понял, причем тут новички . 2А знают не многие кстати, однако круче них я ни одной студии не знаю, рядом могу еще поставить saizen media.

Цитата:
А так - прогресс на лицо
Для года изучения АС3, как первого языка в своей жизни после АС2, думаю да
Старый 25.01.2012 20:31 Rzer вне форума
Rzer
 
Аватар для Rzer
А можно пример стратегий для которых не надо года?)
Старый 25.01.2012 20:43 in4core вне форума
in4core
 
Аватар для in4core
Мм... честно говоря не понял к чему вы это, я не сказал, что делал подобные проекты, год назад писал на АС2 игру по заказу для ВК, ну там была простейшая игра завязанная на сервере, вполне прошло как надо. Щас помоему заказчик чем то другим занялся, не поддерживает Даже как портфолио не показать уже... Я имел ввиду лично МНЕ еще года не надо, чтобы делать работающие проекты , чем я и занимался все время мне хватило времени, про КРАСИВУЮ реализацию я не говорю, ее начал так скажем изучать благодаря форуму.
Вот например не так давно, решил поработать с компанией одной по производству стратегии , там надо было выполнить 2 тестовых задания, одно из которых надо было создать мини игру на исо 2.5 движке, чтобы чел там ходил туда сюда, домики не пресекал и т.д. - кандидатов было человек 10 на место, я задачу выполнил за 1 день, пол дня на документацию по isoLib дальше коддинг, остальные товарищи дня 3-4 делали, меня взяли сразу же, но проект так и не стратанул, какие то проблемы у них там случились и директора разругались. Это я все к тому, что впитываю материал я очень быстро, и работать с ним могу легко, - я никогда не отвечаю за ЛУЧШУЮ и красивую реализацию, если это не требуется ( в палне оптимизации ) , но я всегда уверяю, что мои проекты рабочие и без глюков. Я никогда не буду писать байт-код либы, либы завязанные на математику и т.п. - я конечно технарь по образованию, но это не мое
Старый 25.01.2012 20:52 in4core вне форума
in4core
 
Аватар для in4core
Во кстати вспомнил, Котяра как то раз очень верно сказал, есть люди которые выдают себя за профф для заказчика, таковым не являясь . Собственно так я и начинал свое путешествие, однако чем этот вариант был хорош - ты тренеруешься на реальных проектах, а значит набиваешь опыт, твоя задача сдать проект, а не накосячить , еще + exp. Тоесть обучение по такому плану идет быстрее, чем читая книгу и работая в рабстве
Старый 25.01.2012 21:51 fish_r вне форума
fish_r
 
Аватар для fish_r
Цитата:
alatar только , что проверил у 2А точно так же. А если они для Вас, не являются эталоном того как надо делать навигацию, то для меня - да
И всё таки это не фича, это баг ). Больше половины "БезУмно красивых" решат, что открылось, вдруг, подменю первого пункта, либо не смогут перейти к пунктам подменю и пользоваться меню не смогут. Дайте пруф на ваших авторитетов - посмотреть хочется.

И ещё MOUSSE_OUT (или что там?) не обрабатывает закрытие подменю, когда курсор уходит в другую часть страницы из раскрытых подменю, и либо эта гирлянда остается висеть, непонятно зачем, либо пользователю придется закрывать "вручную", чтобы эта штука не мешалась.
Старый 25.01.2012 22:00 dimarik вне форума
dimarik
 
Аватар для dimarik
Оч круто! in4core, если так дальше дело пойдет, то вам нужно блатоваться в могучую кучку flex-team. Подвиньте их там хорошенько, а то делают как на АвтоВАЗе, — тормоза какие-то.
Старый 25.01.2012 22:08 in4core вне форума
in4core
 
Аватар для in4core
fish_r - пруф давно висит ) читайте внимательнее
Старый 25.01.2012 22:10 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
И ещё MOUSSE_OUT -
Етить колотить так и задумано! Здесь не обсуждается почему так выглядет и так работает, здесь обсуждается конкретный код, - если не нравится как выглядит - напишите свой, я свою задачу решил - сделал так как у 2А. взятки гладки
Старый 25.01.2012 22:13 in4core вне форума
in4core
 
Аватар для in4core
dimarik флексовые компоненты это недокомпоненты , поэтому флексом я не пользуюсь вообще, мне проще написать свою реализацию такую, как я хочу, нежели брать готовую неотесанную болванку
Старый 25.01.2012 22:52 dimarik вне форума
dimarik
 
Аватар для dimarik
Дык я о том же. Щаз поднаторишь — и в путь!
Старый 25.01.2012 23:00 in4core вне форума
in4core
 
Аватар для in4core
еще бы уметь собирать это все во фреймворк типа флекса, чтобы к FD подключать например, swc - не кашерно )
Старый 25.01.2012 23:31 fish_r вне форума
fish_r
 
Аватар для fish_r
Цитата:
если не нравится как выглядит - напишите свой
Неужели ваш нельзя будет поюзать? (и у них, кстати, MOUSE_OUT работает)
Обновил(-а) fish_r 25.01.2012 в 23:35
Старый 25.01.2012 23:38 in4core вне форума
in4core
 
Аватар для in4core
оут работает на ВСЕ меню сразу, а на части меню работает так же как и у меня, это легко проверить - нажмите например в настройках always show menu , затем дойдите до 3 уровня и спокойно опустите мышку вниз, все 3 уровня останутся висеть - вообщем то так и надо, зачем закрывать ТО, что закрывать НЕ хотелось
Старый 26.01.2012 00:50 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Почему вместо замечаний о том, что хотелось бы добавить вот этого у тебя всегда ответы в стиле — добавь сам, напиши свой и вообще так задумано?
Старый 26.01.2012 00:54 in4core вне форума
in4core
 
Аватар для in4core
Не всегда, покажи где еще? А здесь я отвечаю так как есть - 555 раз в заголовке темы написано ala 2A - меню по функционалу как у 2А? Да. Что заявлено - то сделано. Поэтому добавь сам, и так задумано - так и есть. Кроме того, больше скажу, код выкладывается такой, как задумывается, если код не рабочий или его можно улучшить ( рефракторить ) - всегда приму критику, если разговор идет о том, мне не нравится потому, что это не так должно выгялдеть, или а я бы сделал так - я отвечаю делай сам, вот вам мой код для допиливания так, как вам понравится.
Старый 26.01.2012 00:56 in4core вне форума
in4core
 
Аватар для in4core
Меня больше интересует вопрос - почему ты суешь свой нос все время в мою сторону по поводу холивара в 95% и только в 5% по коду ? Может тебе мальчики нравятся , а мой смазливый аватар тебя просто возбуждает ?

P.s. если тебе вдруг не нравится такое общение, то подумай сам, как ты общаешься в таком же ключе тогда, когда к тебе разговор отношения не имеет во первых, во вторых когда разговор идет безобидный и никого не обижающий, а ты лезешь со своими комментариями с оскарблениями. Пример : вот щас ты написал вполне нормальный вопрос, но получил вполне нормальный пинок
Обновил(-а) in4core 26.01.2012 в 01:01
Старый 26.01.2012 01:35 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Досадно, меня раскусили.

Оскорблениями. Через "о".
Старый 26.01.2012 01:43 fish_r вне форума
fish_r
 
Аватар для fish_r
Цитата:
555 раз в заголовке темы написано ala 2A - меню по функционалу как у 2А? Да. Что заявлено - то сделано.
Похоже, но не ТО, что и пытался вам сказать, и ни к чему слюной на монитор брызгать - "Етить колотить".

Цитата:
всегда приму критику
нет уж, увольте... Молодец! Восхитительно! Флаг в руки...
Старый 26.01.2012 01:54 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
Оскорблениями. Через "о".
Эка видать тебя за больное задело, что даже умнее придумать ничего не смог ) Видать гейская тема для тебя вкуснее пряника...

fish_r в лоб не вижу где не то, кроме того, что у них меню сворачивается ВСЕ по аут за всем меню, так это не относится к меню напрямую, а скорее к отдельному функционалу немного, а так, по аут на МЕНЮ именно все работает так же, если я не прав хотелось бы увидеть скрина, просто я пока не понимаю где не так.
А насчет критики - это тока по коду, причем здесь критика , что сверхумные не оценят - на это так и отвечаю. Думаю обсуждение пора закрыть, холивар везде найдут. А вот насчет скрина, очень хочу лицезреть
Старый 26.01.2012 05:33 Mur4ik вне форума
Mur4ik
Отмечу одну проблему юзабельности многих подобных реализаций.
При доведении мыши хотя бы до середины крайних элементов (это максимум) хотелось бы уже видеть их целяком, а не часть.
Иными словами, чтоб увидеть полностью первый или последний элементы нужно мышу подводить к самому краю соответственно верхнему или нижнему, это неудобно.
Старый 26.01.2012 13:45 Dima_DPE вне форума
Dima_DPE
По коду, так по коду (далее то, что бросилось в глаза при чтении кода):
  • generateFromXML нельзя вызвать второй раз для одного и того же меню, а все дело в том, что старая маска не удаляется как минимум, хотя по идее вообще ничего старое не удаляется. В таком случае, когда меню переиницализировать нельзя, лучше xml передавать в конструктор.
  • Кто вам вообще сказал, что так можно писать?
    Код AS3:
    this._container.parent.addChild(mask);
    _container вам пришел из вне, в конструкторе меню, а вы его пэренту чтото добавляете, бред бред бред. Да у него и пэрента может не быть.
  • Код AS3:
    len = lst.length();  // тут вы вычисляете длину lst
    const l:LevelContainer = this._levelsVector[level];
    if (lst == null || len == 0 ) return;   // а вот тут вы уже проверяете его на null, не поздновато ли?

Далее, более мелкие замечания:
  • Название метода prepareToOpenLevel ни говорит о том, на какое событие он срабатывает, а ведь он именно обработчик события, не сильно страшно, но я предпочитаю обработчики называть в честь события что они обрабатывают и не я один. Это касается большинства обработчиков у вас в коде. При беглом осмотре не понятно, сработает это на down, up или click, а это таки важно.
  • Глубину меню можно было бы легко вычеслить по самому xml и не лениться, там работы 3 строки кода, а не ждать аттрибут levels в корне xml, что заставляет каждый раз при изменении xml вручную пересчитывать его глубину и тут вступает человеческий фактор.
  • Код AS3:
    _xml.@levels   // это XMLList, а если вам надо int, то приведите его к инт сами, а не надейтесь на avm, в конце концов защиту от дурака никто не отменял (кто забыл, @levels вписывает человек руками)
  • Если уж у вас Item и LevelContainer внутренние класса, то зачем же вы так поранаедально навтыкали в них геттеров и сеттеров, когда там банально хватит публичных аттрибутов.
  • Меню почти не модифицируемо из вне, все изменения можно вносить только напрямую в коде, как говорилось выше, часть числовых констант хоть бы в виде констант оформили.

Смертные грехи по моему мнению:
  • Код AS3:
    levelContainer.addEventListener(MouseEvent.MOUSE_MOVE , onMove);
    ужас ужас и еще раз ужас. Вы слушаете это событие всегда и всегда, начиная с вызова generateFromXML и даже если вам не разу не понадобится скролить подменю. Обработчик продолжит работать даже если вы удалите меню со сцены. Погуглите чтоли про жизненый цикл уи контролов, они должны уметь умирать.
    И вообще поиск по removeEventListener не дал результата, видимо не по рангу вам такими глупостями занимать, пусть другие убирают за вами.
  • В классе Item в конструкторе создается _nx для всех элементов меню, но нужен он далеко не всем. Вам конечно не жалко, а потом не понятно почему флеш называют тормозным *****м.

Заключиние: Есть мнение, что люди, которые не разобрались как работает flex и его контролы, очень часто называют его всякими обидными словами, а ведь flex не так плох. В конце концов на его примере можно было научиться как контролы писать нельзя.
Обновил(-а) Dima_DPE 26.01.2012 в 13:55
Старый 26.01.2012 13:46 in4core вне форума
in4core
 
Аватар для in4core
Mur4ik Есть такой косяк, но в мат я не силен, и как модифцировать Wolsh формулу я не знаю. Если подскажите, буду признателен
Старый 26.01.2012 14:14 in4core вне форума
in4core
 
Аватар для in4core
Dima_DPE замечательно, но не везде по делу. Щас разберем почему
Цитата:
Кто вам вообще сказал, что так можно писать?
А кто вам сказал, что нельзя? Писать можно, что угодно, однако, в статье я пояснил, что написал так,чтобы просто сварить все в одном котелке, логичнее же было создавать маску отдельно от меню вообще, а в меню дергать только геттер маски контейнера для опознавания высоты. - это было бы правильно.

Цитата:
Проверка на null
Вижу косяк, не досмотрел, но как следствие это к RTE не приведет, поэтому первое условие спокойно опускается, даже не рассматриваясь.

Цитата:
prepareToOpenLevel
Подготовка к открытию/ созданию уровня. Название полностью соотв тому, что происходит в данном методе. Такой широкий метод всего 1, и назвать его как обычно onOver ( где по большей части обрабатывается мин графика типа сменить текст, закрасить область) я считаю моветоном. Это мой личный подход.
Цитата:
Глубину меню можно было бы легко вычеслить по самому xml и не лениться, там работы 3 строки кода
Покажите мне такую реализацию в 3 строчки? оооочень интересно.
Цитата:
Если уж у вас Item и LevelContainer внутренние класса, то зачем же вы так поранаедально навтыкали в них геттеров и сеттеров, когда там банально хватит публичных аттрибутов.
Я не пишу публичные переменные, я пишу только гет-сет всегда - это мой стиль. Публичные переменные только константы для например эвентов, - собственно посмотрите например на реализацию as3 машины, они тоже не используют публик)

Цитата:
Меню почти не модифицируемо из вне, все изменения можно вносить только напрямую в коде, как говорилось выше, часть числовых констант хоть бы в виде констант оформили.
Как вариант можно заменить Item на свой собственный, добавляя его из вне - это да, передавать класс, а уже внутри его инициализировать, можно конечно и передавать параметры в класс, но 10 параметром, немного убого, а если пойти по пути компонентов, где сеттер на каждое свойство перерисует компонент, то писать слишком много. Понятное дело, что нахоливарить в такой степи можно легко, и найти недочеты в любом коде, я же выложил архитектуру , рабочую, и пример создания, дальше допиливать под себя - это вам не безупречный алмаз, таких классов не бывает) или это утопия
Цитата:
Смертные грехи по моему мнению
Я придерживаюсь прекрасной статьи на хабре - мышиные события сносить? да ну нафиг. В данном случае да ну нафиг вполне оправдан, онМув отрабатывает только на мини контейнерах под маской, тоесть на опред области, если мы работаем с меню и попадаем на нужны уровень мув действует, если мы к меню не лезем, мув не действует, ибо он на контейнере висит, а не на стейдже, а удалив например только контейнер, я спрячу и все мувы. - никакой нагрузки ни на проч ни на память не удаление мышиных событий не несет.
Однако доля правды в ваших словах есть, каюсь забыл destroy() метод включить , вот этот момент допилю обязательно и обновлю.

Цитата:
В классе Item в конструкторе создается _nx для всех элементов меню, но нужен он далеко не всем. Вам конечно не жалко, а потом не понятно почему флеш называют тормозным *****м.
Читая сверху вниз, я все больше удивляюсь, сначала про мышиные события, затем addChild - никакой ощутимой нагрузки на проц и память добавление текстового поля с 1 символом - не несет. Успокойтесь уже со своей экономией, 21 век на дворе, а вы все fireFox не ставите - жрет видите ли много, а касперский? - это ваще смерть)
Старый 26.01.2012 14:36 Dima_DPE вне форума
Dima_DPE
Фразы "мой подход", "мой стиль", "мой личный подход" особенно бесят, в ответ из цензуры на ум приходит только фраза "не сработаемся". Это не аргумент, это отмазка: "от#6ii3сь и не трогайте тут меня, каждый дрочит как хочет и я по своему". Вы просили по коду, я указал.

Цитата:
А кто вам сказал, что нельзя? Писать можно, что угодно, однако, в статье я пояснил, что написал так,чтобы просто сварить все в одном котелке, логичнее же было создавать маску отдельно от меню вообще, а в меню дергать только геттер маски контейнера для опознавания высоты. - это было бы правильно.
Уже пошел словестный бред. Если меню нужна маска, он и сам ее должен хранить, сам добавлять на сцену и сам менять ей размер, но не контейнеру родителю, а все в себе. Представте в контроле могут быть куча сложенных слоев.

Цитата:
Глубину меню можно было бы легко вычеслить по самому xml и не лениться, там работы 3 строки кода
Покажите мне такую реализацию в 3 строчки? оооочень интересно.
почитайте про e4x он и не такое умеет.

Цитата:
...безупречный алмаз, таких классов не бывает) или это утопия
Вы так говорите, как будто это плохо.

Цитата:
Читая сверху вниз, я все больше удивляюсь, сначала про мышиные события, затем addChild - никакой ощутимой нагрузки на проц и память добавление текстового поля с 1 символом - не несет. Успокойтесь уже со своей экономией, 21 век на дворе, а вы все fireFox не ставите - жрет видите ли много, а касперский? - это ваще смерть)
И снова здравствуйте, я про то что это не банальная экономия, а потенциальные дыры в утечке памяти. Вы свое меню погоняйте то сами, оно жрет как не в себя. Мало того что вы каждый раз пересоздаете все подменюшки, так они хрен сборщиком мусора соберутся, кстати изза обработчиков мышиных
Вы будете сильно удивлены, но сборщик мусора до сих пор не всегда убирает такие вещи
Код AS3:
var a:Object = {}; var b:Object = {a:a}; a.b = b; 
a = null; b = null;

Извиняюсь, что так много написал. Не знал, что статья на хабре у вас в непоколебимых истинах, я ж по старинке книжки читаю, вот дурак.
Удачи вам.
Обновил(-а) Dima_DPE 26.01.2012 в 14:40
Старый 26.01.2012 14:47 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
почитайте про e4x он и не такое умеет.
я то прочитал ) но, фраза шла от вас насчет того, что вы в 3 строчки напишите. Так вот, чтобы не быть голословным покажите уж, как это так, хотя бы в 5 строчек. посмотреть хочется просто и убедится в своем нубизме
Старый 26.01.2012 14:49 in4core вне форума
in4core
 
Аватар для in4core
Цитата:
а потенциальные дыры в утечке памяти
Приведите тесты, вместо голословства. у меня меню ничего не жрет
Старый 26.01.2012 14:53 Zebestov вне форума
Zebestov
 
Аватар для Zebestov
Мне вообще кажется, что визуальный компонент не обязан быть таким сдержанным и запросто может (должен) наследоваться от того же Sprite, в результате это приведет к полной "закрытости" всей этой менюшки. И не нужно будет ей передавать никаких контейнеров, и не нужно будет никаких парентов. При создании передали ширину/высоту (или тот же Rectangle, хотя он тут избыточен) и XML (чтобы не было отмеченной ранее неоднозначности с "пересборкой"). А потом созданный экземпляр повесили addChild-ом куда необходимо — и все дела.
Старый 26.01.2012 14:53 HardCoder вне форума
HardCoder
 
Аватар для HardCoder
Цитата:
Вы будете сильно удивлены, но сборщик мусора до сих пор не всегда убирает такие вещи
Код AS3:
var a:Object = {}; var b:Object = {a:a}; a.b = b; 
a = null; b = null;
100% удалится тогда, когда обьем доступной памяти будет слишком низким. Если памяти более чем достаточно, может удалить, может не удалить - это не скажется на производительности.
Старый 26.01.2012 14:58 Dima_DPE вне форума
Dima_DPE
Цитата:
я то прочитал ) но, фраза шла от вас насчет того, что вы в 3 строчки напишите. Так вот, чтобы не быть голословным покажите уж, как это так, хотя бы в 5 строчек. посмотреть хочется просто и убедится в своем нубизме
Ня

Код AS3:
var len:int = 0;
var nod:XMLList = xml.item;
while (nod.hasComplexContent()) {
  len++;
  nod = nod.children();
}
правда e4x даже не понадобился
И не смейте орать что тут не 3 строки, работы с xml тут ровно 3 строки
Обновил(-а) Dima_DPE 26.01.2012 в 15:02
Старый 26.01.2012 15:01 Dima_DPE вне форума
Dima_DPE
Цитата:
у меня меню ничего не жрет
А это не голослов? У тебя меню жрет, запусти профайлер и посмотри. И да, HardCoder, прав, пока есть оперативка ниче особо удаляться не будет. И кстати это одна из главных проблем, т.к. будь у нас ограничение в n мб, мы бы более аккуратно относились к создаваемым и удаляемым объектам. Кто пишет под мобильные платформы не дадут соврать, что пулы объектов их не слаба спасают.
Обновил(-а) Dima_DPE 26.01.2012 в 15:17
 

 


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


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