Форум 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)
-   -   Растровая карта, подгрузка тайлами и плавный скроллинг (http://www.flasher.ru/forum/showthread.php?t=89397)

makanmel 14.12.2006 22:02

Растровая карта, подгрузка тайлами и плавный скроллинг
 
Есть растровая карта, которая подгружается кусками 256 x 256. Тайлы (tile) генерирует сервер в зависимости от масштаба (zoom) и положения карты.

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

На максимальном увеличении размер карты 2097152 x 1048576.

Можно конечно на onMouseUp создавать клип в котором тайлы заново, но тогда не будет плавности движения...

Что можно придумать?
Поможет ли мне BitMapData?

Код:

map_mc.onMouseDown = function () {
        map_mc.startDrag();
}

map_mc.onMouseUp = function () {
        map_mc.stopDrag();
        map_mc.onMouseMove = null;
        loadBase();
}

function loadBase(){
        for (i = 0; i < visibleTiles.length; i++) {
                var tileArray = visibleTiles[i];
                var tileName = "x" + tileArray[0] + "y" + tileArray[1] + "z" + zoom;
                if (visibleTilesMap[tileName]) continue;// Tile is already loaded
                visibleTilesMap[tileName] = true;
                tile_mc = map_mc.createEmptyMovieClip("tile" + tileArray[0] + "_" + tileArray[1], map_mc.getNextHighestDepth());
                tile_mc._x = (tileArray[0] * 256);
                tile_mc._y = (tileArray[1] * 256);
                tile_mc.loadMovie("GetTile.aspx?type=base" + "&x=" + tileArray[0] + "&y=" + tileArray[1] + "&z=" + zoom));
        }
}

P.S. Flash 8.

miramax 14.12.2006 22:08

Есть метод draw() класса BitmapData

etc 14.12.2006 22:12

А также scroll и copyPixels

iNils 14.12.2006 22:14

У BitmapData тоже ограничение в 2880 x 2880.
Но не понятно зачем все сразу отображать.
2'097'152 x 1'048'576 - это слишком много. Нужно отображать только видимую область + запас во все стороны. Остальное держать в памяти. И при перетаскиваниие, удалять части вышедшие за пределы отведенной границы и загружать новые.

makanmel 14.12.2006 22:24

iNils:
А если я удалю тайлы с той стороны которая вышла за границу экрана, то размер клипа автоматически уменьшится?

miramax 14.12.2006 22:26

Цитата:

Сообщение от makanmel
iNils:
А если я удалю тайлы с той стороны которая вышла за границу экрана, то размер клипа автоматически уменьшится?

Размер видимого битмапа меняться не должен

etc 14.12.2006 22:26

Уменьшится, конечно. А в чём проблема-то?

makanmel 14.12.2006 22:35

__etc:
Проблема в том что мне сказали переделать сайт с Javascript'а на Flash, а я знаком с последним только две недели, и не хочется наступать на грабли.

All:
Сейчас попробую будет ли размер клипа уменьшаться при удалении невидимых тайлов. Пока всем спасибо. :)

iNils 14.12.2006 22:40

Цитата:

Сообщение от makanmel
iNils:
А если я удалю тайлы с той стороны которая вышла за границу экрана, то размер клипа автоматически уменьшится?

Надо не только удалять но и выгружать, так как если вы будете хранить на максимальном увеличении все куски карты размером в 2880 на 2880, то у вас таких кусков будет как минимум 265'121. У любого пользователя машина сразу же загнется. Объем требуемой памяти будет 2'199'023'255'552 * 3

miramax 14.12.2006 22:42

Цитата:

Сообщение от makanmel
__etc:
Проблема в том что мне сказали переделать сайт с Javascript'а на Flash, а я знаком с последним только две недели, и не хочется наступать на грабли.

Несколько миллионов пикселов..... А ты случайно не гугл мапс делаешь ?

makanmel 14.12.2006 22:52

iNils:
Мне нужно отображать (для экрана 1024x768) одновременно
1024/256 = 4 тайла по ширине
768/256 = 3 тайла по высоте
(4+2)*(3+2) = 30 тайлов. 2 - запас с каждой стороны экрана.

miramax:
Да, типа Google Maps, только еще будет погода на карте. И детализация поменьше, чем у Google.

iNils 14.12.2006 23:04

Странная математика. Если взять за схему изображение цифровой клавиатуры

7 | 8 | 9
4 | 5 | 6
1 | 2 | 3


где 5 это видимая область, то: 12 * 9 = 108

Делая сдвиг на целый экран, мы сразу же имееем в запасе в любую сторону еще один. Те тайлы что вышли за пределы схемы, выгружаем. Напрмир сдвинули с 5 на 7, значит 9, 6, 3, 1, 2 выгрузили. Меняем отсчет, то есть 7-ку, считаем теперь 5-ой и нам надо загрузить 1, 4, 7, 8, 9.

Это схемотично, для тайлов будет чуть сложнее.

makanmel 14.12.2006 23:15

iNils:
У меня просто на javascript кешировался не целый экран а только чуть-чуть. То есть предполагалось что юзер не будет на целый экран тянуть.

Ладно, я еще на работе сижу, надо уже сваливать... С утра продолжу. Всем спасибо :)


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

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