![]() |
zu bestimmten Ereignissen Tasten ignorieren
Hallo erstmal :thumb:
Zuallererst: ich weiß nicht, ob hier der richtige Ort ist, aber ich geh mal davon aus ;D Zu meinem Problem: Ich schreibe derzeit an einer Steuerung einer Figur auf einem Feld. - An sich funktioniert auch alles: Es soll, sobald die Figur den Bildschirmrand erreicht hat, ein neuer Hintergrund aufgebaut und die Figur auf die entgegengesetzte Seite gesetzt werden - soweit so gut, jedoch läuft diese Figur ständig weiter - solange man die Taste drückt. Lässt man diese jedoch los, korrigiert Delphi die Position des Spielers und setzt die Figur auf den richtigen Platz. Nun wollte ich fragen, wie man erreichen kann, dass man zu einem bestimmten Event "simuliert" dass die Taste nicht mehr gedrückt wird. - und dann danach wieder zu "entsimulieren" :D Kann mir da jemand helfen? PS: Da dies meine erste Anfrage hier auf Delphi-Praxis ist, habe ich keine Ahnung, ob und wieviel Code von meinem Programm benötigt wird ;D |
AW: zu bestimmten Ereignissen Tasten ignorieren
Hallo und Willkommen in der DP :dp:,
zeig uns doch einmal den "Tastendruckcode", vielleicht kann man Dir helfen. |
AW: zu bestimmten Ereignissen Tasten ignorieren
Vorweg: Ich arbeite an einem 2D Spiel und verwende Andorra 2D...
Delphi-Quellcode:
Dann soll er bei jedem Frame berechnen:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin if Key = #27 then Close; if (Key = 'a') and (Spieler.IsIdle) then begin Spieler.FDistance := 40; Spieler.RRichtung := Links; Spieler.IsMoving := true; end; if (Key = 'w') and (Spieler.IsIdle) then begin Spieler.FDistance := 40; Spieler.RRichtung := Hoch; Spieler.IsMoving := true; end; if (Key = 'd') and (Spieler.IsIdle) then begin Spieler.FDistance := 40; Spieler.RRichtung := Rechts; Spieler.IsMoving := true; end; if (Key = 's') and (Spieler.IsIdle) then begin Spieler.FDistance := 40; Spieler.RRichtung := Runter; Spieler.IsMoving := true; end; end;
Delphi-Quellcode:
und dann:
if Spieler.IsMoving then
begin Spieler.Schritt(); end;
Delphi-Quellcode:
*Edit
procedure TSpieler.Schritt();
begin FDistance := FDistance - FSpeed * Performance.Timegap / 1000; case RRichtung of Links:begin FXpos := FXpos - FSpeed * Performance.Timegap / 1000; FXPosTile := FXPosTile - (FSpeed/48) * Performance.Timegap / 1000; end; Rechts:begin FXpos := FXpos + FSpeed * Performance.Timegap / 1000; FXPosTile := FXPosTile + (FSpeed/48) * Performance.TimeGap / 1000; end; Hoch:begin FYpos := FYpos - FSpeed * Performance.Timegap / 1000; FYPosTile := FYPosTile - (FSpeed/48) * Performance.TimeGap / 1000; end; Runter: begin FYpos := FYpos + FSpeed * Performance.Timegap / 1000; FYPosTile := FYPosTile + (FSpeed/48) * Performance.TimeGap / 1000; end; end; if FDistance <= 0 then begin if ((RRichtung = Links) and (GetAsyncKeyState(65) <> 0) or // A (RRichtung = Rechts) and (GetAsyncKeyState(68)<> 0 ) or // D (RRichtung = Hoch) and (GetAsyncKeyState(87)<> 0) or // W (RRichtung = Runter) and (GetAsyncKeyState(83)<> 0)) then // S begin FDistance := 5; end else FMoving := false; end; end;
Delphi-Quellcode:
// Wenn er aus der Karte herausgeht, dann
if Spieler.FXposTile >= 26 then //rechts begin Spieler.FXposTile := 0; MapTeilX := MapTeilX + 1; Map.Start; end; if Spieler.FYposTile > 20 then //unten begin Spieler.FYposTile := 0; MapTeilY := MapTeilY +1; Map.Start; end; if Spieler.FXposTile < 0 then //links begin Spieler.FXposTile := 25; MapTeilX := MapTeilX - 1; Map.Start; end; if Spieler.FYposTile < 0 then //oben begin Spieler.FYposTile := 19; MapTeilY := MapTeilY - 1; Map.Start; end; |
AW: zu bestimmten Ereignissen Tasten ignorieren
Von Andorra habe ich zugegebenermaßen keinen Schimmer, aber mir fällt auf, dass Du sehr viel redundaten Code schreibst. Ich habe das KeyPress einmal gekürzt:
Delphi-Quellcode:
Schau einmal ob die Zeile mit dem Application.ProcessMessages etwas bringt. Wenn nicht, kannst Du sie wieder löschen.
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin if Key = #27 then Close else if (Key in ['a','w','s','d']) and (Spieler.IsIdle) then begin Spieler.FDistance := 40; Spieler.IsMoving := true; case Key of 'a': Spieler.RRichtung := Links; 'w': Spieler.RRichtung := Hoch; 'd': Spieler.RRichtung := Rechts; 's': Spieler.RRichtung := Runter; end; Application.ProcessMessages; end; end; |
AW: zu bestimmten Ereignissen Tasten ignorieren
Ok Danke, das gekürtzte funktioniert prima ;D :thumb:
Was soll das Application.ProcessMessages bewirken? - Falls das mein Problem lösen sollte - nein leider nicht :( |
AW: zu bestimmten Ereignissen Tasten ignorieren
Uberprüfe in Deiner Key abfrage, vor der Ausführung des keys, ob das Ende der Position erreicht ist!
Wenn ja, dann neues Bild laden Position setzten und key ausführen! Gruss alfold |
AW: zu bestimmten Ereignissen Tasten ignorieren
Delphi-Quellcode:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin if Key = #27 then Close else if (Key in ['a','w','s','d']) and (Spieler.IsIdle) and not (Spieler.MapVerlassen) then begin Spieler.FDistance := 40; Spieler.IsMoving := true; case Key of 'a': Spieler.RRichtung := Links; 'w': Spieler.RRichtung := Hoch; 'd': Spieler.RRichtung := Rechts; 's': Spieler.RRichtung := Runter; end; Application.ProcessMessages; end else begin Spieler.Spielerzeichnen; Spieler.MapVerlassen := false; end; end; So funktionierts nicht... Er läuft trotzdem immer weiter :/ |
AW: zu bestimmten Ereignissen Tasten ignorieren
Und wo setzt Du Spieler.MapVerlassen?
|
AW: zu bestimmten Ereignissen Tasten ignorieren
Delphi-Quellcode:
// Wenn er aus der Karte herausgeht, dann
if Spieler.FXposTile >= 26 then //rechts begin Spieler.MapVerlassen := true; Spieler.FXposTile := 0; MapTeilX := MapTeilX + 1; Map.Start; end; if Spieler.FYposTile > 20 then //unten begin Spieler.MapVerlassen := true; Spieler.FYposTile := 0; MapTeilY := MapTeilY +1; Map.Start; end; if Spieler.FXposTile < 0 then //links begin Spieler.MapVerlassen := true; Spieler.FXposTile := 25; MapTeilX := MapTeilX - 1; Map.Start; end; if Spieler.FYposTile < 0 then //oben begin Spieler.MapVerlassen := true; Spieler.FYposTile := 19; MapTeilY := MapTeilY - 1; Map.Start; end; |
AW: zu bestimmten Ereignissen Tasten ignorieren
Kann es sein Das Du da zweimal den key abfragst wenn er gedrückt ist?
Delphi-Quellcode:
Gruss alfold
....
if FDistance <= 0 then begin if ((RRichtung = Links) and (GetAsyncKeyState(65) <> 0) or // A //<---- (RRichtung = Rechts) and (GetAsyncKeyState(68)<> 0 ) or // D (RRichtung = Hoch) and (GetAsyncKeyState(87)<> 0) or // W (RRichtung = Runter) and (GetAsyncKeyState(83)<> 0)) then // S begin FDistance := 5; end else FMoving := false; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:21 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