Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
Kagami |
14.7.2009, 18:17
Сообщение
#11
|
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9
|
Я не совсем это имел в виду. Тебе надо переопределить функцию, рассчитывающую столкновения. Она будет сама вызываться при необходимости. В последнем обновлении документации пример Colliding Mice был переведен на русский. Посмотри его внимательней (заодно ошибки поищешь
|
|
|
|
|
Litkevich Yuriy |
14.7.2009, 19:25
Сообщение
#12
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Petr0vi4, щёлкай по имени автора поста, вместо цитаты. Его имя сразу добавится в форму быстрого ответа.
|
|
|
|
|
Petr0vi4 |
15.7.2009, 6:26
Сообщение
#13
|
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 14.7.2009 Пользователь №: 907 Спасибо сказали: 0 раз(а) Репутация: 0
|
Kagami, пришлось перелопатить все программу. Сделал теперь класс Control наследником QGraphicsEllipseItem, наследство от QObject убрал за ненадобностью (сначала хотел использовать сигналы/слоты, но потом отпало). Переписал функцию collidesWithItem() для молекул, работает, но как теперь отличить молекулу от стены?
|
|
|
|
|
Kagami |
15.7.2009, 17:34
Сообщение
#14
|
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9
|
Посмотри в документации по QGraphicsItem::UserType и QGraphicsItem::type(). При определении столкновения смотришь какого типа исследуемый объект. Если это молекула или стена, то ты уже знаешь что с ними делать. В противном случае можно вызывать метод родителя.
|
|
|
|
|
Petr0vi4 |
16.7.2009, 15:29
Сообщение
#15
|
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 14.7.2009 Пользователь №: 907 Спасибо сказали: 0 раз(а) Репутация: 0
|
Что-то плохо все работает, может все-таки решить проблему как-то по-другому? Вроде программа простая.
|
|
|
|
|
Kagami |
16.7.2009, 16:02
Сообщение
#16
|
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9
|
Может выложишь исходники программы? Если она, конечно, не секретная
|
|
|
|
|
Petr0vi4 |
16.7.2009, 16:28
Сообщение
#17
|
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 14.7.2009 Пользователь №: 907 Спасибо сказали: 0 раз(а) Репутация: 0
|
|
|
|
|
|
Kagami |
16.7.2009, 22:07
Сообщение
#18
|
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9
|
Мда.. в коде пока особо не копался, но нашел одно узкое место, устранение которого резко повысило скорость. Проблема была в функции Control::BallCollision(). Ты постоянно вызывал функцию collidingItems(), что приводило к постоянному созданию и удалению списка элементов. Правильнее было бы так:
Раскрывающийся текст Я вызываю эту функцию один раз и сохраняю полученный список в локальной переменной. Впрочем, к работоспособности кода это имеет мало отношения P.S. Теперь узким местом стала фунция Module(). Поэтому в Control::MoveBall() я заменил ее на qAbs(). Сообщение отредактировал Kagami - 16.7.2009, 22:24 |
|
|
|
|
Petr0vi4 |
17.7.2009, 2:18
Сообщение
#19
|
|
Студент ![]() Группа: Новичок Сообщений: 11 Регистрация: 14.7.2009 Пользователь №: 907 Спасибо сказали: 0 раз(а) Репутация: 0
|
Ну вообще-то это и есть правильно, но медленно.
|
|
|
|
|
Kagami |
17.7.2009, 7:25
Сообщение
#20
|
|
Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9
|
После исправлений у меня стало работать со 100 элементами довольно шустро
|
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 26.12.2025, 8:39 |