![]() |
Suche Hilfe bei Bewegung einer Form
Hallo, bin ein Delphi-Anfänger und ich soll für die Schule das Spiel Snake programmieren. Ich möchte vorerst den Kopf bewegen lassen. Ich kann den Kopf zeichen lassen und auch der Debugger läuft, aber ich kann ihn nicht bewegen. Wo liegt der Fehler?
mTSchlange ist der Kopf und der Schwanz in einem, wird jedoch nicht gezeichnet
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, mTHintergrund, mTSchlange, mTFutter, mTKopf; type TForm1 = class(TForm) Image1: TImage; Timer1: TTimer; {TiGameEngine: TTimer;} procedure FormCreate(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure TiGameEngineTimer (Sender: TObject); private { Private-Deklarationen } Hintergrund : THintergrund; Links,Rechts,Hoch,Runter : Boolean; Kopf : TKopf; public { Public-Deklarationen } Schlange : TSchlange; Futter : TFutter; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Hintergrund:= THintergrund.create(Image1); Hintergrund.zeichnen(); Schlange:= TSchlange.create(250,300,Image1,Futter); Kopf:= TKopf.create(250,300,Image1,Futter); Kopf.zeichnen(); Kopf.bewege_links(); Kopf.bewege_rechts(); Kopf.bewege_oben(); Kopf.bewege_unten(); end; procedure TForm1.TiGameEngineTimer (Sender: TObject); begin IF (Links = True) and (Kopf.GetZXPosition > 0) Then begin Kopf.bewege_links(); end; IF (Rechts = True) and (Kopf.GetZXPosition < 649) Then begin Kopf.bewege_rechts(); end; IF (Hoch = True) and (Kopf.GetZYPosition > 0) Then begin Kopf.bewege_oben(); end; IF (Runter = True) and (Kopf.GetZYPosition < 481) Then begin Kopf.bewege_unten(); end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin IF (Key = VK_LEFT ) Then begin Links := True; end; IF (Key = VK_Right ) Then begin Rechts := True; end; IF (Key = VK_Up ) Then begin Hoch := True; end; IF (Key = VK_Down ) Then begin Runter := True; end; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin IF (Key = VK_Left ) Then begin Links := False; end; IF (Key = VK_Right ) Then begin Rechts := False; end; IF (Key = VK_Up ) Then begin Hoch := False; end; IF (Key = VK_Down ) Then begin Runter := False; end; end; end. |
AW: Suche Hilfe bei Bewegung einer Form
Ist KeyPreview des Formulars auf True, damit der Tastendruck überhaupt im FormKeyDown landet?
|
AW: Suche Hilfe bei Bewegung einer Form
Wie sehen denn die verwendeten Klassen (THintergund etc.) aus? Und gewöhn Dir lieber gar nicht erst an, mit true oder false zu vergleichen, das kann zu falschen Ergebnissen führen.
Die OnKeyDown-Methode würde ich etwas anders schreiben:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin case Key of VK_LEFT: Links := True; VK_Right: Rechts := True; VK_Up: Hoch := True; VK_Down Runter := True; end; end; |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
|
AW: Suche Hilfe bei Bewegung einer Form
Ja, ich befürchte, dass er in den Timer gar nicht reinkommt, weil du ja den Finger auf der Taste hast ... Klammer doch mal alles in KeyUp aus und schau ob dann irgendwas passiert, wenn du die Taste nach Links drückst und wieder loslässt.
EDIT : oder passiert da auch schon nix? Kopf.bewege_links(); Kopf.bewege_rechts(); Kopf.bewege_oben(); Kopf.bewege_unten(); |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
Aber so wie es aussieht ist das doch nur eine Vereinfachung von dem, was ich geschrieben habe.. |
AW: Suche Hilfe bei Bewegung einer Form
Ist es, Du hast uns aber immer noch nicht die Klassen gezeigt.
|
AW: Suche Hilfe bei Bewegung einer Form
Probier es mal mit anderen Tasten, beispielsweise dem Nummernblock oder noch besser Buchstaben. Ich meine Dinge wie die Pfeiltasten sind Sonderfälle, die werden so garnicht normal an die Form durchgereicht.
|
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
Ein Freund meinte außerdem irgendwie, dass der Kopf nur auf den Koordinaten 250, 300 createt wird
Delphi-Quellcode:
Liegt da irgendwo der Fehler?
Kopf:= TKopf.create(250,300,Image1,Futter);
|
AW: Suche Hilfe bei Bewegung einer Form
Woher sollen wir das wissen, wenn wir die Klassen nicht kennen? Ich frag ja nicht umsonst die ganze Zeit danach.
|
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
|
AW: Suche Hilfe bei Bewegung einer Form
Oder wenns zu lang ist einen Anhang machen, da am besten mal alle "mT" Units mit rein.
|
AW: Suche Hilfe bei Bewegung einer Form
mTHintergrund, mTSchlange, mTFutter und mTKopf werden wir wohl alle brauchen.
[edit] Und wie mein Vorredner schon sagte, bitte als Anhang ;) [/edit] |
AW: Suche Hilfe bei Bewegung einer Form
Liste der Anhänge anzeigen (Anzahl: 5)
Anhang 39430
Anhang 39431 Anhang 39432 Anhang 39433 Anhang 39434 Zitat:
|
AW: Suche Hilfe bei Bewegung einer Form
Ich bleibe dabei, die Tastendrucke funktionieren noch nicht einmal. Ersetze das "bewegeSchlange" doch mal durch ein ShowMessage, allein das wird schon nicht kommen. Oder ich mache grade auch etwas gewaltig falsch:
Ich bekomme ohne weitere Hilfsmittel kein "onKeyDown" auf einer Form und das noch mit Pfeiltasten zum Laufen. Mit anderen Tasten wie Buchstaben allerdings schon. |
AW: Suche Hilfe bei Bewegung einer Form
Liste der Anhänge anzeigen (Anzahl: 1)
|
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
|
AW: Suche Hilfe bei Bewegung einer Form
@DeddyH
Zitat:
Delphi-Quellcode:
Ist der Kopf einmal links, bleibt er immer links.
procedure TForm1.TiGameEngineTimer (Sender: TObject);
begin IF (Links = True) and (Kopf.GetZXPosition > 0) Then begin Kopf.bewege_links(); end; ... Mir erscheint eine derartige Lösung sinnvoller:
Delphi-Quellcode:
Key kann hier die Werte 37 bis 40 enthalten, die problemlos beim Form ankommen, diesbezügliche Befürchtungen sind unbegründet.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin Links := Key = VK_LEFT; Rechts := Key = VK_Right; Hoch := Key = VK_Up; Runter := Key = VK_Down; end; Mit
Delphi-Quellcode:
schön überprüfbar (zumindest bei Delphi 7). Im Debugger wird's nicht anders aussehen.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin ShowMessage(IntToStr(key)); end; |
AW: Suche Hilfe bei Bewegung einer Form
Ein Freund meinte außerdem irgendwie, dass der Kopf nur auf den Koordinaten 250, 300 createt wird
Kopf:= TKopf.create(250,300,Image1,Futter); Liegt da irgendwo der Fehler? Habt ihr das eigentlich berücksichtigt? :) Hatte ich ja eben geschrieben |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
Delphi-Quellcode:
Ist der Kopf einmal links, bleibt er immer links.
procedure TForm1.TiGameEngineTimer (Sender: TObject);
begin IF (Links = True) and (Kopf.GetZXPosition > 0) Then begin Kopf.bewege_links(); end; ... [/QUOTE] Bei Snake soll die Schlange doch auch durchgehend in diese Richtung verlaufen |
AW: Suche Hilfe bei Bewegung einer Form
EIDT : hat sich erledigt
|
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
Auch wenn die Taste VK_Right gedrückt wurde? Wenn also einmal links gedrückt wurde, läuft die Schlange nach links. Wird nun rechts gedrückt, läuft die Schlange nach rechts. Da in der Abfrage geprüft wird, ob links gedrückt wurde, geht's nach links und dann wird nach rechts geprüft und die Schlange geht nach rechts und damit bleibt sie immer wo sie ist. Analog für oben und unten. Und das scheint doch momentan das Problem zu sein? |
AW: Suche Hilfe bei Bewegung einer Form
@nahpets : gugg dir auch die OnKeyUp an, dort wird's wieder auf False gesetzt.
|
AW: Suche Hilfe bei Bewegung einer Form
Ich habe jetzt nur kurz in 2 der Dateien hineingeschaut. Im Konstruktor fehlt mir jeweils der inherited-Aufruf, Destruktoren fehlen ganz, obwohl hier die privaten Objekte, die im Konstruktor angelegt werden, freigegeben werden sollten. Und wieso sind alle Methoden virtuell, obwohl es keine Ableitungen gibt? Gut, das ist nicht weiter schlimm, aber virtuell nur einfach so sieht auch komisch aus.
|
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
Sorry, aber bin noch ein Anfänger² |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
D. H.: Wenn nicht während des Timerereignisses eine Taste gedrückt ist, kann auch keine Bewegung erfolgen. Wenn ich jetzt wieder daneben liege, liegt's am Wetter, das heute meine Denkfähigkeit noch weiter einschränkt, als im Normalzustand ;-) Eigentlich dachte ich, dass die Schlange solange in eine Richtung läuft, bis man diese per Tastatur ändert. Hier läuft sie aber nur solange in eine Richtung, wie eine Taste gedrückt gehalten wird und in diesen Zeitraum ein Timerereignis fällt. Ist das so gewünscht? |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
|
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
Kommentiere bitte mal Dein onKeyUP aus und ändere das onKeyDown nach meinem Vorschlag und dann schau mal, ob sich was ändert. Wenn nicht, gebe ich mich geschlagen. |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
|
AW: Suche Hilfe bei Bewegung einer Form
in mTKopf steht folgendes:
Delphi-Quellcode:
was heißt hier werden nur die Koordinaten geändert, es muss aber wieder neu gezeichnet werden.
procedure TKopf.bewege_links;
begin zXPosition := zXPosition - zXGeschwindigkeit; end; Es sollte doch dann eigentlich so in der Art gehen:
Delphi-Quellcode:
IF (Links = True) and (Kopf.GetZXPosition > 0) Then
begin Kopf.bewege_links(); //hier noch mal altes Image löschen ? Kopf.zeichne(); end; |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
kann es nicht sein, dass hier :
Delphi-Quellcode:
der Kopf nur an den Koordinaten 250,300 sein kann, da nur dort ein create vorhanden ist?
Kopf:= TKopf.create(250,300,Image1,Futter);
Kopf.zeichnen(); |
AW: Suche Hilfe bei Bewegung einer Form
Nochmal: Du zeichnest den Kopf nur ein einziges mal. Danach nie wieder.
Hast du auch das
Delphi-Quellcode:
nach allen Abfragen eingesetzt oder nur gerade für den Links-Fall?
Kopf.zeichne()
|
AW: Suche Hilfe bei Bewegung einer Form
Also bei mir funktioniert es so:
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, mTHintergrund, mTSchlange, mTFutter, mTKopf; type { TForm1 } TForm1 = class(TForm) Image1: TImage; Timer1: TTimer; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } Hintergrund : THintergrund; Links,Rechts,Hoch,Runter : Boolean; Kopf : TKopf; public { Public-Deklarationen } Schlange : TSchlange; Futter : TFutter; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin Hintergrund:= THintergrund.create(Image1); Hintergrund.zeichnen(); Schlange:= TSchlange.create(Image1.Width div 2,Image1.Height-30,Image1,Futter); Kopf:= TKopf.create(Image1.Width div 2 ,Image1.Height-30 ,Image1,Futter); Kopf.zeichnen(); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin Links := Key = VK_LEFT; Rechts := Key = VK_Right; Hoch := Key = VK_Up; Runter := Key = VK_Down; end; procedure TForm1.Timer1Timer(Sender: TObject); begin IF (Links = True) and (Kopf.GetZXPosition > 0) Then begin Kopf.bewege_links(); Kopf.zeichnen; end; IF (Rechts = True) and (Kopf.GetZXPosition < 649) Then begin Kopf.bewege_rechts(); Kopf.zeichnen; end; IF (Hoch = True) and (Kopf.GetZYPosition > 0) Then begin Kopf.bewege_oben(); Kopf.zeichnen; end; IF (Runter = True) and (Kopf.GetZYPosition < 481) Then begin Kopf.bewege_unten(); Kopf.zeichnen; end; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin Links := Key = VK_LEFT; Rechts := Key = VK_Right; Hoch := Key = VK_Up; Runter := Key = VK_Down; end; end. |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
|
AW: Suche Hilfe bei Bewegung einer Form
Eigentlich genau so wie Ginko es gerade noch einmal schön ausgeschrieben hat: Nur durch das Ändern der Zahlen-Variablen ändert sich auf dem Bildschirm ja noch nichts. Du musst nach jeder Änderung (also einer Bewegung) die Zeichne()-Prozedur aufrufen damit diese die Änderungen überhaupt auf den Bildschirm malen kann.
|
AW: Suche Hilfe bei Bewegung einer Form
Man sollte noch die Klassen die man mit Create erstellt hat wieder freigeben.
Also:
Delphi-Quellcode:
procedure TForm1.FormDestroy(Sender: TObject);
begin FreeAndNil(Hintergrund); FreeAndNil(Kopf); //usw... end; |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
Aber du hast hoch und runter vertauscht :) Was soll das aber heißen, Klassen freizugeben? |
AW: Suche Hilfe bei Bewegung einer Form
Zitat:
![]() unter allgemeiner Aufbau. An Hoch und runter hatte ich nichts geändert, war schon vertauscht. Mfg |
AW: Suche Hilfe bei Bewegung einer Form
Deshalb ja auch mein Hinweis auf den Destruktor. Im Konstruktor werden Objekte angelegt, deshalb sollte es auch einen Destruktor geben, der die wieder abräumt.
|
AW: Suche Hilfe bei Bewegung einer Form
Eine Frage hätte ich noch : Wie kann ich den Schritt der Bewegung schreiben? :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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