AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Egosicht Problem: Beim positionieren der Maus
Thema durchsuchen
Ansicht
Themen-Optionen

Egosicht Problem: Beim positionieren der Maus

Offene Frage von "ftl999"
Ein Thema von CreativeMD · begonnen am 23. Dez 2011 · letzter Beitrag vom 24. Feb 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von CreativeMD
CreativeMD

Registriert seit: 11. Okt 2011
127 Beiträge
 
Delphi XE2 Architect
 
#1

Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 09:41
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.
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 09:47
Ich würde die Maus ganz abschlaten, wenn sie für die Steuerung nicht nötig ist.
Screen.Cursor := -1; // oder crNone
So habe ich das immer gehandhabt, wenn nur mit der Tatstatur gesteuert wird.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Benutzerbild von CreativeMD
CreativeMD

Registriert seit: 11. Okt 2011
127 Beiträge
 
Delphi XE2 Architect
 
#3

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 09:53
Ne
Das Spiel muss man mit der Maus steuern sonst wird man verrückt.

Geändert von CreativeMD (23. Dez 2011 um 09:56 Uhr)
  Mit Zitat antworten Zitat
CCRDude

Registriert seit: 9. Jun 2011
675 Beiträge
 
FreePascal / Lazarus
 
#4

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 10:02
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?
  Mit Zitat antworten Zitat
Benutzerbild von CreativeMD
CreativeMD

Registriert seit: 11. Okt 2011
127 Beiträge
 
Delphi XE2 Architect
 
#5

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 10:08
Aber ich muss doch wissen wie sich die Maus bewegt.
Könntest du das etwas genauerer erklären.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.994 Beiträge
 
Delphi 12 Athens
 
#6

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 10:11
Zeig doch mal, was du machst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von CreativeMD
CreativeMD

Registriert seit: 11. Okt 2011
127 Beiträge
 
Delphi XE2 Architect
 
#7

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 10:19
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.994 Beiträge
 
Delphi 12 Athens
 
#8

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 12:59
Das zeigt aber auch nur die Steuerung mit der Tastatur - nicht mit der Maus. Wie wird denn die Maus-Steuerung realisiert?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#9

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 14:09
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.994 Beiträge
 
Delphi 12 Athens
 
#10

AW: Egosicht Problem: Beim positionieren der Maus

  Alt 23. Dez 2011, 14:39
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:31 Uhr.
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