Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 07:29

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Fr Jun 15, 2007 14:34 
Offline
DGL Member

Registriert: So Jan 23, 2005 13:21
Beiträge: 46
Wohnort: Vietnam
Servus!

Folgendes Probleme habe ich mit folgendem code:

Code:
  1. glutPassiveMotionFunc(Mouse::mouseMovement); // <- HERE


Code:
  1.  
  2. void Mouse::mouseMovement(int mouseX, int mouseY)
  3. {
  4.     Vector2d angle_vector = getInstance().calculateAngle(mouseX, mouseY);
  5.  
  6.     Scene::getInstance().getPlayer().move(TURN_LEFTRIGHT, angle_vector.x);
  7.     Scene::getInstance().getPlayer().move(TURN_UPDOWN, angle_vector.y);
  8.  
  9.     SetCursorPos((getInstance().middle_point_.x), (getInstance().middle_point_.y)); // <- HERE
  10. }


Habe makiert, was wichtig ist. glutPassiveMotionFunc macht ja immer dann was, wenn ich die Maus bewege. Das is auch gut so, somit kann ich das drehen bei einem Egoshooter simulieren. Jetzt is aber das Problem, dass, durch das SetCursorPos(...) immer wieder die Mehtode neu aufgerufen wird. Und das zwingt den Rechner in die Knie. Ohne dem SetCursorPos(...) würde es gehen, aber ich kann meine drehung nicht simulieren. Jemand ne idee, wie ich das lösen könnte?

Er soll ja den cursor immer im Mittelpunkt halten, gehe ich mit der Maus nach rechts, errechne ich, wie weit das is und zähle es dann zum Winkel dazu. Danach soll der cursor wieder in die ausgangsposition, damit ich nicht an den Rand komme bzw eine sehr genaue abfrage machen kann.[/quote]

_________________
"As the enemy went to heaven,
we stayed in hell!"


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 14:40 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Du setzt den Cursor ja immer in die Mitte. Wenn nur in der Mousemove funktion die zielposition die mitte ist, heißt das das es setcursorpos war. Also rufst du dann nicht nocheinmal setcursorpos auf.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 14:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Ich löse das bei meinem Projekt anders:

Meine MainLoop schaut ungefähr so aus:


zuerst hole ich mir die CursorPosition mit GetCursorPos. Dann berechne ich den Abstand zum Bildschirmmittelpunkt
Code:
  1.  
  2.   // Loop anfang
  3.  
  4.   Rendern
  5.   ---
  6.  
  7.   - Mausposition mit GetCursorPos abfragen
  8.   - Abstand zum Mittelpunkt berechnen und bewegungsvektor berechnen
  9.   - Cursor mit SetCursorPos wieder zum Bildschirmmittelpunkt verschieben
  10.  
  11.   ---
  12.   Ausgabe am Bildschirm
  13.  
  14.   // Loop ende
  15.  
  16.  
  17.  

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Zuletzt geändert von littleDave am Fr Jun 15, 2007 14:47, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 15, 2007 14:46 
Offline
DGL Member

Registriert: So Jan 23, 2005 13:21
Beiträge: 46
Wohnort: Vietnam
EDIT:

Damit weniger CPU verbraucht wird, hab ich den code verbessert:

Code:
  1. void Mouse::mouseMovement(int mouseX, int mouseY)
  2. {
  3.     if (move_)
  4.     {
  5.         Vector2d angle_vector = getInstance().calculateAngle(mouseX, mouseY);
  6.  
  7.         Player::getInstance().move(TURN_LEFTRIGHT, angle_vector.x);
  8.         Player::getInstance().move(TURN_UPDOWN, angle_vector.y);
  9.    
  10.         SetCursorPos((getInstance().middle_point_.x), (getInstance().middle_point_.y));
  11.  
  12.         move_ = false;
  13.     }
  14.     else move_= true;
  15. }
  16.  


Move ist eine virtuelle Membervariable in meinem Fall. Kann aber auch static oder eine globale Variable verwendet werden (am anfang true setzten ;) ).

_________________
"As the enemy went to heaven,
we stayed in hell!"


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: Majestic-12 [Bot] und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]