Показать сообщение отдельно
Старый 27.02.2009, 02:54
Barzometr вне форума Посмотреть профиль Отправить личное сообщение для Barzometr Найти все сообщения от Barzometr
  № 8  
Ответить с цитированием
Barzometr

Регистрация: Jun 2004
Сообщений: 121
ну смотрите. Разберем первый код. Где есть обработчик.

исправили на один загрузчик.

Код AS1/AS2:
var loadListener:Object = new Object();
loadListener.onLoadComplete = function(target_mc:MovieClip):Void  {
	bd_load_xml_street.load("street.xml");
};
var mcLoader:MovieClipLoader = new MovieClipLoader();
mcLoader.addListener(loadListener);
mcLoader.loadClip("street.swf", _root.map.map2.array_swf);
var bd_load_xml_street = new XML();
bd_load_xml_street.onLoad = function() {
	tmp_street = String(bd_load_xml_street.firstChild);
	_root.bd_xml_swf_street = new Array();
	_root.bd_xml_swf_street = tmp_street.split("\r\n");
	_root.saveX = -10;
	_root.saveX = -10;
	creatObj();
	SI_reSize = setInterval(creatObj, 500);
};
тут мы подгрузили данные и ролики. И запустили интервал функции creatObj два раза в сек.


Описываю функцию creatObj

Код AS1/AS2:
 
 
creatObj = function () {
	if ((_root.map.map2._x != _root.saveX) or (_root.map.map2._y != _root.saveY) or (_root.map._xscale != _root.saveXs) or (_root.map._yscale != _root.saveYs)) {
		_root.mc_hittest._width = Stage.width+210;
		_root.mc_hittest._height = Stage.height+210;
		_root.line_interface2._y = Stage.height-15;
		_root.scroll_interface2._y = Stage.height-15;
		_root.line_interface._x = Stage.width-17;
		_root.scroll_interface._x = Stage.width-17;
		for (i=0; i<_root.bd_xml_swf_street.length; i++) {
			tmp_street = _root.bd_xml_swf_street[i].split("|");
			if (_root.mc_hittest.hitTest((Math.ceil(Number(tmp_street[1])+_root.map.map2._x+340)), Math.ceil((Number(tmp_street[2])+_root.map.map2._y+185)))) {
				_root.map.map2.array_swf.attachMovie(tmp_street[0], tmp_street[0], i);
				_root.map.map2.array_swf[tmp_street[0]]._x = tmp_street[1];
				_root.map.map2.array_swf[tmp_street[0]]._y = tmp_street[2];
				_root.map.map2.array_swf[tmp_street[0]].onEnterFrame = function() {
					if (!_root.mc_hittest.hitTest(this)) {
						removeMovieClip(this);
					}
				};
			}
		}
	}
	_root.saveX = _root.map.map2._x;
	_root.saveY = _root.map.map2._y;
	_root.saveXs = _root.map._xscale;
	_root.saveYs = _root.map._yscale;
};
Первое условие определяет двигалась\уменьшалась\увеличивалась карта или нет.
Если же мы двигаем карту. То обработчик этот пробегается по загруженной xml,

Код AS1/AS2:
for (i=0; i<_root.bd_xml_swf_street.length; i++) {


находит объекты, которые попадают под объект mc_hittest.

Код AS1/AS2:
if (_root.mc_hittest.hitTest((Math.ceil(Number(tmp_street[1])+_root.map.map2._x+340)), Math.ceil((Number(tmp_street[2])+_root.map.map2._y+185)))) {
И выводим их.

Выведенным объектам присваиваем onEnterFrame, чтобы определить, вышли эти объекты за границу mc_hittest или нет. Когда они выходят - они удаляются.

Код AS1/AS2:
if (!_root.mc_hittest.hitTest(this)) {
						removeMovieClip(this);
					}

Впринципе вы правы, можно заменить setInterval и условие определения двиганья карты на оператор onMouseMove. Упроститься код.


----------------------------------------------------------


Разберем второй код. где Создаются все объекты сразу и мы двигаем поле с объектами около 3000 штук.

Там нету setInterval, нету onEnterFrame. Все просто. Подгрузили xml, swf. наклепали на всю карту объекты.
При перетаскивании карты - тормозит дело. Можно как-нить облегчить?
Вариант - bitmapData - предложили. Спасибо. Это на крайний случай, хочеться все-таки векторную карту.

Добавлено через 10 минут
Заменил на функцию onMouseMove.
при простоит загрузка ЗП 4-5%. При перетаскивании под 50%!!!

при реализации с setInterval. при простои 4-5%, а вот при перетаскивании всего 15%.

Ммм.. с чем это связано? ПОлучается что при двигании мышкой мы чаще выполняем эту функцию, чем два раза в секунду (если учитывать прошлый код с setInterval) ?

Добавлено через 12 минут
можно попроваботь заменить onEnterFrame. Но на что? как еще проверять, ушли эти объекты с поля зрения или нет?