Делаю меню для ардуинки + tft . Меню выглядит как 3Х3 кнопки, расчет размеров кнопок и позиционирование кнопок расчитывается автоматически в зависимости от размеров экрана. Теперь нужно так же динамически определить области касания на экран, что бы определить какой кнопки коснулись. В начале программы объявляю переменную int points; В setup у меня вызывается функция, которая отрисовывает блоки(кнопки). В ней есть цикл Код (C++): for(int i=0; i<countbutton;i++){ Тут идет отрисовка ккнопок fillRoundedRect по x1,y1,x2,y2 //Далее этии данные нужно записать в массив points[] = {int x1,int y1,int x2,int y2}; } Потом этот массив points нужно в loop разобрать и в цикле определять какой кнопки коснулись. Но я не могу разобрать этот массив. Пишет ошибки. В функции loop Код (C++): for(int k=0;k<points.length(),k++){ int x1 = points[k][0]; int y1 = points[k][1]; int x2 = points[k][2]; int y2 = points[k][3]; } Чую что страдает синтаксис и я делаю все не так =(
Тут точку с запятой. Такого нет. Размер массива проще всего хранить в переменной. А еще если какие-то ошибки, то их надо тоже выкладывать.
Переменную points Вы объявляет как целочисленную, инициализируете как одномерный массив, а обращаетесь как двумерному массиву. Это у Вас реально так в коде? Удобнее будет определить структуру, описывающую координаты кнопки, и объявить переменную массив таких структур.
Объявлять массив так? int points = {}; Как объявить и инициализировать двумерный массив? Если я не знаю его размеров. Сорри. Спешил. Вообще пример писал на память, так как рядом нет ардуины .
Код (C++): // объвляем int* array; // когда становится ясно с размером - выделяем память array = malloc(sizeof(int) * size_x * size_y); А вообще надо почитать, что такое массивы в C и C++, иначе ничего не выйдет.
то есть в моем случае, если массив собирается в цикле то Код (C++): for(){ array[] = malloc(sizeof(int) * size_x * size_y); } так? а где запятые между значениями массива?
Объявлять так (для 9 значений): Код (C++): int points[9]; Объявить и инициализировать двумерный массив: Код (C++): int points[3][3] = { {1, 2, 3}, {1, 2, 3}, {1, 2, 3} }; Про размер не совсем понятно, Вы же писали: т. е. размер массива для 9 кнопок не знаете, или вопрос был "вообще"?
Я пришел из php там с массивами все проще. Поэтому не серчайте. У меня на экране 9 кнопок Что бы отрисовать одну надо знать 4 (x1,y1,x2,y2) точки. Эти 4 точки вычисляются в зависимости от разрешения экрана. Мне нужно в массив сохранить 4 точки каждой из 9 кнопок. И потом этот массив разобрать в цикле и понять на какую кнопку я нажал. Кнопки отрисовываются один раз в Setup()
элементарная математика, сэры const unsigned int W - ширина экрана const unsigned int H - высота экрана const byte n - количество кнопок в строке или ряду const byte sb - расстояние между кнопками const byte ss - отступ от края экрана до кнопки Ширина кнопки unsigned int Bw = (W - ss*2 - sb*(n-1)) / n Высота кнопки unsigned int Bh = (W - ss*2 - sb*(n-1)) / n Если система координат идет с правого верхнего угла, то координаты кнопки 1 будут: x1 = 0 + ss, y1 = 0 + ss, x2 = x1 + Bw, y2 = y1 + Bh. По аналогии, для второй кнопки: x1 = 0 + ss + Bw + sb, y1 = 0 + ss + Bh + sb, x2 = x1 + Bw, y2 = y1 + Bh. А для определения нажатия смотрим в цикле попали ли в диапазон области кнопки: Код (C++): for (byte i = 0; i < n; i++) if (x > x1[i] && x < x2[i] && y > y1[i] && y < y2[i]) ...
Делаю структуру кнопок в которой кроме координат есть всякое разное, цвет там, надписи и тд. Вывожу на экран в начале, дальше они меняются в зависимости от ситуации, например при нажатии. Для определения куда тыкнулась мышь приходится прогонять ее координаты по всем кнопкам на предмет вхождения в них. В принципе, работает хорошо, Но вот и думаю, может есть способ работы с областями в окне проще? Как в Visual Studio например?
а с массивами то что?)) как координаты точек сохранить что бы потом цикле проверить на предмет вхождения
а зачем их сохранять? Пусть высчитывает в реальном времени, все равно проц 95% времени бьет баклуши. Формулы выше.
Структура, она же массив из разнотипных данных. Можно просто массив, но ориентироваться в нем сложнее. При клике получаем координаты клика и перебором проверяем входят они в кнопку или нет, пока не найдем эту кнопку или они не закончатся (кликнули не в кнопку).
У меня не бьет баклуши, А занимается отрисовыванием данных на tft с 9 датчиков одновременно и приемом этих данных через Serial, сами кнопки отрисовываются 1 раз при загрузке, поэтому и нужно знать в любой момент что бы небыло задержек в работе.