Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   zu bestimmten Ereignissen Tasten ignorieren (https://www.delphipraxis.net/159714-zu-bestimmten-ereignissen-tasten-ignorieren.html)

Bambennos 9. Apr 2011 15:40

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

DeddyH 9. Apr 2011 15:55

AW: zu bestimmten Ereignissen Tasten ignorieren
 
Hallo und Willkommen in der DP :dp:,

zeig uns doch einmal den "Tastendruckcode", vielleicht kann man Dir helfen.

Bambennos 9. Apr 2011 15:59

AW: zu bestimmten Ereignissen Tasten ignorieren
 
Vorweg: Ich arbeite an einem 2D Spiel und verwende Andorra 2D...

Delphi-Quellcode:
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;
Dann soll er bei jedem Frame berechnen:
Delphi-Quellcode:
if Spieler.IsMoving then
    begin
     Spieler.Schritt();
    end;
und dann:

Delphi-Quellcode:
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;
*Edit


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;

DeddyH 9. Apr 2011 16:15

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:
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;
Schau einmal ob die Zeile mit dem Application.ProcessMessages etwas bringt. Wenn nicht, kannst Du sie wieder löschen.

Bambennos 9. Apr 2011 16:34

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 :(

alfold 9. Apr 2011 16:57

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

Bambennos 9. Apr 2011 17:09

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 :/

alfold 9. Apr 2011 17:14

AW: zu bestimmten Ereignissen Tasten ignorieren
 
Und wo setzt Du Spieler.MapVerlassen?

Bambennos 9. Apr 2011 17:17

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;

alfold 9. Apr 2011 22:06

AW: zu bestimmten Ereignissen Tasten ignorieren
 
Kann es sein Das Du da zweimal den key abfragst wenn er gedrückt ist?

Delphi-Quellcode:
....
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;
Gruss alfold


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:13 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf