Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Работа с графикой и ее обновление


Автор: nangel 27.2.2008, 08:27
Привет всем,
народ поделитесь как можно засунуть картинку(карту города) в програмку. Размер карты 1153X1514.
Сложность в том, чтобы  НЕ  разделять карту на равные части, а как-то выполнить перемещение по ней используя базовый крестик телефона??????????

После чего и нарисовать на выбранной точке другой рисунок и отправить его координаты на сервер.

Может кто уже далал подобные проги, если не трудно помогите примером.

Спасибо!

Автор: Brodyaga 27.2.2008, 09:44
Цитата

Сложность в том, чтобы  НЕ  разделять карту на равные части, а как-то выполнить перемещение по ней используя базовый крестик телефона??????????


Что вы хотите этим сказать и какой формат карт вы используете?

Автор: nangel 27.2.2008, 10:58
карта в GIF формате, размеры написал.
если можно, то покажите кодом со списком подключаемых библиотек.

СПАСИБ!!  smile  

Автор: Brodyaga 27.2.2008, 13:03
Что значит не разделяя карту на равные части? Всеровно придёца выдирать из неё кусок, не загружать же всю карту в память телефона.. ресурсов не хватит.

Автор: eugine_s 27.2.2008, 18:06
Тут однозначно нужно резать карту, так как столько в память ты не сможешь использовать:

1153 * 1500 * 2 (каждый пиксель картинки в памяти занимает 2 б) = 3,5 Мб и это только под одну картинку...

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

Если схематически, то вот так:
1 2 3
4 5 6
7 8 9

5-й квадрат отображается на экране(считается, что размер квадрата равен размеру экрана (ну или размеру прямоугольника куда выводиться карта)) , а в памяти так же висят соседние квадраты 1 - 4, 6 - 9.
Пусть тебе нужно двигаться в правую сторону (в направлении квадрата 6), как только сместился на половину квадрата (т.е. половина 6-го квадрата), то квадраты 1,4,7 - освободил из памяти и загрузил другие квадраты. 

Что-то типа такого. Но следует учитывать, что при большом размере экрана(места для отображения карты), этот алгоритм почти не сильно экономит память. 
Например, размер квадрата получился 176х220, тогда размер занимаемой памяти 176*220*9*2 = 700 кб, но если размер квадрата 240х320, то размер памяти = 1,3 мб - а это уже много.

Тогда можно модифицировать алгоритм вот так:

 0    1    2   3
 4    5    6   7
 8    9  10  11
12 13  14  15


И на экране отображаются квадраты 5,6,9,10 (квадрат равен 1/4 размера экрана)
При экране 176х220, память занимаемая будет равна: 44 * 55 * 16 * 2 = 77 кб
(44 = 176 / 4, 55 = 220 / 4)

Автор: Brodyaga 28.2.2008, 10:26
Да... Только перед всем этим тебе нужно разобраца со структурой формата Gif, чтобы знать как вытащить биты для нужного квадрата ;)

Автор: math64 28.2.2008, 11:02
Не нужно разбираться в форате gif. Режешь в графическом редакторе (или пишешь программу резалку если у тебя много карт).
Сохранить куски лучше в png, gif не все телефоны понимают.

Автор: Brodyaga 28.2.2008, 11:13
Цитата

Сохранить куски лучше в png, gif не все телефоны понимают.

Вот поэтому то ему и нужно разобраться в GIF  формате, выдирать куски байт с палитрой и выводить изображение на канву smile

А то что ему каждую карту чтоли резать придёца в редакторе перед помещение на телефон...

Автор: math64 28.2.2008, 11:21
Режешь не J2ME, а в J2SE или на любом другом языке, в котором есть библиотеки для работы с gif и png.
А как писать такую программу нужно спрашивать в форуме по соответвующему языку.

Автор: nangel 28.2.2008, 13:01
eugine_s,  Если можно подробнее как именно это сделать.. 
вот я нарезал 9 квадратов
1 2 3
4 5 6
8 7 9

как программно осуществить переход по картинкам. если есть кодик, то скинь плиз..

Автор: Brodyaga 28.2.2008, 13:05
Вот я и говорю, что ему придёца перед тем как помещать карту в телефон, разрезать её отдельно. И так с каждой картой... А это не есть хорошо! Лучше разобраца с форматом GIF и научица доставать из него любой кусочек.

Автор: Sardar 28.2.2008, 13:22
Цитата(Brodyaga @  28.2.2008,  12:05 Найти цитируемый пост)
Лучше разобраца с форматом GIF и научица доставать из него любой кусочек.

Это не реально, там LZW сжатие, пока прошлые строки пикселей не прочтёшь, текущую не восстановить (словарь). Идея порезать всё на очень малые тайлы самая простая и практичная.

Автор: math64 28.2.2008, 13:45
Резать нужно на 25 квадратов (если у тебя экран 240x320) или больше (если экран меньше).
Код

int x,y; // координаты левого верхнего угла
int wImage, hImage; // размеры одного квадрата
/** массив для хранения квадратов
 * если хватает памяти - загружай все,
 * если нет - устанавливай в null те которых нет на экране
 */
Image images[][] = new Image[5][5];
public void paint(Graphics g) {
  int w = getWidth ();
  int h = getHeight ();
  int i = x / wImage;
  int j = y / hImage;
  int sx = x % wImage;
  int sy = y % hImage;
  int sw = wImage - sx;
  int sx = wImage - sy;
  int dx = 0;
  int dy = 0;
  // отрисовка первого квадрата
  g.drawRegion (images[i][j], sx, sy, sw, sh, Sprite.TRANS_NONE, dx, dy, Graphics.LEFT | Graphics.TOP);
  // отрисовка других квадратов
  ...
}
public void keyPressed(int code) {
    int a = getGameAction (code);
   switch(a) {
     case FIRE:
        // выбор
        return;
     case LEFT:
        x -= dx;
        break;
     case RIGHT:
        x += dx;
        break;
     case UP:
        y -= dy;
        break;
     case DOWN:
        y += dy;
        break;
   }
   // Обнуление ненужных images, загрузка нужных
}


Добавлено через 5 минут и 44 секунды
Brodyaga, как раз то что ты предлагаешь - ненормально.
Нормально: делается шаблонное J2ME приложение с тестовой картой и пишется программа, которая режет реальную карту и подменяет ею тестовую в шаблонном приложении.

Автор: eugine_s 28.2.2008, 15:00
nangel, квадратов всего не обязательно будет 9 штук (хотя если всего 9 штук, то смысла нет в таком методе). Квадратов может быть на много больше - N (например N = 100). Эти все квадраты ты получаешь из большой карты на компьютере, разрезав ее на маленькие квадраты (про размер этих квадратов уже писалось) и сохранив их в формате png (про gif тоже уже писали - не все телефоны его поддерживают)

Из этих N квадратов, тебе нужно выбрать один квадрат - центральный и 8 его "соседей".... а уже нарисовать картинку на экране - это не сложно, math64 привел вариант как это можно сделать.

Автор: nangel 29.2.2008, 03:01
Спасибо всем, может кто знает спец прогу для нарезки картинки на куски???

Автор: eugine_s 29.2.2008, 11:04
nangel, у тебя много карт или одна?
Если одна, две, то можно фотошопом обойтись, если больше, то слышал что тоже можно в фотошопе сделать автомат какой-то, но это только слышал, точно не знаю. Можно самому написать программу на большой джаве.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)