Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Frage zur Tastatureingabe und Kollisionsabfrage (https://www.delphipraxis.net/80027-frage-zur-tastatureingabe-und-kollisionsabfrage.html)

Namenloser 2. Nov 2006 19:07

Re: Frage
 
Also erst einmal muss ich sagen, dass dieser Code sehr unübersichtlich ist, und dass man ihn sehr einfach auf diese Größe kriegen kann:

Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
  if char (key) = 'W' then
    movie1.Top:= movie1.Top -10;
  if char (key) = 'S' then
    movie1.Top:= movie1.Top +10;
  if char (key) = 'A' then
    movie1.left:= movie1.left -10;
  if char (key) = 'D' then
    movie1.left:= movie1.left +10;

  if key = VK_UP then
    movie2.Top:= movie2.Top -10;
  if key = vk_down then
    movie2.Top:= movie2.Top +10;
  if key = vk_left then
    movie2.left:= movie2.left -10;
  if key = vk_right then
    movie2.left:= movie2.left +10;
end;
So finde ich das schonmal viel übersichtlicher.

Und jetzt zu deinem Problem, dass du nicht mehrere Bewegungen auf einmal ausführen kannst.
1) Nimm dir einen Timer und setze ihn auf das Formular.
2) Nimm den gleichen Code wie oben, aber ersetze
Delphi-Quellcode:
if Char(key) = 'W' then
durch
Delphi-Quellcode:
if getasynckeystate(ord('W')) < 0 then
das wiederholst du für die anderen If-Abfragen nach dem gleichen Prinzip.
3) Jetzt setze das Intervall des Timers auf eine etwas höhere Geschwindigkeit, z.b. 50 ms.

Die Bewegung sollte so funktionieren.

Zum Thema Kollision:
http://www.dsdt.info/tipps/?id=416&search=rect

Dürfte genau das richtige für dich sein ;)


@EWeiss: ich wusste gar nicht, dass man die Keys mit AND verknüpfen kann (und was gescheites dabei rauskommt) o.O
Das probier ich mal aus^^

EWeiss 2. Nov 2006 19:17

Re: Frage
 
1 Timer ist eine sehr schlechte lösung für so etwas
2 Warum sollte man keine Shortcuts mit and verknüpfen können ?
3 in VB gehts dann bei Delphi wohl auch.

Wenn ich mir aber den Quelltext ansehe komplett unformatiert
denke ich es macht keinen sinn mit KeyHooks und ähnlichen anzufangen.

Zumal man für so etwas generell eine Winproc anstelle von timern verwenden sollte.

gruß

Cöster 3. Nov 2006 20:50

Re: Frage
 
Zitat:

Zitat von EWeiss
1 Timer ist eine sehr schlechte lösung für so etwas

Warum?
Zitat:

Zitat von EWeiss
2 Warum sollte man keine Shortcuts mit and verknüpfen können ?

Kannst du ein kurzes Codebeispiel geben? Wie stellst du dir das vor?
Zitat:

Zitat von EWeiss
Wenn ich mir aber den Quelltext ansehe komplett unformatiert
denke ich es macht keinen sinn mit KeyHooks und ähnlichen anzufangen.

Wieso?
Zitat:

Zitat von EWeiss
Zumal man für so etwas generell eine Winproc anstelle von timern verwenden sollte.

Was ist eine Winproc? Windowsprocedure würde mir auch nicht mehr sagen.

Nils_13 3. Nov 2006 21:07

Re: Frage
 
@Cöster: Warum sollte man mit HotKeys nicht anfangen, wenn der Quellcode total unübersichtlich ist, so dass man nicht einmal da, bei diesem einfachen Code, durchsteigt. Erst formatieren, dann weitermachen.

Phantom1 3. Nov 2006 21:56

Re: Frage
 
Noch eine einfache möglichkeit:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    Keys: Array[0..255] of Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Keys[Key]:=True;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Keys[Key]:=False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if Keys[Ord('W')] then
    movie1.Top:= movie1.Top -10;
  if Keys[Ord('S')] then
    movie1.Top:= movie1.Top +10;
  if Keys[Ord('A')] then
    movie1.left:= movie1.left -10;
  if Keys[Ord('D')] then
    movie1.left:= movie1.left +10;

  if Keys[VK_UP] then
    movie2.Top:= movie2.Top -10;
  if Keys[VK_DOWN] = then
    movie2.Top:= movie2.Top +10;
  if Keys[VK_LEFT] then
    movie2.left:= movie2.left -10;
  if Keys[VK_RIGHT] then
    movie2.left:= movie2.left +10;
end;

end.

EWeiss 4. Nov 2006 03:24

Re: Frage
 
Zitat:

Zitat von Cöster
Zitat:

Zitat von EWeiss
1 Timer ist eine sehr schlechte lösung für so etwas

Warum?
Zitat:

Zitat von EWeiss
2 Warum sollte man keine Shortcuts mit and verknüpfen können ?

Kannst du ein kurzes Codebeispiel geben? Wie stellst du dir das vor?
Zitat:

Zitat von EWeiss
Wenn ich mir aber den Quelltext ansehe komplett unformatiert
denke ich es macht keinen sinn mit KeyHooks und ähnlichen anzufangen.

Wieso?
Zitat:

Zitat von EWeiss
Zumal man für so etwas generell eine Winproc anstelle von timern verwenden sollte.

Was ist eine Winproc? Windowsprocedure würde mir auch nicht mehr sagen.

Zu 1. Weil ein Timer immer läuft und nicht nur dann wenn das Event (Druck auf x.. Taste) auftritt.
Zu 2. Könnt dir was in VB zeigen macht aber im Delphi Forum keine Sinn und zum übersetzen hab ich keinen Bock.
Zu 3. Wenn ein User nicht mal die einfachste Formatierung eines Quelltextes zustande bekommt ..
Sorry wie will er dann mit Hooks zurechtkommen.
Zu 4. Was soll das schon sein?. Abkürzung für Windowsprocedure, Callback oder wie du es sonst nennen willst.

gruß

Khabarakh 4. Nov 2006 08:59

Re: Frage
 
Zitat:

Zitat von EWeiss
1 Timer ist eine sehr schlechte lösung für so etwas

Komplett falsch.

a) Es geht hier um ein Spiel. Und jedes Spiel, in dem eine Bewegung stattfindet, benötigt eine Spielschleife. Das kann eine echte Schleife sein oder in einfacher Art ein Timer. Der Timer ist also zwingend notwendig für ein Spiel, warum ihn dann nicht auch für dieses Problem benutzen?

b) Es geht hier um ein Spiel. Und jedes Spiel, das sich an die Windowsche Tastenverzögerung hält, würde ich sofort von meiner Festplatte verbannen. Hotkeys oder Keyhooks sind das Unsinnigste für ein Spiel, weil sie keine gleichmäßige und steuerbare Bewegung ermöglichen. Es muss unbedingt in der Spielschleife auf die Tasten geprüft werden.

Ergo: GetAsyncKeyState in der Spielschleife ist der richtige Weg, wobei ein Timer eben nur bei einfacheren Spielen in Frage kommt. So wird man es auch bei vielen kommerziellen und halbwegs guten nichtkommerziellen Spielen finden.

Phantom1 4. Nov 2006 13:12

Re: Frage
 
Zitat:

Zitat von Khabarakh
Ergo: GetAsyncKeyState in der Spielschleife ist der richtige Weg, wobei ein Timer eben nur bei einfacheren Spielen in Frage kommt. So wird man es auch bei vielen kommerziellen und halbwegs guten nichtkommerziellen Spielen finden.

Auch mein Code oben löst das Problem mit der Tastenverzögerung, letzendlich ist es aber geschmackssache wie man es macht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.
Seite 2 von 2     12   

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