Russian Qt Forum
Ноябрь 26, 2024, 12:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Посоветуйте как реализовать  (Прочитано 5766 раз)
merke
Гость
« : Февраль 25, 2011, 08:13 »

Всем привет!

Необходимо реализовать следующий функционал.
Допустим есть здание, необходимо нарисовать его план.
Есть неподвижные стены, т.е. один раз нарисовал и всё - двигать их нельзя, можно только кое где стирать инструментом Ластик.
Стены рисуются простыми линиями.
Теперь есть ещё динамические объекты: столы ну т.е. мебель, которые мы добавляем в план и можем их передвигать, менять их размеры, поворачивать, удалять.
В графике на Qt я пока не силен, только один день пытаюсь рисовать)
Так вот, я это делаю следующим образом.
Наследуюсь от класса сцены, там переопределяю события мыши и т.д.
Далее рисую на сцене квадратики, круглишки и скармливаю сцену графиквьюверу.
Всё прорисовывается, я могу двигать объекты, удалять их. Сохранять координаты объектов в файл, далее подгружать их от туда и перерисовать сцену.
Теперь мне нужно нарисовать стены. Думаю так, так как стены будут статичными, я буду рисовать линии на сцене и далее конвертировать сцену в картинку и сохранять её к примеру в формате .jpeg на жесткий диск. При загрузке программы, я буду подгружать данную картинку со стенами и далее уже из файлика буду подгружать координаты мебели и отрисовывать их.

Блин может я мудрю сильно?
Записан
twp
Гость
« Ответ #1 : Февраль 25, 2011, 12:14 »

могу посоветовать глянуть как сделана эта демка http://labs.qt.nokia.com/2008/12/02/widgets-enter-the-third-dimension-wolfenqt/
Записан
fuCtor
Гость
« Ответ #2 : Февраль 26, 2011, 22:12 »

Мудрите, посмотрите на QGraphicsItem.
Переопределяем обработу мыши, чтобы таскать, вращать и растягивать. Переопределяем событие рисования и там делаем отображение. Ну и так далее. То что статично, будет статично лежать на сцене, с остальным можно что угодно делать, хоть проверять на столкновение со стенами при таскании  Смеющийся.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 26, 2011, 22:59 »

..хоть проверять на столкновение со стенами при таскании  Смеющийся.
Интересно как это сделать? Или просто так, к слову сказали?  Улыбающийся
Записан
fuCtor
Гость
« Ответ #4 : Февраль 27, 2011, 06:34 »

И к слову и к функции из документации:
Цитировать
QList<QGraphicsItem *> QGraphicsItem::collidingItems ( Qt::ItemSelectionMode mode = Qt::IntersectsItemShape ) const

Returns a list of all items that collide with this item.

The way collisions are detected is determined by applying mode to items that are compared to this item, i.e., each item's shape or bounding rectangle is checked against this item's shape. The default value for mode is Qt::IntersectsItemShape.

See also collidesWithItem().

Где флаг:
Цитировать
Qt::ContainsItemShape   0x0   The output list contains only items whose shape is fully contained inside the selection area. Items that intersect with the area's outline are not included.
Qt::IntersectsItemShape   0x1   The output list contains both items whose shape is fully contained inside the selection area, and items that intersect with the area's outline. This is a common mode for rubber band selection.
Qt::ContainsItemBoundingRect   0x2   The output list contains only items whose bounding rectangle is fully contained inside the selection area. Items that intersect with the area's outline are not included.
Qt::IntersectsItemBoundingRect   0x3   The output list contains both items whose bounding rectangle is fully contained inside the selection area, and items that intersect with the area's outline. This method is commonly used for determining areas that need redrawing.

Тут уже выбираем нужно и все.
Записан
merke
Гость
« Ответ #5 : Февраль 27, 2011, 15:09 »

Спасибо! А как же все таки сделать чтобы при перетаскивании объектов нельзя было натолкнуться на стену?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 27, 2011, 15:20 »

Спасибо! А как же все таки сделать чтобы при перетаскивании объектов нельзя было натолкнуться на стену?
Мне тоже интересно. Вот напр. простенький план 2-х комнатной квартиры - несколько прямоугольников у каждого есть двери (т.е. в комнату можно зайти). Что говорит об этом великий и могучий Assistant? Какие классы надо изыскивать?
Записан
merke
Гость
« Ответ #7 : Февраль 27, 2011, 15:25 »

Дня три тому назад на форумах находил игрушку Сокобан на кутях написанная. Так вот блин на работе исходники оставили. Там было кажется это реализовано. Придется до завтра подождать. 
Записан
fuCtor
Гость
« Ответ #8 : Февраль 27, 2011, 15:44 »

Не проверял, но в голову приходит следующая схема:
- сабклассим QGraphicsItem (кроме основных также сабкласим QShape shape() const)
в котором формируем нашу фигуру (стену), которую можно потом и для отрисовки использовать и бокс получить.
- сабклассим по такой же схеме но например для СТОЛА, соответственно shape будет окружность. + сабкласим для СТОЛА мышиные события по принципу: сначала сохраним текущее положение, прокинем в родительский класс, получим новое положение, проверим есть ли колизия (с флагом проверки по shape), если есть возвращаем старое значение.

Как-то так.

Так же при перегруженном shape проклик будет идти именно по данной фигуре, собственно как и положено, а не по боксу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Февраль 27, 2011, 16:12 »

- сабклассим по такой же схеме но например для СТОЛА, соответственно shape будет окружность. + сабкласим для СТОЛА мышиные события по принципу: сначала сохраним текущее положение, прокинем в родительский класс, получим новое положение, проверим есть ли колизия (с флагом проверки по shape), если есть возвращаем старое значение.
Ну это вряд ли т.к. мыша может "перепрыгнуть" через тот же стол, т.е. на начальном и конечном положениях никаких коллизий нет.
Записан
fuCtor
Гость
« Ответ #10 : Февраль 27, 2011, 16:58 »

Согласен, при подвисании приложения и резком движении такой проскок возможен. В остальных случаях вполне имеет право быть. Других вариантов пока не вижу, хотя можно посмотреть как реализуют это в gamedev-e.

ЗЫ вариант извращенный: Box2D =)) микроскопом гвозди )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.064 секунд. Запросов: 23.