Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с картой, большая картинка (резать или рисовать) 
V
    Опции темы
inohodec
Дата 27.9.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2



Всем привет smile

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

И так

Есть что то типа карты
Сверху на эту карту накладывается сетка, по которой можно передвигаться либо тачем либо кнопками
И когда пользователь останавливается на какой то клетке и выбирает ее, мы должны знать какую область он выбрал на карте

В принципе очень похоже на google map, только еще на него натянуть сетку
Т.е. когда юзер стоит у края окна и хочет двигаться еще , мы открываем ему новую область карты и на нее соответственно прорисовываем сеть

Надеюсь более менее понятно обьяснил

Есть такой ньюанс - карта довольно большая примерно 3000*3000 пикселей
Отсюда вопрос, так как картинка сама по себе не очень сложная, для простоты обьяснения, допустим это дерево
При чем черно белое и состоит из контуров

Возможно стоит его рисовать, а не разбивать картинку на N частей?
Или же лучше таки разбить?

Ну вот собсно и все пока smile

За ранее спасибо

PM MAIL   Вверх
math64
Дата 27.9.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Если знаешь как рисовать лучше рисовать с помощью Graphics.drawXXX() - рисуй (отрезая те части, которых не видно на экране), при этом получишь бонус: сможешь масштабировать, заменять цвета линий и т.п. Если же картинка сложная - лучше разбить и загружать в память только те куски, которые видны на экране.
PM   Вверх
inohodec
Дата 27.9.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2



math64 Спасибо

Картинка простая, поэтому и подумал в сторону рисования

Но не был уверен как лучше, что легче для телефона, показывать картинку (в принципе тоже отрисовка)
Или рисовать самому по координатам

Спасибо, буду рисовать
PM MAIL   Вверх
math64
Дата 27.9.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Координаты можно ввести в файл ресурса - лучше бинарный (тогда нужно писать программу для его создания), но можно и текстовый.
При боле сложном варианте картинки, но с повторяющимися фрагментами - картинка разбивается на спрайты,  рисуестся с помощью спрайтов.
PM   Вверх
inohodec
Дата 27.9.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2



Опа smile

А не подскажешь где почитать по поводу созднаия бинарного файла и как с этим работать?
PM MAIL   Вверх
math64
Дата 28.9.2011, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



У тебя дерево? Можно так:
Код

public class Node {
public void read(DataInputStream is) {
x = is.readInt();
y = is.readInt();
int count = is.readInt();
childs = new Node[count];
for(int i= 0; i < count; i++)
  (childs[i] = new Node).read(is);
}

public void write(DataOutputStream os) {
os.writeInt(x);
os.writeInt(y);
int count = childs == null ? 0 : childs.length;
os.writeInt(count);
for(int i= 0; i <count; i++)
  childs[i].write(os);
}
public int getX() { return x; }
public void setX(int x) { this.x = x; }
public int getY() { return y; }
public void setY(int y) { this.y = y; }
int x;
int y;
Node[] childs;
}

DataInputStream is = new DataInputSream(getClass().getResource("/tree.bin"));
Node root = new Node();
root.read(is);
dis.close();


Для создания ресурса можешь использовать j2se(второй проект, класс Node используется в j2se-project и j2me-project), но для j2me метод write можно убрать.
Код

Node root = createTree();
DataOutputStream os = new DataOutputSream(new FileOutputStream("../j2me-project/src/tree.bin"));
root.write(os);
os.close();

NВ: в приведённом коде пропущены try/catch

Это сообщение отредактировал(а) math64 - 28.9.2011, 07:56
PM   Вверх
inohodec
Дата 29.9.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2




Спасибо

У меня еще ничего smile
Я еще не думал над конкретной реализацией

Пока просто есть задача, и я попытался выяснить как где и почемsmile
Просто опыта с j2me нет

ПС
А еще такой вопрос, в продолжение темы

Я уже сделал картинку, пикселями прорисованно все что мне надо
А вот как ее ресайзить че то не нашел
Т.е. если работать с картинкой (png, bml, gif), то как бы ничего сложного
А вот если у меня вся картинка из пикселей и в памяти?
PM MAIL   Вверх
math64
Дата 29.9.2011, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Либо ресайзить вручную, попиксельно,
есть возможность получить массив пикселей из картинки и создать картинку из массива пикселей.
 либо иметь несколько комплектов картинок под разные размеры, можно иметь по одной картинке под каждый размер и резать её на спрайты.
Спрайт можно поворачивать на 90, 180, 270 градусов. Если нужно поворачивать на другой угол - нужно подготовить повёрнутую картинку заранее.
Т.е. если заранее известны масштабы и углы поворотов, лучше подготовить соответствующие рисунки заранее (в графическом редакторе или в j2se-проекте).
Если рисуешь линиями - изменять масштаб никаких проблем.
PM   Вверх
inohodec
Дата 29.9.2011, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2



smile 

Ты меня опять запутал

У меня как бы нет проблемы реализовать все в ручную, т.е. я во времени не ограничен и интерес пока есть
Но при этом я понимаю что использовать готовые картинки проще

Вопрос только в том что более правильно

Так как картинка большая 3000*3000, то вопрос в производительности и памяти
Если телефону будет легче справлятся с пикселями и моей ручной прорисовкой, так тому и быть
А если он без проблем сможет работать и с кусочками картинок, тогда это более легкий путь и изобретать свой велосипед я не буду
PM MAIL   Вверх
math64
Дата 29.9.2011, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Показать кусочек картинки можно без проблем, но масштабировать, повернуть, поменять цвет (кроме цвета фона; в этом случае используется картинка с позрачными пикселями) - нужно вручную. Но большая картинка может не загрузиться.
Попробуй сначала загрузить её целиком (сохраняй как монохромную, можешь попробовать разные форматы), проверяй на реальном телефоне, а не эмуляторе - если получится - ОК. делай так.
Если не получится - порежь на куски, убери дублирование (наример, куски где только один фон можно выбросить или оставить в одном экземпляре)
Если выброшенных кусков будет много, из оставшихся можно собрать одну картинку, которая будет грузиться целиком.
Для того, чтобы собрать из кусочков исходную картинку есть класс TiledLayer - поверх него можно добавить слой со спрайтами
Но если различных кусков останется много, выбирать какие из них попадают на экран и отрисовывать нужно самостоятельно (отрисовка одного кусочка проблемы не представляет)
Код

graphics.drawRegion(image, x_src, y_src, width, height, transform, x_dest, y_dest, anchor);

transform позволяет повернуть 90, 180, 270 градусов и отражение, anchor выравнивать влево/вправо/вверх/вниз/по центру
шрифтов выбор не велик, и какие шрифты есть в телефоне не известно, поэтому для вывода надписей часто используется картинка с буквами, каждую букву можно оформить спрайтом.
PM   Вверх
inohodec
Дата 29.9.2011, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.12.2004

Репутация: нет
Всего: 2



Ок

Пока нет необходимости менять цвет или поворачивать

Поэтому, если я тебя правильно понял, пойду по пути готовых картинок
Разрежу свою большую картинку на N маленьких и буду их показывать

Спасибо smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0538 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.