Autor |
Beitrag |
German_Chiller
Hält's aus hier
Beiträge: 8
|
Verfasst: So 14.02.10 18:19
Ich wollte eine Simulation von einem Ball machen, der immer fällt, aufspringt, aufsteigt usw. bis er liegen bleibt.
Damit ich den die Fallstrecke berechnen kann, brauche ich eine Zeit, damit es realistisch aussieht und ich nicht jedes Mal an den Thread.Sleep(x) werten herumspielen muss
Gibt es so einen Befehl, der mir die Zeitspanne in Millisekunden ausgibt?
...
for (....)
{
//anfangszeitpunkt
//warten
//endzeitpunkt
//Zeitspanne
}
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 14.02.10 18:31
Hallo und  bei uns im Forum!
Dafür gibt es die Stoppuhr bei .NET, also Stopwatch.
Davon erstellst du dir eine Instanz, kannst diese dann starten und stoppen und in Elapsed sehen wieviel Zeit vergangen ist dazwischen.
msdn.microsoft.com/e...opwatch.elapsed.aspx
Ist nur noch die Frage ob das für deinen Anwendungszweck genau genug ist.
|
|
German_Chiller 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 14.02.10 19:08
Ich hab es jetzt mal mit Stopwatch gemacht, aber der Punkt bewegt sich nicht so, wie er soll
Als Beispiel hab ich jetzt eine lineare Bewegung genommen. Der Punkt beschleunigt, dann stoppt er wieder ab, bis er steht, dann beschleunigt er wieder usw...
obwohl er sich eigentlich gleichförmig bewegen sollte. Ist die Zeit richtig gemessen?
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:
| private void button1_Click(object sender, EventArgs e) { Graphics Grafik; float hoehe = 0; float strecke = 0; float zeit = 0; Stopwatch stopWatch = new Stopwatch(); TimeSpan timeSpan; Grafik = this.CreateGraphics(); Grafik.FillEllipse(Brushes.Lime, 100, 0, 50, 50);
stopWatch.Start(); Thread.Sleep(100); while (hoehe < 500) { stopWatch.Stop(); timeSpan = stopWatch.Elapsed; zeit = timeSpan.Milliseconds;
strecke = 20 * (zeit / 1000); hoehe = hoehe + strecke; Refresh(); Grafik.FillEllipse(Brushes.Lime, 100, hoehe, 50, 50); stopWatch.Start(); Thread.Sleep(100); } } |
Moderiert von Kha: C#-Tags hinzugefügt
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 14.02.10 19:13
Solange du die abgelaufene Zeit nicht resettest wird die neue Zeit jeweils addiert. 
|
|
German_Chiller 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 14.02.10 19:17
kaum macht man es richtig, funktioniert es^^
danke für die schnelle hilfe...
|
|
German_Chiller 
Hält's aus hier
Beiträge: 8
|
Verfasst: So 21.02.10 00:21
Mein Programm läuft jetzt, der Ball springt jetzt in meinem Fenster hin und her, aber er flackert ab und zu, obwohl ich Thread.Sleep(10) habe, also genug zeit bleiben sollte...
Wie kann ich das flimmern des Balls wegbekommen?
|
|
ThomAlex
      
Beiträge: 58
Windows 7
C# (VS08) Games via XNA (privat) oder WinForms (Schule)
|
Verfasst: So 21.02.10 03:27
Vielleicht solltest du DoubleBuffern, also im BackBuffer zeichnen und am Ende das Ergebnis in den Frontbuffer bringen. Setze die Eigenschaft Doublebuffered deiner Form auf true, dann könnte es gehn. MFG ThomAlex
edit: Falls das nicht klappt würde mich auch gerne mal interessieren, woran es liegt.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: So 21.02.10 12:29
Ein Thread.Sleep(10) erscheint mir auch ein bisschen kurz zu sein. Es gibt da immer die Diskussion, welche Zeitabstände man unter Windows noch garantieren kann, aber 10 Millisekunden sind auf jeden Fall ziemlich kritisch. Das wären außerdem 100 Bilder pro Sekunde, was man wahrscheinlich nicht braucht.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|