Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Флэш и более 3.000 объектов. (http://www.flasher.ru/forum/showthread.php?t=121591)

Barzometr 18.02.2009 18:53

Флэш и более 3.000 объектов.
 
Добрый день.

делал карту во флеше. И столкнулся с такой проблемой:

Накопилось на карте уже более 3000 объектов. И карта стала тормозить жутко.

Как можно облегчить жизнь карте?


ПОдумал, может создавать объекты только тогда, когда они в поле зрения должны быть.
Есть файл с коориднатами этих объектов.
Когда ролик загружается, он создает и размешает на карте эти объекты.

Вот думаю, сделать что-нить с hitTest.
Но как сделать, чтобы он по всей базе пробегал, и узнавал какие объекты сейчас в поле зрения должны быть?

Или может как-нить подругому можно сделать?

Добавлено через 21 минуту
Код AS1/AS2:

 
Stage.scaleMode = "noScale"
Stage.align = "TL";
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");
        creatObj();
        SI_reSize = setInterval(creatObj, 100)
};
creatObj = function () {       
        _root.mc_hittest._width = Stage.width
        _root.mc_hittest._height = Stage.height
        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(tmp_street[1],tmp_street[2],true)) {
                        _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];
                }
        }
};



ну вот что получилось.

На поле есть объект, который масштабируется по размеру окна.

hitTest проверяет столкновение этого объекта с объектами из массива.


Какой-нить другой способ есть?

DarkLight 18.02.2009 19:16

Если объекты неанимированные - можно в bitmapdata их отрисовывать поверх карты.

Barzometr 18.02.2009 19:20

но получиться что просто рисованная карта. Объекты нужно чтобы были активны.

Добавлено через 14 минут
проблемка с тем кодом котовый выше.

Появляются только те объекты, который попадают в кооридантную сетку mc_hittest.

как решить ее? :(

qazwsx 18.02.2009 19:43

Можно всеравно с битмапом работять зная координаты обьектов. Просто рисовать что нужно когда нужно, на самом деле довольно удобно правда не по флешийски... Ну вообще советую описать все более подробна тогда и помощь будет более обьемна.

Barzometr 18.02.2009 19:44

т.е. получилось что подгруженные объекты находяться в объекте, который мы передвигаем с помощью startDrag(). Следовательно их координаты не меняются (так и нада).

А в hitteste мы сравниваем координаты mc_hittest c координатами из базы этих объектов. Но mc_hittest ведь не перемещается, а стоит на месте. Получается в итоге, что мы видим только часть объектов, координаты которых равны mc_hittest.

Вот. Получается, нам нужно двигать и это mc_hittest?

Добавлено через 5 минут
Более подробно:

Все объекты во флеше отрисованы.
Карта города. Фон сохраннен отдельно, дома сохранены отдельно (отдельная файл).

Загружается флешка. Фон подгрузился. На него подгружаем дома и распологаем их согласно их ним координатам.

Вот. Двигаем все это чудо просто с помощью startDrag().

ОБъектов слишком много. тормозит это дело.

Поэтому решил, создавать объекты не сразу, а по мере их необходимости.

Вот. На поле, в root'e есть объект, который выступает в роле видимого поля. Он ресайзиться под размер окна.
Я сравнию координаты из базы домов, с координатами этого объекта. Но коориднаты этого объекта статичны ведь будут, как быть в этом случае?




Насчет битмапа - не делал ниразу. Читаю. Но я так понял, это просто создание большой картинки получиться? а как же кликабельность объектов?

qazwsx 18.02.2009 20:32

Ну как по клику смотреть есть ли дом в этой точке(если это точка то идеально ^^). Далее делаем что надо или рисуем подсвеченый дом в место обычного или там какие то действия делаем если клик был по дому %)


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

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