AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein zu bestimmten Ereignissen Tasten ignorieren

zu bestimmten Ereignissen Tasten ignorieren

Ein Thema von Bambennos · begonnen am 9. Apr 2011 · letzter Beitrag vom 9. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2   
Bambennos

Registriert seit: 18. Feb 2011
6 Beiträge
 
#1

zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 15:40
Hallo erstmal
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"

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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.148 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 15:55
Hallo und Willkommen in der DP ,

zeig uns doch einmal den "Tastendruckcode", vielleicht kann man Dir helfen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bambennos

Registriert seit: 18. Feb 2011
6 Beiträge
 
#3

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 15:59
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;

Geändert von Bambennos ( 9. Apr 2011 um 16:05 Uhr) Grund: Habe die überprüfung des Verlassens vergessen *_*
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.148 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 16:15
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Bambennos

Registriert seit: 18. Feb 2011
6 Beiträge
 
#5

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 16:34
Ok Danke, das gekürtzte funktioniert prima ;D
Was soll das Application.ProcessMessages bewirken? - Falls das mein Problem lösen sollte - nein leider nicht
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 16:57
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
  Mit Zitat antworten Zitat
Bambennos

Registriert seit: 18. Feb 2011
6 Beiträge
 
#7

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 17:09
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 :/
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 17:14
Und wo setzt Du Spieler.MapVerlassen?
  Mit Zitat antworten Zitat
Bambennos

Registriert seit: 18. Feb 2011
6 Beiträge
 
#9

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 17:17
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;
  Mit Zitat antworten Zitat
alfold

Registriert seit: 29. Jun 2010
Ort: Neustrelitz
393 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: zu bestimmten Ereignissen Tasten ignorieren

  Alt 9. Apr 2011, 22:06
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:01 Uhr.
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