Russian Qt Forum
Ноябрь 26, 2024, 10:38
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Посоветуйте как реализовать
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Посоветуйте как реализовать (Прочитано 5759 раз)
merke
Гость
Посоветуйте как реализовать
«
:
Февраль 25, 2011, 08:13 »
Всем привет!
Необходимо реализовать следующий функционал.
Допустим есть здание, необходимо нарисовать его план.
Есть неподвижные стены, т.е. один раз нарисовал и всё - двигать их нельзя, можно только кое где стирать инструментом Ластик.
Стены рисуются простыми линиями.
Теперь есть ещё динамические объекты: столы ну т.е. мебель, которые мы добавляем в план и можем их передвигать, менять их размеры, поворачивать, удалять.
В графике на Qt я пока не силен, только один день пытаюсь рисовать)
Так вот, я это делаю следующим образом.
Наследуюсь от класса сцены, там переопределяю события мыши и т.д.
Далее рисую на сцене квадратики, круглишки и скармливаю сцену графиквьюверу.
Всё прорисовывается, я могу двигать объекты, удалять их. Сохранять координаты объектов в файл, далее подгружать их от туда и перерисовать сцену.
Теперь мне нужно нарисовать стены. Думаю так, так как стены будут статичными, я буду рисовать линии на сцене и далее конвертировать сцену в картинку и сохранять её к примеру в формате .jpeg на жесткий диск. При загрузке программы, я буду подгружать данную картинку со стенами и далее уже из файлика буду подгружать координаты мебели и отрисовывать их.
Блин может я мудрю сильно?
Записан
twp
Гость
Re: Посоветуйте как реализовать
«
Ответ #1 :
Февраль 25, 2011, 12:14 »
могу посоветовать глянуть как сделана эта демка
http://labs.qt.nokia.com/2008/12/02/widgets-enter-the-third-dimension-wolfenqt/
Записан
fuCtor
Гость
Re: Посоветуйте как реализовать
«
Ответ #2 :
Февраль 26, 2011, 22:12 »
Мудрите, посмотрите на QGraphicsItem.
Переопределяем обработу мыши, чтобы таскать, вращать и растягивать. Переопределяем событие рисования и там делаем отображение. Ну и так далее. То что статично, будет статично лежать на сцене, с остальным можно что угодно делать, хоть проверять на столкновение со стенами при таскании
.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Посоветуйте как реализовать
«
Ответ #3 :
Февраль 26, 2011, 22:59 »
Цитата: fuCtor от Февраль 26, 2011, 22:12
..хоть проверять на столкновение со стенами при таскании
.
Интересно как это сделать? Или просто так, к слову сказали?
Записан
fuCtor
Гость
Re: Посоветуйте как реализовать
«
Ответ #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
Гость
Re: Посоветуйте как реализовать
«
Ответ #5 :
Февраль 27, 2011, 15:09 »
Спасибо! А как же все таки сделать чтобы при перетаскивании объектов нельзя было натолкнуться на стену?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Посоветуйте как реализовать
«
Ответ #6 :
Февраль 27, 2011, 15:20 »
Цитата: Александр от Февраль 27, 2011, 15:09
Спасибо! А как же все таки сделать чтобы при перетаскивании объектов нельзя было натолкнуться на стену?
Мне тоже интересно. Вот напр. простенький план 2-х комнатной квартиры - несколько прямоугольников у каждого есть двери (т.е. в комнату можно зайти). Что говорит об этом великий и могучий Assistant? Какие классы надо изыскивать?
Записан
merke
Гость
Re: Посоветуйте как реализовать
«
Ответ #7 :
Февраль 27, 2011, 15:25 »
Дня три тому назад на форумах находил игрушку Сокобан на кутях написанная. Так вот блин на работе исходники оставили. Там было кажется это реализовано. Придется до завтра подождать.
Записан
fuCtor
Гость
Re: Посоветуйте как реализовать
«
Ответ #8 :
Февраль 27, 2011, 15:44 »
Не проверял, но в голову приходит следующая схема:
- сабклассим QGraphicsItem (кроме основных также сабкласим QShape shape() const)
в котором формируем нашу фигуру (стену), которую можно потом и для отрисовки использовать и бокс получить.
- сабклассим по такой же схеме но например для СТОЛА, соответственно shape будет окружность. + сабкласим для СТОЛА мышиные события по принципу: сначала сохраним текущее положение, прокинем в родительский класс, получим новое положение, проверим есть ли колизия (с флагом проверки по shape), если есть возвращаем старое значение.
Как-то так.
Так же при перегруженном shape проклик будет идти именно по данной фигуре, собственно как и положено, а не по боксу.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Посоветуйте как реализовать
«
Ответ #9 :
Февраль 27, 2011, 16:12 »
Цитата: fuCtor от Февраль 27, 2011, 15:44
- сабклассим по такой же схеме но например для СТОЛА, соответственно shape будет окружность. + сабкласим для СТОЛА мышиные события по принципу: сначала сохраним текущее положение, прокинем в родительский класс, получим новое положение, проверим есть ли колизия (с флагом проверки по shape), если есть возвращаем старое значение.
Ну это вряд ли т.к. мыша может "перепрыгнуть" через тот же стол, т.е. на начальном и конечном положениях никаких коллизий нет.
Записан
fuCtor
Гость
Re: Посоветуйте как реализовать
«
Ответ #10 :
Февраль 27, 2011, 16:58 »
Согласен, при подвисании приложения и резком движении такой проскок возможен. В остальных случаях вполне имеет право быть. Других вариантов пока не вижу, хотя можно посмотреть как реализуют это в gamedev-e.
ЗЫ вариант извращенный: Box2D =)) микроскопом гвозди )
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...