![]() |
Wiederholung bei gedrückter taste
Also ich bin es schon wieder^^
und schon wiweder mit onkeydown :mrgreen: Folgendes Prob: Mein "Spiel"(eigentlich ein einziges versuchsfeld) funktioniert so schon mehr oder weniger, nun steuere ich das männel mit den pfeiltasten und bei onkeydown gibt es den effekt, dass es ert 1 Impuls und danach nach einer kurzen pause erst die Impulse in reihe gibt, kann man diese Pause irgendwie verhindern? falls jemand nicht weis, was ich meine, das ist im Windows ist genau so, wenn man mmmmmmmmmm schreibt, oder so dann kommt erst 1 m und danach dann die vielen hintereinander. Hoffe es ist verständluich und vor allem zu lösen :sharkylinchen: |
Re: Wiederholung bei gedrückter taste
Das macht der Tastaturcontroler so (also der in der Tastatur). Der schickt genau auf diese Weise, die Kommandos, das die Taste gedrückt wurde. Und er schickt einmal ein Kommando, wen die Taste losgelassen wird. Man kann die Zeiten bis der nächste Klick kommt auch umprogrammieren (zumindest ging das früher, soweit ich mich erinnere) Und wahrscheinlich geht es heute über den Tastaturtreiber. Brauchst du aber alles nicht. Denn dir reicht ja mitzubekommen, wann eine Taste gedrückt wird und wann sie wieder losgelassen wird.
Also kannst du onkeydown und onkeyup verwenden. Dann wiest du wann die Taste unten (gedrückt) und wann sie oben ist (nicht gedrückt) Es gibt dann noch Ereignisunabhängig den Befehl GetAsyncKeyState |
Re: Wiederholung bei gedrückter taste
das was du gesagt hast hab ich alles schon rausgefunden, es geht jetzt darum: wenn ich nun ne Pfeiltaste drücke, dann macht das männel einen schritt und dann nach der Pause läuft es weiter, dass wollte ich verhindern, scheint aber schwer zu werden.
|
Re: Wiederholung bei gedrückter taste
sirius hat schon recht
Delphi-Quellcode:
oder du schaust über einen timer ob die tase gedrückt ist und bewegst dann
var
weiter, SchonGedrückt: Boolean; procedure bewegen; begin repeat //bewegen until weiter; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if not SchonGedrückt then begin weiter := false; schonGedrückt := true; bewegen; end; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin weiter := True; schonGedrückt := false; end; |
Re: Wiederholung bei gedrückter taste
Zitat:
|
Re: Wiederholung bei gedrückter taste
also bewegen tut sich da schon alles, das problem ist nur , dass es am anfang durch diese Eigenschaft der Tastatur ert nur 1 macht, dann den rest.
erklärung: ani gibt an, welche animation ablaufen soll, 11 ist laufen rechts
Delphi-Quellcode:
also nur mal auf das minimale begrenzt
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin if ani in [11..14] then begin Twait.enabled:=false; Tani.enabled:=true; case key of vk_right: begin ani:=11;// 1=gehen 1=rechts end; end; end; procedure TForm1.TaniTimer(Sender: TObject); begin case ani of 11: begin Ilaufr.left:=Ilaufr.left+5; end; end; end; |
Re: Wiederholung bei gedrückter taste
warum machst du dir es so kompliziert?^^
Delphi-Quellcode:
var
Speed: Integer; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin case key of vk_right: speed := 5; vk_left: speed := -5; end; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin speed := 0; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Ilaufr.left:=Ilaufr.left+Speed; end; |
Re: Wiederholung bei gedrückter taste
Also wenn ich das richtig verstanden habe, dann möchte er gerade dass das Männchen nur einen Schritt macht, auch wenn die Taste weitere Signale sendet. Ich würde es so machen:
Delphi-Quellcode:
Du musst halt "down := false;" noch zu beginn des Programmes eintragen. Den Timer brachst du nicht mehr und KeyUp muss halt wie KeyDown eingetragen werden.
var
down : boolean; [..] procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if down then exit; if ani in [11..14] then case key of vk_right: ani:=11;// 1=gehen 1=rechts end; down := true; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin down := false; end; |
Re: Wiederholung bei gedrückter taste
Zitat:
das männel bewegt sich wenn man drauf bleibt weiter und das ist auch so gewollt, aber es gibt den effekt, dass, wenn man lange auf einer taste bleibt es etwa siesen zeitlichen ablauf hat: m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm _^diese Pause, bevor da die anderen kommen will ich irgendwie umgehen, falls es geht |
Re: Wiederholung bei gedrückter taste
Eigentlich nimmt man für sowas (so denke ich auf jeden Fall) die Funktion, die im Beitrag #2 von Sirius erwähnt wurde!
getasynckeystate() Diese Funktion gibt zurück, ob eine bestimmte Taste zur Abfrage-Zeit gedrückt wurde! Also muss man in einen Timer folgendes schreiben:
Delphi-Quellcode:
Musst halt noch auf deine Bedürfnisse anpassen!
if getasynckeystate(vk_right)<>0 then männel.xwert:=männel.xwert+5;
Edit: Und das läuft dann natürlich ohne die von dir angesprochenen Pausen ab! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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