Hallo Leute,
ich möchte das sich ein Objekt in einer vorgegebenen Zeit um einem bestimmten Winkel (Diffangel) dreht.
Ich habe nun das Problem das bei mir count = 128 am Schluss raus kommt und ich müsste doch 179 erhalten,
oder spinne ich ?
EnableExplicit
Define Diffangle.f = 2 ;Winkel um die sich das Objekt drehen soll
Define StepTime.i = 4000/Diffangle; in 4 Sekunden
Define Time2.d = ElapsedMilliseconds()
Define.i Time = ElapsedMilliseconds()
Define count.i = 0
Define.d tt1
tt1 = ElapsedMilliseconds()
Repeat
If ElapsedMilliseconds() >= Time2 + StepTime
count + 1
Time2 = Time + count * StepTime
EndIf
Until count = diffangle
Debug ElapsedMilliseconds() - tt1
Debug "Count = " + Str(count)
Debug"-------------------------"
Bei mir werden auf jeden Fall die 179° gemacht, bei dir liegt der Fokus auf den 4 Sekunden Laufzeit. Sind bei dir 4 Sekunden um, bricht das Programm automatisch ab.
Obwohl ich es nicht wirklich verstehe. Einen kleinen Unterschied könnte ich mir ja erklären, aber nach vier Sekunden sollte doch die 179 ereicht sein. Wenn da count erst einen Wert von 128 hat, läuft ja was schief.
Überleg doch mal:
ElapsedMilliseconds() gibt ein Integer zurück.
Du vergleichst das mit einem Float.
Steptime = 22,346
Bei einer If-Abfrage If INTEGER >= FLOAT wird das FLOAT wie ein INTEGER behandelt, d.h. die Nachkommastellen werden irrelevant.
Beispiel:
i.i = 10000
f.f = 10000.236 ;<- ist eigentlich größer als i
If i >= f
Debug "ja wie?"
EndIf
D.h. Dein Counter erhöht sich nicht alle 22,346ms sondern alle 22ms.
4000 / 22 => 182
Das kommt auch bei mir raus, ich denke Deine 128 sind ein Zahlenverdreher?
Nein, ich habe keinen Zahlendreher drinnen. Bei mir wird count nur bis zwischen 125 und 129 hochgezählt.
Wenn du meinen ersten Code bei dir laufen lässt, was bekommst du denn angezeigt?
Wenn ich diesen Code laufen lasse, habe ich eine Laufzeit von über 5,5 Sekunden.
Ok, Wenn ich das so mache funktioniert das bei mir auch. Verstehe das trotzdem nicht, was ist denn verkehrt daran ElapsedMilliseconds()
zweimal aufzurufen ?
Hab den Thread nicht voll gelesen, aber beim zweiten Aufruf hat ElapsedMilliseconds() bereits einen anderen (höheren) Wert.
Somit wird Time2 nicht immer um 22ms erhöht, sondern u.u. um 23 oder 24, wenn ElapsedMilliseconds() nach der If-Abfrage schon wieder 1 oder 2ms weiter ist.