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:
WM_MOUSEMOVE: begin
MX:=LoWord(lParam);
MY:=HiWord(lParam);
Rotation:=Rotation + CenterX - MX;
SetCursorPos(CenterX,CenterY);
end;
im WM_KEYDOWN wird eine Variable für "VK_UP" auf True gesetzt, und dann bei der Messageschleife überprüft...
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:
while RunGL do begin
// process all messages, if there is none the scene can be displayed
while (PeekMessage(msg, 0, 0, 0, PM_NOREMOVE)) do
if (GetMessage(msg, 0, 0, 0)) then begin
exit; // quit message received, so leave at once
// repaint window if nothing else is to do
... Juhu, hier zeichne ich mein Szenario
end
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:
while RunGL do begin
// process all messages, if there is none the scene can be displayed
while (PeekMessage(msg, 0, 0, 0, PM_NOREMOVE)) do
if (GetMessage(msg, 0, 0, 0)) then begin
exit; // quit message received, so leave at once
// repaint window if nothing else is to do
if ActiveGL then InvalidateRect(h_Wnd, NIL, false);
end
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,
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:
function TOGLApplication.IsKeyPressed(VK : Integer) : Boolean;
begin
Result := ((GetAsyncKeyState(VK) and $8000) > 0);
end;
Ich frage die Daten kurz vor dem Zeichnen der Scene ab und berechne dann die neue Position.
Code:
procedure TDungeon1.BeforeDraw;
var
OldX, OldZ : TGLFloat;
oVector, nVector : TVector3f;
begin
fX/fZ - Aktuelle Position
fHeadMovement - Sinusförmige Kopfbewegung beim gehen
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.
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.