Rozdział 19 · Model gry
Czas, prędkość i opóźnienie
delay_ms — nie dokładny czas, ale przybliżony odstęp między tyknięciami, który zmniejsza się wraz ze wzrostem wyniku.
delay_ms nie jest gwarancją, lecz prośbą
screen.ontimer(game_tick, 120) oznacza "wołanie
game_tick po około 120 milisekundach od zdarzenia
będzie w stanie to zrobić" — a nie "dokładnie w 120 000 ms." Jeśli pętla zdarzeń jest teraz zajęta
coś innego (np. przerysowanie), połączenie będzie nieco opóźnione. Jak na mecz takiej skali
Różnica jest zwykle niezauważalna, ale nie warto obiecywać dokładnej godziny.
| delay_ms | Sensation |
|---|---|
| 200 | wolno — wygodne na pierwsze zapoznanie się z zarządzaniem |
| 140 | normalna prędkość to wartość domyślna (BASE_DELAY_MS) |
| 120 | szybkość po zdobyciu 100 punktów – gra jest już zauważalnie szybsza |
| 70 | szybki – wymaga precyzyjnych i szybkich reakcji |
calculate_delay.py
def calculate_delay(score, *, base_ms=140, min_ms=60, step_score=50, step_ms=10):
steps = score // step_score
return max(min_ms, base_ms - steps * step_ms)
max() — obowiązkowa ochrona przed zerem i ujemnym opóźnieniem
Bez
max(min_ms, ...) wystarczająco wysoki wynik prędzej czy później doprowadziłby do opóźnienia równego zero lub liczby ujemnej. screen.ontimer(callback, 0) formalnie nie spadnie, ale gra stanie się niegrywalna szybko; wartość ujemna to zachowanie, którego nie powinno się testować w praktyce. min_ms to twarda dolna granica prędkości.Praktyka: opóźnienie liczenia
Automatyczna kontrola – funkcja calculate_delay(): opóźnienie spada wraz z wynikiem i nie spada poniżej minimalnego poziomu