So, mal ein kleines Beispiel hingesaut.
Och Menno, jetzt haste mich inspiriert...
Der Vergleich muss auch mit auf Sekunden gerundeten Werten erfolgen, sonst bleibt die Schleife manchmal hängen.
Zuerst wollte ich nur diesen Teil ändern, aber dann hab ich gleich die ganzen Umrechnungen entfernt: Meine Version erzeugt durch Addition von TI und 60 eine Alarmzeit, die eine Sekunde in der Zukunft liegt. Ist die Alarmzeit erreicht, wird eine neue Alarmzeit gesetzt und eine separate Countdown-Variable heruntergezählt. Das erspart eine Menge Multiplikationen, Divisionen und INT()s:
- 0 il=60:rem Intervall-Länge in Ticks (= 1 s)
- 1 cd=10:rem Startwert für Countdown
- 5 print chr$(147);
- 10 co=cd:at=ti:rem Starte Countdown
- 20 gosub 100
- 30 if ti>=at then gosub50
- 35 if co>0then20
- 40 print"ende"
- 45 end
- 50 rem Alarmzeit erreicht
- 51 at=at+il:rem nächsten Alarm setzen
- 52 co=co-1:rem Zähler herunter
- 53 print "{home}" co "seconds left..."
- 54 return
- 100 rem doing stuff
- 110 x=rnd(1)*30
- 120 y=rnd(i)*23:y=y+1
- 130 poke 1024+(y*40)+x,0
- 131 poke55296+(y*40)+x,rnd(1)*15
- 136 poke53280,rnd(1)*15
- 137 poke646,rnd(1)*15
- 140 return
Das Unterprogramm ab Zeile 50 kann man natürlich auch in eine Zeile quetschen, wenn man denn unbedingt will...
EDIT: Für diese Countdown-Algorithmen ist es zwar egal, ob TI vorher auf 0, auf 17 oder auf 31337 steht, aber bei einem Überlauf hätte man dennoch Probleme. Also sollte man auf jeden Fall TI$ setzen, z.B. vor dem Start eines neuen Levels.