Hola.
No estoy seguro de tu código porque no colocas nada para dar más pistas, considero que podrías resolver el problema usando interrupciones, una interrupción que apunte a la función que lea las variables y luego procesarlas según la etapa en que está corriendo tu programa.
Saludos
no puse codigo porque estoy haciendo pruebas y esta muy desordenado (al nivel que solo yo lo entiendo). Ademas no es tan relevante porque el problema que tengo es del lenguaje ya que no soy experto en c/c++ y no se como implementar lo que quiero hacer. Yo he trabajado con unity 3d que utiliza c# y java y ahí si podía hacerlo.
Hare una descripción mas clara del problema
las variables mouseX y mouseY siempre guardan la posición del mouse (estoy usando una pantalla tft touch y el mouse es el lapiz que uso para presionar). Con esta parte no hay problema.
la función actualizar() revisa las variables mouseX mouseY (comunes para todo objeto de la clase) y utilizando la posición y las dimensiones del botón cambia a true la variable press si el mouse esta dentro del boton. Aqui tampoco hay problema.
El problema es que estoy probando con 12 botones y tengo que hacer esto.
Con cada botón que agregue tengo que llamar la función actualizar() (imagina con 40 botones) y lo que quiero es llamar algo así como una función estática de la clase y que todas sus instancias se ejecute la función actualizar().
En unity 3d por ejemplo cada vez que inicia(o termina no me acuerdo) un frame la función Update() se llama en todos los objetos que existan en ese momento.
¿Los botones son físicos o son un área definida de la pantalla? Esto es determinante para usar las interrupciones.
¿Que modelo de Arduino usas?
Si no sabes de interrupciones entonces es probable que tu enfoque está dejando por fuera la capacidad de el Microprocesador y deja de ser un problema netamente de programación en C/C++, te recomiendo enormemente leer y entender sobre el uso e implementación de interrupciones.
Por otro lado el planteamiento de tu problema está incompleto si no adjuntas código, es bastante difícil "imaginar" lo que explicas.
Por lo poco que describes, creo que tus botones están "dibujados" en la pantalla y no son botones realmente, sino un área confinada de la pantalla que delimita funciones al presionar en ese lugar. Si es así tendrás que orientar hacia otro enfoque.
pero solo necesitas algo que te diga que el mouse esta dentro de un area. Eso esta muy documentado en la web y resuelto.
la posición del mouse tendrá coordenadas x,y y el area del boton x1,y1 y x2,y2 si las tomo como extremos diagonales.
Asi que x debe estar entre x2 y x1 y además
y debe estar entre y2 e y1
//si calculas
const int dx = x2-x1 // dx (delta X)
//si calculas
int dy = y2-y1 // dy (delta Y)
//Luego si calculas
if (abs(x2-x) <= dx && abs(y2.y) <= dy) {
//estas dentro de la region
}
else {
// estas fuera de la region
}
Creo que no estamos respondiendo exactamente a lo que ha preguntado kirec. O por lo menos me parece que la pregunta no era esa y que nos hemos desviado del tema.
Yendo a lo que considero que era la pregunta; igual hay otras soluciones mejores, pero creo que lo mejor sería hacer una clase contenedora en la que registres, gestiones y destruyas los botones.
Esa clase, digamos que la llamamos pantalla, tendría un array o una cola de objetos botón. En su método actualizar, recorrerías ese array de botones y devolvería el elemento sobre el que se actuó.
Por ejemplo, un bosquejo podría ser algo así, aunque seguro que se te ocurren mil variantes:
class Pantalla {
public:
Pantalla(Boton *botones, int numero);
int chequear(void);
private:
Boton *arrayBotones;
int numBotones;
}
Y a grandes rasgos, el método chequear:
int Pantalla::chequear(void) {
for (int i=0; i<numBotones;i++) {
if (arrayBotones[i].actualizar==true)
return i;
}
return -1;
}
Noter es lo que dices entendiste mi pregunta, algo asi es lo que quiero hacer. Me diste una idea con el puntero array aunque no tengo que hacer una clase contenedora, puedo en la misma clase.
Sí. Podrías hacerlo en la misma clase utilizando miembros estáticos, pero utilizando una clase contenedora podrías definir, por así decirlo, distintas pantallas, cada una con su grupo de botones.
Por supuesto que la decisión buena será la que tomes tú. Sólo lo comento como ejemplo de análisis de los pros y contras las mil variantes que te decía que podrías utilizar.
En todo caso y una vez que inicies, si te atascas y necesitas ayuda, por aquí me tienes.
Saludos.