AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Frage zur Tastatureingabe und Kollisionsabfrage
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zur Tastatureingabe und Kollisionsabfrage

Ein Thema von Jack der 3 · begonnen am 1. Nov 2006 · letzter Beitrag vom 4. Nov 2006
Antwort Antwort
Seite 2 von 2     12   
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#11

Re: Frage

  Alt 2. Nov 2006, 20:07
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) = 'Wthen
    movie1.Top:= movie1.Top -10;
  if char (key) = 'Sthen
    movie1.Top:= movie1.Top +10;
  if char (key) = 'Athen
    movie1.left:= movie1.left -10;
  if char (key) = 'Dthen
    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 ersetzeif Char(key) = 'Wthen durch 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^^
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

Re: Frage

  Alt 2. Nov 2006, 20:17
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ß
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Frage

  Alt 3. Nov 2006, 21:50
Zitat von EWeiss:
1 Timer ist eine sehr schlechte lösung für so etwas
Warum?
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 von EWeiss:
Wenn ich mir aber den Quelltext ansehe komplett unformatiert
denke ich es macht keinen sinn mit KeyHooks und ähnlichen anzufangen.
Wieso?
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.
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#14

Re: Frage

  Alt 3. Nov 2006, 22:07
@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.
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#15

Re: Frage

  Alt 3. Nov 2006, 22:56
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

Re: Frage

  Alt 4. Nov 2006, 04:24
Zitat von Cöster:
Zitat von EWeiss:
1 Timer ist eine sehr schlechte lösung für so etwas
Warum?
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 von EWeiss:
Wenn ich mir aber den Quelltext ansehe komplett unformatiert
denke ich es macht keinen sinn mit KeyHooks und ähnlichen anzufangen.
Wieso?
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ß
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#17

Re: Frage

  Alt 4. Nov 2006, 09:59
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#18

Re: Frage

  Alt 4. Nov 2006, 14:12
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:06 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