![]() |
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:
So finde ich das schonmal viel übersichtlicher.
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; 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:
durch
if Char(key) = 'W' then
Delphi-Quellcode:
das wiederholst du für die anderen If-Abfragen nach dem gleichen Prinzip.
if getasynckeystate(ord('W')) < 0 then
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: ![]() 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^^ |
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ß |
Re: Frage
Zitat:
Zitat:
Zitat:
Zitat:
|
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.
|
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. |
Re: Frage
Zitat:
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ß |
Re: Frage
Zitat:
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. |
Re: Frage
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz