Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Egosicht Problem: Beim positionieren der Maus (https://www.delphipraxis.net/165312-egosicht-problem-beim-positionieren-der-maus.html)

CreativeMD 23. Dez 2011 09:41

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.

Progman 23. Dez 2011 09:47

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.

CreativeMD 23. Dez 2011 09:53

AW: Egosicht Problem: Beim positionieren der Maus
 
Ne
Das Spiel muss man mit der Maus steuern sonst wird man verrückt.

CCRDude 23. Dez 2011 10:02

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?

CreativeMD 23. Dez 2011 10:08

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.

Uwe Raabe 23. Dez 2011 10:11

AW: Egosicht Problem: Beim positionieren der Maus
 
Zeig doch mal, was du machst.

CreativeMD 23. Dez 2011 10:19

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;

Uwe Raabe 23. Dez 2011 12:59

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?

Medium 23. Dez 2011 14:09

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.

Uwe Raabe 23. Dez 2011 14:39

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:
  private
    FLast: TPoint; // speichert die letzte Mausposition
Beim Form das KeyPreview auf true stellen.

im FormKeyDown:

Delphi-Quellcode:
  if Key = VK_SHIFT then begin
    FLast := GLSceneViewer1.ScreenToClient(Mouse.CursorPos);
    GLSceneViewer1.Cursor := -1;
  end;
im FormKeyUp:

Delphi-Quellcode:
  if Key = VK_SHIFT then begin
    GLSceneViewer1.Cursor := crDefault;
  end;
und im SceneViewerMouseMove:

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 10:34 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz