Einzelnen Beitrag anzeigen

Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#1

[Gelöst] Verwendung von TQueue

  Alt 13. Okt 2012, 18:02
'Nabend DP,

Ich habe da ein kleines Spiel (Tron ) geplant. Soweit läuft auch alles gut.
Aaaaber: Mir ist aufgefallen, dass ich 2x ganz schnell eine Taste drücken kann und das 'Bike' fährt gegen seine eigene Mauer (dreht sich um 180°)
Daher habe ich zunächst einfach weitere Tasteneingaben gesperrt, bis das Bike eine Position weiter ist. Das finde ich aber eigenltich sehr unschön, und würde die Tastendrücke gerne nacheinander abaerbeiten.

Somit bin ich dann bei TStack und TQueue gelandet. Soweit ich das richtig verstanden habe gibt es für meine Delphi Version (D7 Enterprise) keine TStack <Integer> ö.Ä. - er nimmt nur Zeiger an
Nun zu meinem eigentlichen Problem:

Delphi-Quellcode:
procedure TMain.MainKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
    70: Tasten.Push(@Key); // [F] - LINKS
    74: Tasten.Push(@Key); // [J] - RECHTS
    end;
end;
Angenommen es liegt auf dem Stack ein Zeiger der auf Key zeigt. Dann würde doch bei meinem nächsten Tastendruck beide Items auf den selben Key zeigen oder irre ich da

Und wenn es trotzdem unterschiedliche Werte sein sollten - wie wertet man den Stack wieder aus ?
Ich hatte mir gedacht, dass vor jeder Bewegung geprüft wird, welche Richtung er gehen soll:

Delphi-Quellcode:
procedure TMain.Timer1Timer(Sender: TObject);
var
  i: ^Integer;
begin
  i := Tasten.Pop;
  case ^i of
    70: Spieler[0].dreheLinks;
    74: Spieler[0].dreheRechts;
  darstellen(Sender);
end;
Nun meckert der Compiler aber, dass 'i' kein Integer sondern ein Char sein soll .. wobei der Zeiger doch auf einen Integer zeigt


Ich hoffe ich konnte mich halbwegs verständlich ausdrücken Ist für mich das Erste mal dass ich mit Zeigern hantieren muss


//Edit: Habe es soweit hinbekommen, dass ich keine Fehlermeldung bekomme.
Delphi-Quellcode:
procedure TMain.Timer1Timer(Sender: TObject);
var
  i: ^Integer;
begin
  if Tasten.Count > 0
    then begin
      i := Tasten.Pop;
      case Ord(^i) of
        70: Spieler[0].dreheLinks; // [F] - LINKS
        74: Spieler[0].dreheRechts; // [J] - RECHTS
        end;
      end;
  darstellen(Sender);
end;
allerdings scheint es so, als würde er nichts auf den Stack schieben (jedenfalls enthällt er im Debug mode keine Zeiger)

Geändert von MrMooed (14. Okt 2012 um 17:32 Uhr)
  Mit Zitat antworten Zitat