Сколько таймеров одновременно можно использовать в QML?
Задумал написать игру без использования движка и думаю как реализовать структуру.
Допустим, на форме у меня имеется много объектов одного типа (блоки), которые "существуют сами по себе": Box.qml
Каждый объект появляется вверху формы в случайном месте и падает вниз. Без физики, простое прямолинейное падение как падают блоки в тетрисе.
Чтобы остановить падение блока, когда он упадет на другой блок или достигнет низа формы, я делаю проверку на столкновения таким образом: в каждом блоке (в Box.qml) запускается Timer который вызывает функцию проверки столкновений. Эта функция тоже написана в этом блоке (Box.qml). При этом, после того как произошло столкновение, таймер с проверками не должен останавливаться, потому что текущий блок должен продолжить падение в случае если блок на который он упал исчезнет.
В главном окне (main.qml) конструкция примерна такая: основной таймер каждую секунду создает объект Box и запускает в нем функцию падения (по сути это тоже таймер, который тоже написан в Box.qml)
Такой вариант, как мне кажется, прост в реализации, потому что не нужно создавать игровой цикл и отслеживать в нем каждый объект, потому что каждый объект отслеживает "сам себя", сам знает как падать, сам знает когда остановится, сам знает когда продолжить падать.
Пока ничего не написано, я просто обдумываю как сделать правильнее и вот что меня беспокоит в моем плане: блоков на форме может быть и 50 штук, как отразится такое количество таймеров на производительности? Не сильно ли расточительно использовать таймеры внутри объектов?
Вместо таймеров используйте события.
В Qml практически всё биндятся... не знаю как по-русски, загуглите qml binding
Если проверки необходимо сложные, то лучше перейти от реальных объектов к виртуальным
т.е. создать какую либо карту например
1111111
1002001
1000001
1111111
Где 2 - это Ваш объект.
1- стена
0 - пустое место
Хоть двумерную, хоть трёхмерную.
а потом просто событие генерируйте и взаимодействуйте с ним.
Падение можно заменить на анимацию.
Но лучше всего не использовать qml компоненты а рисовать это всё самостоятельно.
Иначе 50 объектов и адцкие тормоза.
Про события понял =) мне даже в голову не приходило так сделать. Но я, блин, уже нарисовал 1 таймер, который вызывает всякие методы друг за дружкой, однако, подозреваю, что переписать не составит труда )) главное правильно слепить события анимаций, их начало и конец... спасибо за идею :)
Про карту тоже, в принципе, ясно. Но сейчас у меня модель такая - все новые объекты попадают в массив. Каждый объект имеет свойства X и Y игрового поля (boardX, boardY), которые рассчитываются при изменении x и y объекта (onXChanged...). С этими свойствами и работаю, проверяя свободна ли та или иная клетка, перебирая массив.
Как понять не использовать qml компоненты? Какие именно не использовать? У меня почти все объекты - Rectangle с вложенными Image. И что значит рисовать свои? Подключать c++ и рисовать в QPainter'e чтоль? :)