![]() |
Egosicht Problem: Beim positionieren der Maus
Hi
Ich will ein Spiel mit GlScene in einer Egosicht programmieren. Dass die Person dorthin läuft wo sie hinschaut hab ich schon, aber das wie bei jedem Spiel mit Egosicht die Maus unsichtbar ist und immer in der Mitte ist, bekomme ich nicht hin. Wenn ich SetCursorpos benutzte funktioniert das ganze Spiel nicht mehr. Es läuft dann einfach nicht weiter und alles bleibt stehen. Die Komponete UserInterface von GLScene kann ich nicht nehmen, weil dann meine Steuerung nicht mehr funktioniert. Gibt es vielleicht noch andere Möglichkeiten, die Mausposition zu setzen? Übrigens die Funktion SetCursorpos hab ich in MouseMove vom GLSceneViewer reingemacht. Wenn ich das in FormMouseMove mache gibt es keine Reaktion. |
AW: Egosicht Problem: Beim positionieren der Maus
Ich würde die Maus ganz abschlaten, wenn sie für die Steuerung nicht nötig ist.
Delphi-Quellcode:
Screen.Cursor := -1; // oder crNone
So habe ich das immer gehandhabt, wenn nur mit der Tatstatur gesteuert wird. |
AW: Egosicht Problem: Beim positionieren der Maus
Ne
Das Spiel muss man mit der Maus steuern sonst wird man verrückt. |
AW: Egosicht Problem: Beim positionieren der Maus
Das widerspricht sich aber doch nicht?
Wenn die Maus, wie Du schreibst, immer genau in der Mitte sein soll, spricht doch nichts dagegen, den Cursor abzuschalten und in genau der Mitte ein eigenes Cursorähnliches Symbol darzustellen? |
AW: Egosicht Problem: Beim positionieren der Maus
Aber ich muss doch wissen wie sich die Maus bewegt.
Könntest du das etwas genauerer erklären. |
AW: Egosicht Problem: Beim positionieren der Maus
Zeig doch mal, was du machst.
|
AW: Egosicht Problem: Beim positionieren der Maus
Also
Die Objekte: GlDummyCube1 hat in sich den Kopf hat Kamera in sich
Code:
if IsKeyDown(VK_RIGHT) then
GLDummyCube1.TurnAngle := GLDummyCube1.TurnAngle - speedx * 10; if IsKeyDown(VK_LEFT) then GLDummyCube1.TurnAngle := GLDummyCube1.TurnAngle + speedx * 10; if IsKeyDown(VK_UP) then Kopf.PitchAngle :=Kopf.PitchAngle - 1; if IsKeyDown(VK_DOWN) then Kopf.PitchAngle := Kopf.PitchAngle + 1; Und dann noch in die Richtung laufen
Code:
if IsKeyDown('W') then
begin if (GLDummyCube1.TurnAngle > -90) and (GLDummyCube1.TurnAngle < 90) then begin GLHUDText6.Text := 'Z: Hinten'; if back_z = false then GLDummyCube1.Position.z := GLDummyCube1.Position.z - Cos(GLDummyCube1.TurnAngle * (PI / 180)) * (speedz); end else begin GLHUDText6.Text := 'Z: Vorne'; if for_z = false then GLDummyCube1.Position.z := GLDummyCube1.Position.z - Cos(GLDummyCube1.TurnAngle * (PI / 180)) * (speedz); end; if (GLDummyCube1.TurnAngle < 0) and (GLDummyCube1.TurnAngle > -180) then begin GLHUDText6.Text := GLHUDText6.Text + '; X: Vorne'; if for_x = false then GLDummyCube1.Position.X := GLDummyCube1.Position.X - Sin(GLDummyCube1.TurnAngle * (PI / 180)) * (speedx); end else begin GLHUDText6.Text := GLHUDText6.Text + '; X: Hinten'; if back_x = false then GLDummyCube1.Position.X := GLDummyCube1.Position.X - Sin(GLDummyCube1.TurnAngle * (PI / 180)) * (speedx); end; end; if IsKeyDown('S') then begin if (GLDummyCube1.TurnAngle > -90) and (GLDummyCube1.TurnAngle < 90) then begin GLHUDText6.Text := 'Z: Vorne'; if for_z = false then GLDummyCube1.Position.z := GLDummyCube1.Position.z + Cos(GLDummyCube1.TurnAngle * (PI / 180)) * (speedz); end else begin GLHUDText6.Text := 'Z: Hinten'; if back_z = false then GLDummyCube1.Position.z := GLDummyCube1.Position.z + Cos(GLDummyCube1.TurnAngle * (PI / 180)) * (speedz); end; if (GLDummyCube1.TurnAngle < 0) and (GLDummyCube1.TurnAngle > -180) then begin GLHUDText6.Text := GLHUDText6.Text + '; X: Hinten'; if back_x = false then GLDummyCube1.Position.X := GLDummyCube1.Position.X + Sin(GLDummyCube1.TurnAngle * (PI / 180)) * (speedx) end else begin GLHUDText6.Text := GLHUDText6.Text + '; X: Vorne'; if for_x = false then GLDummyCube1.Position.X := GLDummyCube1.Position.X + Sin(GLDummyCube1.TurnAngle * (PI / 180)) * (speedx); end; end; |
AW: Egosicht Problem: Beim positionieren der Maus
Das zeigt aber auch nur die Steuerung mit der Tastatur - nicht mit der Maus. Wie wird denn die Maus-Steuerung realisiert?
|
AW: Egosicht Problem: Beim positionieren der Maus
Normal ist, dass man in 3D-Szenen keine absoluten Mauspositionen gebrauchen kann, wohl aber die Deltas bei Bewegung braucht, um sie z.B. in eine Drehung umzusetzen. Das hat der TE vor. Problem dabei: Windows begrenzt die Maus an den Bildschirmrandkoordinaden, so dass man, wen man an den Rand stößt, nur noch Deltas von 0 bekommt. Deswegen setzt man die Maus in die Mitte, da es von dort aus immer in alle Richtungen weiter geht. Da man den Zeiger an sich aber nicht braucht, bzw. er meistens stört, wird der ausgeblendet.
CreativeMD, zeig doch mal deinen GLSceneViewer.MouseMove Handler. |
AW: Egosicht Problem: Beim positionieren der Maus
Folgendes sollte bei gedrückter Shift-Taste ein Drehen des Kopfes nach links und rechts ermöglichen - bis zur Tischkante...
Delphi-Quellcode:
Beim Form das KeyPreview auf true stellen.
private
FLast: TPoint; // speichert die letzte Mausposition im FormKeyDown:
Delphi-Quellcode:
im FormKeyUp:
if Key = VK_SHIFT then begin
FLast := GLSceneViewer1.ScreenToClient(Mouse.CursorPos); GLSceneViewer1.Cursor := -1; end;
Delphi-Quellcode:
und im SceneViewerMouseMove:
if Key = VK_SHIFT then begin
GLSceneViewer1.Cursor := crDefault; end;
Delphi-Quellcode:
if ssShift in Shift then begin
GLDummyCube1.Turn(X - FLast.X); FLast := Point(X, Y); if Abs(X - GLSceneViewer1.Width div 2) > 10 then begin FLast := Point(GLSceneViewer1.Width div 2, GLSceneViewer1.Height div 2); Mouse.CursorPos := GLSceneViewer1.ClientToScreen(FLast); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz