J'utilise GLFW 3.2.1 pour faire un petit programme qui crée des points sur ma fenêtre quand on clique dessus.
Le hic, c'est que je n'arrive pas à récupérer les coordonnées du clic. Dans mon programme j'utilise la fonction:
glfwSetMouseButtonCallback(window, callback)
C'est justement ça le problème, dans la fonction de callback j'utilise :
glfwGetCursorPos(window, &int, &int);
pour avoir les coordonnées du click. Je voudrais ensuite créer une instance de ma classe Point et l'ajouter à un vecteur.
Il y a un soucis de scope car je ne sais pas comment accéder aux deux int de GetCursorPos.
J'avais envisagé de passer une lambda à la place du callback en capturant le vecteur, mais j'ai une erreur de type : "No matching function for call to 'glfwSetMouseButtonCallback'" à la ligne 19. Voici le code de mon main.cpp :
int main(void){
if (!glfwInit())
{
std::cout<<"INIT KO\n";
}
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
GLFWwindow* window = glfwCreateWindow(1000, 750, "My Title", NULL, NULL);
if (!window)
{
std::cout<<"WINDOW CREATED KO\n";
}
std::vector<Point> v;
glfwMakeContextCurrent(window);
glfwSetMouseButtonCallback(window, [&v](GLFWwindow* window, int button, int action, int mods) { //ERREUR ICI
double xpos, ypos;
if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) {
glfwGetCursorPos(window, &xpos, &ypos);
Point *p = new Point((float) xpos, (float) ypos);
v.push_back(&p); //J'ai aussi une erreur similaire ici
std::cout << "Click ! : "<<xpos<<", "<<ypos<<"\n";
}
});
while (!glfwWindowShouldClose(window))
{
//Poll for and process events
glfwPollEvents();
}
glfwTerminate();
return 0;
}
Je voudrais savoir si vous aviez des suggestions pour pouvoir créer mes points à partir d'un click utilisateur.
Merci d'avoir lu !
- Edité par VincentMaquiaba 1 février 2019 à 19:54:50
Les lambda ont des types qui varient en fonction du compilateur, du coup leurs types ne correspondent pas à ce que glfw attend.
Sinon il existe 2 fonctions qui pourraient t'aider: glfwSetWindowUserPointer et glfwGetWindowUserPointer. A utiliser de cette manière :
glfwSetWindowUserPointer(window, &v);
// Dans le callback
auto points = static_cast<std::vector<Point>*>(glfwGetWindowUserPointer(window));
assert(points);
points->push_back(Point{static_cast<float>(xpos), static_cast<float>(ypos)});
Sinon les pointeurs nus et les cast C-style ne sont pas terribles...
- Edité par eugchriss 2 février 2019 à 8:26:47
Eug
[GLFW] - Coordonnées curseur via callback
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Eug