Entwickler-Ecke

Sonstiges (Delphi) - Arbeiten mit dem Timer - Geschwindigkeit


elle333 - Sa 09.10.10 15:36
Titel: Arbeiten mit dem Timer - Geschwindigkeit
Ich hab folgendes Problem:
Ich will ein Programm machen, wo es ein Auto gibt, dass vorwärts fährt, wenn man auf einen Knopf drückt und stopt wenn man auf einen knopf drückt.
Aber ich weiss nicht wie man die Geschwindigkeit reguliert.
Im Informatikunterricht haben wir das mir einem Timer gemacht.

Danke im Vorraus


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
unit auto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls;

type
  TAuto1 = class(TForm)
    ImAuto: TImage;
    Timer1: TTimer;
    BuG2: TButton;
    BuG1: TButton;
    BuG3: TButton;
    BuG4: TButton;
    BuRueck: TButton;
    BuFahr: TImage;
    BuStop: TImage;
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaRueckMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Timer1Timer(Sender: TObject);
    procedure BuStopClick(Sender: TObject);
    procedure BuG2Click(Sender: TObject);
    procedure BuFahrClick(Sender: TObject);

    procedure BuG1Click(Sender: TObject);
    procedure BuG3Click(Sender: TObject);
    procedure BuG4Click(Sender: TObject);
    procedure BuRueckClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    v: Integer;
  end;

var
  Auto1: TAuto1;

implementation

{$R *.dfm}

procedure TAuto1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 ImAuto.Left := ImAuto.Left + 0;
 If ImAuto.Left > clientwidth
 then ImAuto.Left := -ImAuto.Width + 0;

end;

procedure TAuto1.PaRueckMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
 ImAuto.Left := ImAuto.Left + -2;
 If ImAuto.Left < 0
 then ImAuto.Left := -ImAuto.Width;
end;

procedure TAuto1.Timer1Timer(Sender: TObject);
begin
 ImAuto.Left := ImAuto.Left + 3;
 If ImAuto.Left > clientwidth
 then ImAuto.Left := -ImAuto.Width + 2;
end;

procedure TAuto1.BuStopClick(Sender: TObject);
begin
Timer1.Enabled := False;
end;

procedure TAuto1.BuG2Click(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TAuto1.BuFahrClick(Sender: TObject);
begin
Timer1.Enabled := True;
end;


procedure TAuto1.BuG1Click(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TAuto1.BuG3Click(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TAuto1.BuG4Click(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TAuto1.BuRueckClick(Sender: TObject);
begin
Timer1.Enabled := True;
v := ImAuto.Left + 10

end;

end.


Am ende hab ich ein bisschen rumprobiert also nicht wundern


jaenicke - Sa 09.10.10 15:51

Dann fangen wir mal ganz vorne an:
Was macht denn eine andere Geschwindigkeit aus? Dass du innerhalb einer bestimmten Zeiteinheit eine kürzere oder längere Strecke zurücklegst oder dieselbe Strecke in weniger oder mehr Zeit.

So, in deinem Programm gehst du im Timer immer alle X Millisekunden (das eingestellte Intervall eben) 3 Pixel nach rechts. Fällt dir etwas auf? ;-)


elle333 - Sa 09.10.10 16:18

ok danke habs hinbekommen
die bewegungen stocken zwar ein bisschen aber es geht


elle333 - Sa 09.10.10 17:15

ok ich wollte einen rückwärtsgang einbauen und hab dafür einen 2ten timer eingebaut, da sonst die bewegung pro knopfdruck ja nur einmal ausgeführt wird.
Es funktioniert eiglt alles perfekt, bis ich den rückwärtsgang benutze.
Dann übernimmt timer 2 und dann fährt das auto nurnoch rückwärts.
man kann nurnoch die rückwärtsgeschwindigkeit regulieren.
anhalten geht nicht mehr.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
unit auto;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls;

type
  TAuto1 = class(TForm)
    ImAuto: TImage;
    Timer1: TTimer;
    BuG2: TButton;
    BuG1: TButton;
    BuG3: TButton;
    BuG4: TButton;
    BuRueck: TButton;
    BuFahr: TImage;
    BuStop: TImage;
    Image1: TImage;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure BuStopClick(Sender: TObject);
    procedure BuG2Click(Sender: TObject);
    procedure BuFahrClick(Sender: TObject);

    procedure BuG1Click(Sender: TObject);
    procedure BuG3Click(Sender: TObject);
    procedure BuG4Click(Sender: TObject);
    procedure BuRueckClick(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    v: Integer;
    x: Integer;
  end;

var
  Auto1: TAuto1;

implementation

{$R *.dfm}

procedure TAuto1.Timer1Timer(Sender: TObject);
begin
 ImAuto.Left := ImAuto.Left + v;
 If ImAuto.Left > clientwidth
 then ImAuto.Left := -ImAuto.Width + 1;
end;

procedure TAuto1.BuStopClick(Sender: TObject);
begin
Timer1.Enabled := False;
end;

procedure TAuto1.BuG2Click(Sender: TObject);
begin
v := 4
end;

procedure TAuto1.BuFahrClick(Sender: TObject);
begin
Timer1.Enabled := True;
end;


procedure TAuto1.BuG1Click(Sender: TObject);
begin
Timer1.Enabled := True;
v := 1
end;

procedure TAuto1.BuG3Click(Sender: TObject);
begin
v :=  8
end;

procedure TAuto1.BuG4Click(Sender: TObject);
begin
v :=  12
end;

procedure TAuto1.BuRueckClick(Sender: TObject);
begin
x := -2
end;

procedure TAuto1.Timer2Timer(Sender: TObject);
begin
 ImAuto.Left := ImAuto.Left + x;
 If ImAuto.Left < -300
 then ImAuto.Left := clientwidth;
end;

end.


Delete - Sa 09.10.10 17:37

Wie so zweiter Timer? Du brauchst doch nur die x-Komponente des Bewegungsvektors negieren.


elle333 - Sa 09.10.10 17:39

aber wo definiere ich dann die rückwärtsbewegung

Delphi-Quelltext
1:
2:
3:
4:
5:
begin
 ImAuto.Left := ImAuto.Left + x;
 If ImAuto.Left < -300
 then ImAuto.Left := clientwidth;
end;


jaenicke - Sa 09.10.10 17:49

Also, fangen wir mal an mit Grundschulmathematik. ;-)

Um vorwärts zu fahren zählst du drei Pixel zum Wert links hinzu. Was machst du dann wohl, wenn du rückwärts fahren willst?

Heißt: Du musst X auf den entsprechenden Wert setzen. 0 für keine Bewegung, +3 für vorwärts usw.


elle333 - Sa 09.10.10 17:51

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Also, fangen wir mal an mit Grundschulmathematik. ;-)

Um vorwärts zu fahren zählst du drei Pixel zum Wert links hinzu. Was machst du dann wohl, wenn du rückwärts fahren willst?

Heißt: Du musst X auf den entsprechenden Wert setzen. 0 für keine Bewegung, +3 für vorwärts usw.

schon klar ;)
aber leider kommt dann das auto nicht mehr auf der anderen seite wieder rein

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Edit:
ok ich bin dumm
alles klar
problem behoben
danke für eure geduld