Сколько таймеров одновременно можно использовать в QML?

Задумал написать игру без использования движка и думаю как реализовать структуру.

Допустим, на форме у меня имеется много объектов одного типа (блоки), которые "существуют сами по себе": Box.qml

Каждый объект появляется вверху формы в случайном месте и падает вниз. Без физики, простое прямолинейное падение как падают блоки в тетрисе.

Чтобы остановить падение блока, когда он упадет на другой блок или достигнет низа формы, я делаю проверку на столкновения таким образом: в каждом блоке (в Box.qml) запускается Timer который вызывает функцию проверки столкновений. Эта функция тоже написана в этом блоке (Box.qml). При этом, после того как произошло столкновение, таймер с проверками не должен останавливаться, потому что текущий блок должен продолжить падение в случае если блок на который он упал исчезнет.

В главном окне (main.qml) конструкция примерна такая: основной таймер каждую секунду создает объект Box и запускает в нем функцию падения (по сути это тоже таймер, который тоже написан в Box.qml)

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

Пока ничего не написано, я просто обдумываю как сделать правильнее и вот что меня беспокоит в моем плане: блоков на форме может быть и 50 штук, как отразится такое количество таймеров на производительности? Не сильно ли расточительно использовать таймеры внутри объектов?
  • Вопрос задан
  • 390 просмотров
Пригласить эксперта
Ответы на вопрос 2
@DancingOnWater
50 таймеров - это признак плохой архитектуры.
Ответ написан
PavelK
@PavelK
Вместо таймеров используйте события.
В Qml практически всё биндятся... не знаю как по-русски, загуглите qml binding

Если проверки необходимо сложные, то лучше перейти от реальных объектов к виртуальным
т.е. создать какую либо карту например
1111111
1002001
1000001
1111111
Где 2 - это Ваш объект.
1- стена
0 - пустое место
Хоть двумерную, хоть трёхмерную.
а потом просто событие генерируйте и взаимодействуйте с ним.
Падение можно заменить на анимацию.

Но лучше всего не использовать qml компоненты а рисовать это всё самостоятельно.
Иначе 50 объектов и адцкие тормоза.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы