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

Aktuelle Zeit: Mo Jun 03, 2024 13:13

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: WM_MOUSEMOVE
BeitragVerfasst: Do Jan 23, 2003 20:51 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich hab bei einem Programm von mir die Bewegung mit der Maus gesteuert... klappt rein theoretisch auch ganz gut...

Wenn ich stillstehe und mich dann mit der Maus umgucke ist alles kein Problem... aber sobald ich mit den Pfeiltasten laufe und dann die Mausbewege sieht die bewegung sehr.. äh.. abgehackt aus.. also als ob es ruckelt... (liegt aber nicht an der FPS Zahl!)

Hier mach ich die Mausbewegung:
Code:
  1. WM_MOUSEMOVE: begin
  2.  
  3.   MX:=LoWord(lParam);
  4.  
  5.   MY:=HiWord(lParam);
  6.  
  7.   Rotation:=Rotation + CenterX - MX;
  8.  
  9.   SetCursorPos(CenterX,CenterY);
  10.  
  11. end;


im WM_KEYDOWN wird eine Variable für "VK_UP" auf True gesetzt,
und dann bei der Messageschleife überprüft...
Code:
  1.   PosX:=PosX - sin(Rotation * 0.0174532925) * 0.1;
  2.  
  3.   PosZ:=PosZ - cos(Rotation * 0.0174532925) * 0.1;


Wenn ich die Rotation per Tastaturmache klappt es wunderbar ruckelfrei... :(

Au'revoir,
Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 25, 2003 01:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
also ich weiß jetzt nicht, warum ich jetzt schon wieder bei einer von deinen fragestellungen lande (wahrscheinlich weil du ziemlich aktiv bist, oder deine probleme sind interessanter - ist ja auch wurscht).

jedenfalls schätze ich mal (weil mir selbst vor einiger zeit auch so ergangen...), dass dein code a'la NeHe tutorials ungefähr so aussieht:

Code:
  1.     while RunGL do begin
  2.  
  3.       // process all messages, if there is none the scene can be displayed
  4.  
  5.       while (PeekMessage(msg, 0, 0, 0, PM_NOREMOVE)) do
  6.  
  7.         if (GetMessage(msg, 0, 0, 0)) then begin
  8.  
  9.           TranslateMessage(msg);
  10.  
  11.           DispatchMessage(msg);
  12.  
  13.         end
  14.  
  15.         else
  16.  
  17.           exit;  // quit message received, so leave at once
  18.  
  19.       // repaint window if nothing else is to do
  20.  
  21.       ... Juhu, hier zeichne ich mein Szenario
  22.  
  23.     end
  24.  
  25.  


diese vorgehensweise ist leider nicht so toll, als tastatur und maus-nachrichten asynchron zu deiner zeichenroutine gepostet werden, d.h. die szene kann, wenns blöd her geht, einmal die mausnachricht darstellen, dann kommt die tastaturnachricht, die eigentlich parallel laufen sollte, und das ganze ein wenig verändert - und schaut dann so aus, als ob es "ruckeln" würde. durch debuggen findet man auch nix, denn sobald keine nachrichten mehr ankommen passt ja alles.

besser ist es, wenn du den nachrichtenweg von windows beibehältst - soll heißen, du zeichnest deine szene beim eintreffen einer WM_PAINT nachricht, damit die darstellung trotzdem regelmäßig upgedatet wird schaut deine hauptschleife dann so aus:

Code:
  1.     while RunGL do begin
  2.  
  3.       // process all messages, if there is none the scene can be displayed
  4.  
  5.       while (PeekMessage(msg, 0, 0, 0, PM_NOREMOVE)) do
  6.  
  7.         if (GetMessage(msg, 0, 0, 0)) then begin
  8.  
  9.           TranslateMessage(msg);
  10.  
  11.           DispatchMessage(msg);
  12.  
  13.         end
  14.  
  15.         else
  16.  
  17.           exit;  // quit message received, so leave at once
  18.  
  19.       // repaint window if nothing else is to do
  20.  
  21.       if ActiveGL then InvalidateRect(h_Wnd, NIL, false);    
  22.  
  23.     end
  24.  
  25.  


mit dem letzten kommando sendest do eine repaint-message, wenn nix mehr anliegt, damit liegt deine zeichenroutine an der richtigen position in der nachrichtenwarteschlange und alles sollte passen (h_Wnd ist natürlich dein fensterhandle, das du hoffentlich irgendwo rumliegen hast).

das ganze hat übrigens den vorteil, dass es nicht mehr so grausig aussieht, wenn du die fenstergröße veränderst ...

so, ich geh jetzt schlafen, ich antworte ja schon seit über einer stunde auf deine verschiedenen fragen,

viel spass beim programmieren,

martin

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 25, 2003 13:10 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Hi Aya,

für die Tastaturabfrage/Mausabfrage würde ich nicht die WM_MOUSEMOVE oder WM_KEYDOWN verwenden, sondern den Tastaturstatus direkt abfragen. Da die Nachrichten nur dann abgearbeitet werden, wenn die Nachrichtenschleife durchlaufen wird, kann es passieren das mehrere WM_MOUSEMOVE - Nachrichten für jede Teilbewegung in der Nachrichtenqueue gespeichert sind und alle auf einmal abgearbeitet werden. Dadurch gehen Dir deine Teilschritte verloren und die Bewegung ruckelt.

Ich mache das wie folgt:

Code:
  1.  
  2.  
  3. function TOGLApplication.IsKeyPressed(VK : Integer) : Boolean;
  4.  
  5. begin
  6.  
  7.   Result := ((GetAsyncKeyState(VK) and $8000) > 0);
  8.  
  9. end;
  10.  
  11.  


Ich frage die Daten kurz vor dem Zeichnen der Scene ab und berechne dann die neue Position.

Code:
  1.  
  2.  
  3. procedure TDungeon1.BeforeDraw;
  4.  
  5. var
  6.  
  7.   OldX, OldZ       : TGLFloat;
  8.  
  9.   oVector, nVector : TVector3f;
  10.  
  11. begin
  12.  
  13.   fX/fZ - Aktuelle Position
  14.  
  15.   fHeadMovement - Sinusförmige Kopfbewegung beim gehen
  16.  
  17.   fHeadMovAngle - Blickrichtung des Kopfes
  18.  
  19.  
  20.  
  21.   OldX := fX;
  22.  
  23.   OldZ := fZ;
  24.  
  25.   if IsKeyPressed(VK_UP) then begin
  26.  
  27.     fX := fX - sin(fHeading*pi/180) * FrameTime / 600;   // FrameTime/600=movement speed
  28.  
  29.     fZ := fZ + cos(fHeading*pi/180) * FrameTime / 600;   // FrameTime/600=movement speed
  30.  
  31.     fHeadMovAngle := fHeadMovAngle + 5;
  32.  
  33.     fHeadMovement := 0.025 * sin(fHeadMovAngle * pi / 180);
  34.  
  35.   end;
  36.  
  37.  
  38.  
  39.   if IsKeyPressed(VK_DOWN) then begin
  40.  
  41.     fX := fX + sin(fHeading * pi / 180 ) * FrameTime / 600;
  42.  
  43.     fZ := fZ - cos(fHeading * pi / 180 ) * FrameTime / 600;
  44.  
  45.     fHeadMovAngle := fHeadMovAngle - 5;
  46.  
  47.     fHeadMovement := 0.025 * sin(fHeadMovAngle * pi / 180);
  48.  
  49.   end;
  50.  
  51.   if IsKeyPressed(VK_LEFT) then begin
  52.  
  53.     fX := fX + sin((fHeading + 90) * pi / 180) * FrameTime/900;  // FrameTime/900=movement speed
  54.  
  55.     fZ := fZ - cos((fHeading + 90) * pi / 180) * FrameTime/900;  // straffing = 50% slower
  56.  
  57.   end;
  58.  
  59.  
  60.  
  61.   if IsKeyPressed(VK_RIGHT) then begin
  62.  
  63.     fX := fX - sin((fHeading + 90) * pi/ 180) * FrameTime / 900;
  64.  
  65.     fZ := fZ + cos((fHeading + 90) * pi/ 180) * FrameTime / 900;
  66.  
  67.   end;
  68.  
  69.  
  70.  
  71.   MakeVector(oVector, -OldX, 0.1, -OldZ);
  72.  
  73.   MakeVector(nVector, -fX, 0.1, -fZ);
  74.  
  75.   if fMap.CheckCollision(oVector, nVector) then begin
  76.  
  77.     fX := OldX;
  78.  
  79.     fZ := OldZ;
  80.  
  81.   end;
  82.  
  83.  
  84.  
  85.   fPosition[0] := -fX;
  86.  
  87.   fPosition[1] :=  0;
  88.  
  89.   fPosition[2] := -fZ;
  90.  
  91.  
  92.  
  93.   GetCursorPos(fMousePos);
  94.  
  95.   SetCursorPos(Width div 2, Height div 2);
  96.  
  97.   fHeading := fHeading + (fMousePos.X - (Width div 2)) / 100 * MouseSpeed;
  98.  
  99.   fTilt    := fTilt - ((Height div 2) - fMousePos.Y) / 100 * MouseSpeed;
  100.  
  101.   if fTilt >  60 then fTilt :=  60;
  102.  
  103.  &nbsp;if fTilt < -60 then fTilt := -60;
  104.  
  105. end;
  106.  
  107.  


Mit der Maus drehe ich die Sicht nach links/rechts/oben und unten, mit der Tastatur kann ich mich Vorwärts/Rückwärts bzw. nach links/rechts bewegen, ohne das es ruckelt.

Gruß
KidPaddle

_________________
http://www.seban.de


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 39 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.009s | 14 Queries | GZIP : On ]