DarkMo
Lötkolbengott/-göttin
huhu, durch unseren Cymes bin ich mal wieder in Schwung gekommen... gott, ich nutz sogar schon shift >< nene, das verbrauch zuviel saft.
also jedenfalls hab ich bei mir jetz mal ne maussteuerung versucht. bedienung soll wie folgt funtzen: rechtsklicke ich mit der maus, kann ich durch die mausbewegung den blickwinkel ändern. durch rollen am mausrad fährt er vor und zurück.
ausgangssituation: ich mach nen kleines array (soviele tasten hat ne maus ja ned ^^) mit erstma 5 plätzen. lmb ist id 0, rmb is die 2 und mausrad vor/zurück is 3 und 4. die 1 is warscheinlich ne mittlere mausstaste - leider geht mausrad klick ned :/ wurscht erstma ^^
hab das ganze jetz so gebaut, dass ich mir den status (geklickt oder aufgehört zu klicken) merke - was beim mausrad schlauerweise ned geht, da es immer den status "aufgehört zu drücken" hat, also sonderlösung >< - sowie die mausposition und die veränderung der mausposition von frame zu frame. joa, und mittels der veränderung der position lass ich dann die ansicht halt rumrotieren (hab da nen cameraFrame vorschlag aus meinem dollen buch da drin). hier mal der code:
so, das sollten alle schnipsel sein. ich hatte erst das problem, dass ohne mausbewegung auch keine berechnung der variablen mChangeX und Y erfolgte, die diese auf 0 setzen. also wenn man RMB gedrückt hatte, die maus bewegte und dann aufhörte, wurden die werte der letzten bewegung immer weiter genutzt. also anstatt anzuhalten, weil auch die maus still steht, hat sichs immer weiter und weiter gedreht ^^ deswegen hab ich das mit mouseMove und mouseTresh eingebaut. bei jeder bewegung bekommt mouseMove den zeitstempel als wert und der wird dann später mit mouseTresh verglichen. nach 50 milisekunden (hatte nachm rumtesten mit werten ganz gut gefunzt) wird dann mChangeX und Y auf 0 resettet. ohne das war die bewegen total ruckhaft und kaum vorhanden. scheinbar fragt der ned so sehr oft bei der maus nach oder so >< ohne diesen treshold wollts jedenfalls garnich so recht klappen (entweder er bewegt und bewegt sich - oder es zuckelt langsam vor sich hin ^^).
gut, also soweit so gut, das funzt. jetz hab ich nur noch ein problem: wenn ich die maus diagonal beweg, also er x UND y drehen muss, dann zuckelts wieder :/ also das bild springt blöde umher, wie wenn er erst eine drehung rendert und dann die nächste >< pausen dazwischen sind ned, is also nen andres ruckeln wie ohne das treshold gedöhns (da bewegt er sich nur alle sekunde ca nen bissl, hier aber is die bewegung stetig, aber zuckelnd).
wie ichs jetz hab is schon die 2. version.
also beide drehungen in einem befehl - brachte auch kein andres ergebnis. hat irgendwer ne idee, woran das liegt oder sogar, wie ichs lösen könnt? ^^
also jedenfalls hab ich bei mir jetz mal ne maussteuerung versucht. bedienung soll wie folgt funtzen: rechtsklicke ich mit der maus, kann ich durch die mausbewegung den blickwinkel ändern. durch rollen am mausrad fährt er vor und zurück.
ausgangssituation: ich mach nen kleines array (soviele tasten hat ne maus ja ned ^^) mit erstma 5 plätzen. lmb ist id 0, rmb is die 2 und mausrad vor/zurück is 3 und 4. die 1 is warscheinlich ne mittlere mausstaste - leider geht mausrad klick ned :/ wurscht erstma ^^
hab das ganze jetz so gebaut, dass ich mir den status (geklickt oder aufgehört zu klicken) merke - was beim mausrad schlauerweise ned geht, da es immer den status "aufgehört zu drücken" hat, also sonderlösung >< - sowie die mausposition und die veränderung der mausposition von frame zu frame. joa, und mittels der veränderung der position lass ich dann die ansicht halt rumrotieren (hab da nen cameraFrame vorschlag aus meinem dollen buch da drin). hier mal der code:
PHP:
// Globals
// maus einstellungen
#define MOUSE_BUTTONS 5
int mouseX = 0, mouseY = 0; // mausposition
int mChangeX = 0, mChangeY = 0; // änderung der mausposition
int mouseKey = -1; // maustaste
long mouseMove = 0; // bewegt sich die maus? (0 = nein, alles andere = letzter zeitpunkt der bewegung als timestamp)
int mouseTresh = 50; // in ms - zeit bevor mausbewegung negiert wird
GLFrame cameraFrame; // global camera instance
struct keyState {
int key;
int status;
int x;
int y;
void init(int k, int ks, int kx, int ky) {
this->key = k;
this->status = ks;
this->x = kx;
this->y = ky;
}
};
keyState pressedMouse[MOUSE_BUTTONS]; // platzhalter für maustasten
...
// ----------- Callback functions ----------- //
void mouseClick(int key, int status, int x, int y)
{
if(key < MOUSE_BUTTONS) {
if(key == 3 || key == 4) status = 0;
pressedMouse[key].init(key, status, x, y);
}
/*
0: lmb
2: rmb
3: mr hoch
4: mr runter
*/
}
void mouseActive(int x, int y)
{
mChangeX = x - mouseX;
mChangeY = y - mouseY;
mouseX = x;
mouseY = y;
mouseMove = GetTickCount();
}
void mousePassive(int x, int y)
{
mChangeX = x - mouseX;
mChangeY = y - mouseY;
mouseX = x;
mouseY = y;
mouseMove = GetTickCount();
}
// ----------- Callback functions ----------- //
void SetupRC(void) {
for(int i=0; i<MOUSE_BUTTONS; i++) pressedMouse[i].init(i, 1, 0, 0);
...
}
void RenderScene(void) {
long elapsedTime = GetTickCount() - FrameTickCount;
long FrameTickCount = GetTickCount();
float linear = 0.2f;
float angular = float(m3dDegToRad(1.0f));
if(pressedMouse[3].status == 0) cameraFrame.MoveForward(linear);
if(pressedMouse[4].status == 0) cameraFrame.MoveForward(-linear);
if(pressedMouse[2].status == 0) {
cameraFrame.RotateWorld(-angular, 0.f, (float)(elapsedTime * mChangeX), 0.f);
cameraFrame.RotateWorld(-angular, (float)(elapsedTime * mChangeY), 0.f, 0.f);
}
...
long timePassed;
if(mouseMove == 0) {
mChangeX = 0;
mChangeY = 0;
} else {
timePassed = FrameTickCount - mouseMove;
if(timePassed > mouseTresh) mouseMove = 0;
}
}
gut, also soweit so gut, das funzt. jetz hab ich nur noch ein problem: wenn ich die maus diagonal beweg, also er x UND y drehen muss, dann zuckelts wieder :/ also das bild springt blöde umher, wie wenn er erst eine drehung rendert und dann die nächste >< pausen dazwischen sind ned, is also nen andres ruckeln wie ohne das treshold gedöhns (da bewegt er sich nur alle sekunde ca nen bissl, hier aber is die bewegung stetig, aber zuckelnd).
wie ichs jetz hab is schon die 2. version.
PHP:
if(pressedMouse[2].status == 0) cameraFrame.RotateWorld(-angular, (float)(elapsedTime * mChangeY), (float)(elapsedTime * mChangeX), 0.f);
Zuletzt bearbeitet:



