[opengl] glutSpecialFunc() w obiekcie

0

Witam.

Próbuje stworzyć klasę obsługi klawiatury i myszki do OPENGL. Jednak napotkałem się na problem. mianowicie w konstruktorze próbuję ustawić funkcję obsługi klawiatury:

	glutSpecialFunc(Keyboardmouse::keyDown);

jest to oczywiście funkcja tego obiektu

void keyDown(int,int,int);

Nie chce mi się to skompilować gdyż krzyczy żeby zrobić z tej funkcji referencje. Oczywiście to nie pomaga.

Zastanawiam się, czy nie muszę stworzyć prywatnego obiektu w konstruktorze i jako funkcję podać funkcję tego wewnętrznego obiektu, bo teraz niezbyt ma się do czego odwołać. Statyczna funkcje też być nie może gdyż musi działać na zmiennych obiektu.

Mam jeszcze jedno teoretyczne pytanie. Czy takie coś zdziała? Tzn czy przy naciśnięciu klawisza GLUT wywoła sobie funkcję tego obiektu i zaktualizuje wszystkie zmienne obiektu?

pozdrawiama

0

nie wiem po co Ci operator zakresu ::, gdzie zdefiniowałeś tą funkcję?
powinno działać:

 void spec(int key, int x, int y){...} //globalnie

glutSpecialFunc(spec); //w main()

p.s. podaj więcej kodu może

0

no włąsnie o to chodzi, że to nie jest w main tylko w klasie.

//  klasa obsługi klawiatury i myszki

class Keyboardmouse
{
private:
	// wspolrzedne myszki
	int xMouse;
	int yMouse;
	
	// poprzednie wspolrzedne myszki
	int lastXMouse;
	int lastYMouse;
	
	// tablica przycisnietych klawiszy
	bool key[200];


public:
	// zerujemy wcisniete klawisze i przypisujemy myszce jej aktualna pozycje na ekranie. 
	// ustawiamy funkcje przewanie za domyslnie obslugujaca klawiature i myszkę. 
	 Keyboardmouse(void);

	 // zwraca wspolrzedna x myszki 
	 inline int getMouseXPosition(void) {return this->xMouse ;};
	
	 // zwraca wspolrzedna y myszki 
	 inline int getMouseYPosition(void){return this->yMouse ;};
	
	 // zwraca wspolrzedna x myszki w ostatnio zapamietanym miejscu na ekranie
	 inline int getLastMouseXPosition(void){return this->lastXMouse ;};
	
	 // zwraca wspolrzedna y myszki w ostatnio zapamietanym miejscu na ekranie
	 inline int getLastMouseYPosition(void){return this->lastYMouse ;};

	 // sprawdza czy ruszalismy myszka
	 bool didMouseMove(void);

	 // sprawdza czy jest naciesniety klawisz
	 bool isPressed(int);
	
	 // sprawdza czy sa naciesniete dwa klawisze
	 bool isPressed(int,int);
	
	 // sprawdza czy sa nacisniete trzy klawisze
	 bool isPressed(int,int,int);
	 

	 void keyDown(int,int,int);
};
#include "keyboardmouse.h"
#include "gl\glut.h"

Keyboardmouse::Keyboardmouse(void)
{
	for(int i = 0 ; i<200 ;i++)
		this->key[i] = false;


	this->lastXMouse = 0;
	this->lastYMouse = 0;

	//this->xMouse = this->getMouseXPosition();
	//this->yMouse = this->getMouseYPosition();
	
      glutSpecialFunc(Keyboardmouse::keyDown);   // <- TUTAJ PROBLEM
}

void Keyboardmouse::keyDown(int c,int x, int y)
{
	
}

bool Keyboardmouse::didMouseMove()
{
	if(this->xMouse != this->lastXMouse)
		return true;
	if(this->yMouse != this->lastYMouse)
		return true;

	return false;
}

tak jak pisałęm wcześniej próbuje przekazać funkcje obiektu, którego nie ma a nie moze być to funkcja statyczna

0

a ja ci powiem, że to musi być funkcja statyczna.
musisz przekazywać wskaźnik do obiektu na którym pracujesz w jakiś inny sposób.
Zapewne jest tak, że istnieje jakaś fuinkcja w stylu:

glutSpecialFuncEx(function, user defined value);

i w callbacku robisz jakoś tak:

class ABC{ 
   //... 
   static callback(int c, int x, int y, int user) {
      ABC* _this = reinterpret_cast<ABC*>(user);
      _this->funkcjaNiestatyczna(c,x,y);
      }

a podpinasz jakoś tak:

glutSpecialFuncEx( &ABC::callback, reinterpret_cast<int>(this) );
0

nie możesz się odwołać do metody niestatycznej przez nazwę klasy, tylko przez nazwę obiektu.
możesz zrobić tak: zdefiniuj sobie tę funkcję jako globalną i jakiś globalny wskaźnik do obiektu na którym ma ta funkcja działać (albo tablicę obiektów). i przy wywołaniu glutSpecialFunc() sprawdzałaby na jakich obiektach ma wykonać operacje. myślę, że to najprostrzy sposób (pewnie nie najlepszy).
ewentualnie metoda statyczna i odpowiednie pola też statyczne.
o funkcji glutSpecialFuncEx() nigdy nie słyszałem ale pracowałem z opengl'em tyle ile musiałem więc nie znam go za dobrze

0

owszem, jak nie ma żadnej funkcji "exowej", która pozwalałaby przekazywać parametr użytkownika, to nie pozostaje niewielki wybór, i przez obiekt globalny trzeba przekazywać.

0

rozwiązałem to dodając instancję obiektu w klasie oraz klasę zaprzyjaźnioną

Keyboardmouse::Keyboardmouse(void)
{
	this->object = new Keyboardmouse(2);

}


Keyboardmouse::Keyboardmouse(int t)
{

	for(int i = 0 ; i<200 ;i++)
		this->object->key[i] = false;


	this->object->lastXMouse = 0;
	this->object->lastYMouse = 0;

	this->object->xMouse = 0;
	this->object->yMouse = 0;
	
	glutSpecialFunc(keyDown);
}
	friend void keyDown(int,int,int);
0

Jednak nie do końca działa tak jak powinno.

Nie mogę się uporać z takim problemem. Mianowicie mam globalny wskaźnik na obiekt

Keyboardmouse *mouseKey;

deklaracja z main.cpp jednak chciałbym go użyć w pliku keyboardmouse.cpp. jendak jeżeli tam dam deklaracje tego wskaźnika to w main pokazuje mi że taka zmienna nie istnieje :-(

0

extern Keyboardmouse *mouseKey;

1 użytkowników online, w tym zalogowanych: 0, gości: 1