![]() |
AW: Weiterlernen
Das problem ist das,das programm sich nicht "wiederholt" nachdem timer1 und timer2 einmal ausgeführt wurden stopt das programm...
Delphi-Quellcode:
<---Mein versuch den loop zu wiederholen wen er einmal ausgeführt wurde.
if timer2.enabled = false then timer1.enabled:=true; //geht nicht .____.
|
AW: Weiterlernen
Zitat:
Code:
Untersuchen wir mal Timer1.
Stopp-Bedingungen
Timer 1: shape1.left = 150 Timer 2: shape1.left = 0 Annahme Shape.Left ist zu Beginn "0". Somit müsste der Timer1 genau 5x ausgeführt werden und danach stoppen. In diesem Zusammenhang wäre es besser für die Abbruchbedingung ">= 150" einzusetzen. Aber wie wird der Timer1 wieder gestartet? (gilt auch für Timer2) Timer2: Die Zeile
Delphi-Quellcode:
macht irgendwie keinen Sinn... ebenso
if timer1.enabled
then begin
Delphi-Quellcode:
timer2.interval := 100;
Delphi-Quellcode:
procedure tform1.timer1timer(sender: Tobject);
begin if shape1.left >= 0 then begin timer1.interval := 100; shape1.left := shape1.left + 30; if shape1.left = 150 then begin timer1.enabled := false; timer2.enabled := true; end; end; end; procedure tform1.timer2timer(sender: Tobject); begin if timer1.enabled then begin timer2.interval := 100; shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; end; end. |
AW: Weiterlernen
Nimm einfach einen Timer, lass den einfach immer durchlaufen und ändere die Schrittweite ab.
Delphi-Quellcode:
TForm1 = class( TForm )
... private FShapeIncrement: Integer; public procedure AfterConstruction; override; end; procedure TForm1.AfterConstruction; begin inherited; // Startwert festlegen FShapeIncrement := 30; end; procedure TForm1.Timer1OnTimer( Sender: TObject ); var newLeft: Integer; maxLeft: Integer; begin newLeft := Shape1.Left + FShapeIncrement; maxLeft := Shape1.Parent.ClientWidth - Shape1.Width; if newLeft <= 0 then begin newLeft := 0; FShapeIncrement := - FShapeIncrement; end else if newLeft >= maxLeft then begin newLeft := maxLeft; FShapeIncrement := - FShapeIncrement; end; Shape1.Left := newLeft; end; |
AW: Weiterlernen
Folgender Code funktioniert: (Bedingung Shape1.Left ist zu Beginn = 0)
Delphi-Quellcode:
Aber ich gebe Sir Rufo Recht, ein Timer ist besser :-)
procedure TForm1.Timer1Timer(Sender: TObject);
begin if shape1.left < 150 then shape1.left := shape1.left + 30; if shape1.left >= 150 then begin timer2.enabled := true; timer1.enabled := false; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if shape1.left > 0 then shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; |
AW: Weiterlernen
Vielen dank,euch beiden ^_^ !
|
AW: Weiterlernen
Ist mir jetzt ein wenig peinlich wieder nach hilfe zu suchen,leider hab ich schon ein paar tage versucht das programm hinzubekommen,ohne erfolg... :oops:
Delphi-Quellcode:
Die idee ist es erstmal den Shape 2 auf gleiche höhe wie Shape1 zu setzen,wenn das erst mal möglich ist wollte ich eine collision detection einzubauen.Nur funktioniert die KeyDown procedure nicht.Hoffe dass solch eine frage nicht doppelt gestellt wurde,aber die anderen themen haben mir leider nicht geholfen...
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); IF timer1.enabled:=true then begin IF key = VK_Down THEN shape1.Top := shape1.Top +5; IF key = VK_UP THEN shape1.Top := shape1.Top -5; IF key = VK_RIGHT THEN shape1.Left := shape1.Left +5; IF key = VK_LEFT THEN shape1.Left := shape1.Left -5; end; end; procedure TForm1.FormCreate(Sender: TObject); begin KeyPreview:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if shape1.left < 150 then shape1.left := shape1.left + 30; if shape1.left >= 150 then begin timer2.enabled := true; timer1.enabled := false; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if shape1.left > 0 then shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; end. |
AW: Weiterlernen
Hi,
Was funktioniert da genau nicht? Falls die prozedur gar nicht aufgerufen wird, versuche mal die KeyPreview Eigenschaft von deinem Formular auf True zu setzen. Edit: Ok, beim 2. Blick ist es nicht zu übersehen. :cyclops: Du solltest dir unbedingt angewöhnen deinen Code richtig einzurücken, denn so kann (bzw. will :stupid:) das doch keiner lesen. :D Das hilft dir wirklich weiter wenn du später lange und komplexe Algorithmen schreibst, denn du siehst "automatisch" wo du gerade im Code bist und kannst ganz klare Abschnitte/Trennungen schaffen. Ausserdem hättest du so das Problem dann ganz einfach selbst bemerkt ;) Und zwar fehlt da sehr wahrscheinlich das begin der Prozedur. So sollte der Code kompilierbar sein: (nicht getestet - aber lesbar formatiert ist er! :D) Nachtrag: Du hast noch einen Fehler drin und zwar bei dir auf der 3. Zeile (
Delphi-Quellcode:
) versuchst du eine Abfrage mit dem "Zuweisungszeichen" (:=) zu machen. Bei abfragen fragst du aber nur mit dem Gleich-Zeichen (=) ab. Im unteren Code ist es korrigiert.
IF timer1.enabled:=true then
Delphi-Quellcode:
Auch wäre es sehr empfehlenswert uns den Fehler mitzuteilen der dir der Compiler ausspuckt - auch ein sehr guter Hinweis was der Fehler sein könnte. :)
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin IF timer1.enabled=true then // Du könntest auch ganz einfach "if timer1.enabled then" abfragen für TRUE. begin IF key = VK_Down THEN shape1.Top := shape1.Top +5; IF key = VK_UP THEN shape1.Top := shape1.Top -5; IF key = VK_RIGHT THEN shape1.Left := shape1.Left +5; IF key = VK_LEFT THEN shape1.Left := shape1.Left -5; end; end; procedure TForm1.FormCreate(Sender: TObject); begin KeyPreview:=True; end; procedure TForm1.Timer1Timer(Sender: TObject); begin if shape1.left < 150 then shape1.left := shape1.left + 30; if shape1.left >= 150 then begin timer2.enabled := true; timer1.enabled := false; end; end; procedure TForm1.Timer2Timer(Sender: TObject); begin if shape1.left > 0 then shape1.left := shape1.left - 30; if shape1.left <= 0 then begin timer1.enabled := true; timer2.enabled := false; end; end; Find ich sehr gut das du aus eigenem Antrieb weiter lernst. Weiter so! :thumb: Freundliche Grüsse |
AW: Weiterlernen
Zitat:
Ich bekomme keine fehlermeldung aber der Shape 2 bewegt sich leider nicht wenn ich meine pfeiltasten benutze. PS:Ich wollte gar nicht eine IF schleife haben,wo kommt denn hier,bin halt ein profi programmierer:lol: |
AW: Weiterlernen
Zitat:
Wenn du dein Shape mit den Pfeiltasten bewegen willst brauchst du doch nicht die 2 Timer die da dazwischen funken und dein Shape selbst auch bewegen oder? Zitat:
Ich würde erstmal nachsehen ob OnKeyDown überhaupt getriggert wird indem du dort einen Haltepunkt setzt und mit F9 den Debugger startest, dann kannst du auch sehen ob sich da überhaupt was tut. Zitat:
Versuchs mal so:
Delphi-Quellcode:
Hier ist die if-abfrage die du ja nicht willst draussen und es wird auch shape2 (Falls es denn auch wirklich shape2 heisst!) bewegt.
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin IF key = VK_Down THEN shape2.Top := shape2.Top +5; IF key = VK_UP THEN shape2.Top := shape2.Top -5; IF key = VK_RIGHT THEN shape2.Left := shape2.Left +5; IF key = VK_LEFT THEN shape2.Left := shape2.Left -5; end; Freundliche Grüsse |
AW: Weiterlernen
Zitat:
Denn code kann ich kompallieren weil ich den ersten teil des codes nicht beutzt habe. Jetzt das ich wieder da bin will fleissig weiterlernen,und ich wollte wissen was ich alles brauche um ein einfaches 2D-Jump'n'Run zu machen,ich glaub es sollte als mein erstes projekt mehr realistisch sein alls ein MMORPG. :-D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:34 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