Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Bewegungen in Welten (https://www.delphipraxis.net/116691-bewegungen-welten.html)

XXcD 4. Jul 2008 12:08


Bewegungen in Welten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich versuche ngerade nen kleines Spiel zu programmieren und habe etwas probleme mit der Steuerung. (Eine Demo habe ich als Anhang drin)
Mit WASD Steuert man, das ganze habe ich mit RegisterHotkey() gemacht.

Das Problem ist jetzt wenn ich in einem anderen Fenster z.b. schreiben möchte, dann bewegt sich der Charakter im Spiel und in dem anderen Fenster wird die Taste nicht angenommen.

Weiß vielleicht einer wie ich das anders machen könnte?

nuclearping 4. Jul 2008 12:10

Re: Bewegungen in Welten
 
Schau dir mal GetAsyncKeyState an -> http://msdn.microsoft.com/en-us/library/ms646293.aspx

Luckie 4. Jul 2008 12:59

Re: Bewegungen in Welten
 
Warum nimmst du dafür Systemweite Hotkeys? Die Ereignis für die Form OnKeyDown und OnKeyPress reichen doch vollkommen.

XXcD 4. Jul 2008 13:11

Re: Bewegungen in Welten
 
Ja gut das läuft jetzt flüssiger aber wie kriege ich das hin, dass der den Charkter nur bewegt wenn das Formular im Vordergrund ist?
Habs mit Focus ausprobiert, aber das klappt nicht.

Luckie 4. Jul 2008 13:14

Re: Bewegungen in Welten
 
Die tasten werden doch nur ausgewertet, wenn das Formular den Focus hat. Anders darf es gar nicht funktionieren.

XXcD 4. Jul 2008 13:33

Re: Bewegungen in Welten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ne der bewegt sich auch wenn das Formular nicht den Focus hat.
Probier es selbst aus. Ich häng die aktualisierte Version an.

Luckie 4. Jul 2008 13:38

Re: Bewegungen in Welten
 
Benutzt du noch die systemweiten Hotkeys?

BTW ohne Quellcode nützt uns das nichts.

XXcD 4. Jul 2008 14:17

Re: Bewegungen in Welten
 
Ok habs gerade hingekriegt mit Form.Active

Aber hier mal der Code:

Delphi-Quellcode:
procedure TGame.Timer2Timer(Sender: TObject);
begin
if Game.Active=true then
begin
          If GetAsyncKeyState(Ord('W')) < 0 Then Begin
          if Image11.Top>1 then
          begin
          Stepup;
          end;
          End;

          If GetAsyncKeyState(Ord('A')) < 0 Then Begin
          if Image11.left>1 then
          begin
          Stepleft;
          end;
          End;

          If GetAsyncKeyState(Ord('S')) < 0 Then Begin
          if Image11.top<350 then
          begin
          Stepdown;
          end;
          End;

          If GetAsyncKeyState(Ord('D')) < 0 Then Begin
          if Image11.left<350 then
          begin
          Stepright;
          end;
          End;
end;
end;
Und hier noch eine der funktionen zum laufen:
Delphi-Quellcode:
procedure TGame.Stepup();
begin
  if Bewegung=false then
  begin
  Bewegung:=true;
  Image11.Picture:=Image4.Picture;
  Image11.Top:=Image11.Top-10;
  delay(100);

  Image11.Picture:=Image4.Picture;
  Image11.Top:=Image11.Top-10;
  delay(100);

  Image11.Picture:=Image8.Picture;
  Image11.Top:=Image11.Top-10;
  delay(100);

  Image11.Picture:=Image4.Picture;
  Image11.Top:=Image11.Top-10;
  Bewegung:=false;
  end;
end;

Cyf 4. Jul 2008 14:55

Re: Bewegungen in Welten
 
Zitat:

Die Ereignis für die Form OnKeyDown und OnKeyPress reichen doch vollkommen.
Wäre hier imho besser.

CK_CK 4. Jul 2008 15:20

Re: Bewegungen in Welten
 
Und nochwas. Das hier:
Delphi-Quellcode:
if Bewegung=false then ...
macht man so:
Delphi-Quellcode:
if not Bewegung then ...
Und das hier:
Delphi-Quellcode:
if Game.Active=true then ...
sollte man so machen:
Delphi-Quellcode:
if Game.Active then ...
(Ich bekomme immer Augenkrebs, wenn ich sowas sehe :angel2:)

Chris

XXcD 4. Jul 2008 15:58

Re: Bewegungen in Welten
 
Sorry hat mir keiner richtig beigebracht :cry: :cry:

Aber ist denn sonst alles in Ordnung?? Und mit Keydown das lass ich jetzt einfach so funktioniert ja :-D

CK_CK 4. Jul 2008 19:44

Re: Bewegungen in Welten
 
Wenn es funktioniert, dann wird's wohl in Ordnung sein ;)
Das einzige ist, dass du den Code noch etwas aufräumen kannst. Z.B. so:
Delphi-Quellcode:
if Game.Active then
begin
   if (GetAsyncKeyState(Ord('W')) < 0) and (Image11.Top > 1) then Stepup;
   
   if (GetAsyncKeyState(Ord('A')) < 0) and (Image11.left > 1) then Stepleft;

   if (GetAsyncKeyState(Ord('S')) < 0) and (Image11.top < 350) then Stepdown;

   if (GetAsyncKeyState(Ord('D')) < 0) and (Image11.left < 350) then Stepright;
end;
Liebe Grüße,
Chris

Luckie 4. Jul 2008 20:30

Re: Bewegungen in Welten
 
Zitat:

Zitat von XXcD
Aber ist denn sonst alles in Ordnung?? Und mit Keydown das lass ich jetzt einfach so funktioniert ja :-D

Ich finde es nur unnötig kompliziert und warum das System mit einer globalen API-Funktion belasten, wenn es gar nicht nötig ist?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 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