0Pricing
JavaScript Academy · Lekcja

Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu

Budowanie niewielkiej pętli animacji, aktualizowanie zależne od czasu (delta), symulowanie requestAnimationFrame i dodawanie prostego easing

Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu to bezpłatna lekcja JavaScript Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej JavaScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs JavaScript Academy zawiera 3 lekcji w sumie.

Po co animacja oparta na czasie?

Cel: sterować płynnym ruchem za pomocą aktualizacji zależnych od czasu.

  • Symulowanie requestAnimationFrame
  • Mierzenie czasu delta
  • Poruszanie się z prędkością jednostek na sekundę
  • Dodanie niewielkiego easing
Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 1

Symulowane rAF

Nie ma tu DOM, dlatego symulujemy requestAnimationFrame za pomocą setTimeout uruchamianego mniej więcej co 16 ms.

// requestFrame: simulate ~60 FPS with setTimeout
function requestFrame(fn) {
  // ~16ms between frames for ~60fps
  return setTimeout(function () { fn(Date.now()); }, 16);
}

function cancelFrame(id) {
  clearTimeout(id);
}

// Tiny demo: schedule one frame
requestFrame(function (ts) {
  console.log("frame at", ts);
});
Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 2

Podstawy czasu delta

W każdej klatce należy obliczyć czas delta: (now − last) / 1000. Dzięki temu ruch jest skalowany względem rzeczywistego czasu.

// Time-based loop: compute delta time in seconds
let running = true;
let last = Date.now();

function loop() {
  if (!running) { return; }
  const now = Date.now();
  const dt = (now - last) / 1000; // seconds
  last = now;

  // Print a tiny delta preview
  console.log("dt", dt.toFixed(3), "s");

  requestFrame(loop);
}

// Start the loop and stop after a few frames
loop();
setTimeout(function () {
  running = false;
  console.log("stop");
}, 60);
Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 3

Jednostki na sekundę

Należy użyć speed × dt do aktualizowania pozycji, aby ruch pozostał spójny niezależnie od częstotliwości wyświetlania klatek.

// Move with a speed in units/second
let x = 0;               // position
const speed = 50;        // units per second

let lastT = Date.now();
let frames = 0;

function moveLoop() {
  const now = Date.now();
  const dt = (now - lastT) / 1000;
  lastT = now;

  // Distance = speed * time
  x = x + speed * dt;
  frames = frames + 1;

  console.log("x", Math.round(x));

  if (frames < 5) {
    requestFrame(moveLoop);
  } else {
    console.log("final x", Math.round(x));
  }
}

moveLoop();
Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 4

Krótki przykład easing

Easing kształtuje krzywą. W tym przykładzie easeOutQuad rozpoczyna się szybko, a pod koniec zwalnia.

// Ease from 0 to 1 over duration using easeOutQuad
function easeOutQuad(t) {
  // t in [0,1]
  return 1 - (1 - t) * (1 - t);
}

async function tween(durationMs) {
  let start = Date.now();
  let id = null;

  function step() {
    const now = Date.now();
    const t = Math.min(1, (now - start) / durationMs);
    const eased = easeOutQuad(t);
    console.log("eased", eased.toFixed(2));

    if (t < 1) {
      id = requestFrame(step);
    } else {
      cancelFrame(id);
      console.log("done");
    }
  }

  step();
}

tween(60);
Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 5

Próba użycia stałego kroku

Stały krok może ustabilizować logikę; accumulator nadrabia zaległości, jeśli klatka pojawi się z opóźnieniem.

// Fixed-step taste: step a physics tick and catch up using an accumulator
let acc = 0;                  // accumulated time
const step = 1 / 30;          // 30 FPS fixed step in seconds
let lastTime = Date.now();
let value = 0;
let fixedFrames = 0;

function fixedLoop() {
  const now = Date.now();
  const dt = (now - lastTime) / 1000;
  lastTime = now;
  acc = acc + dt;

  // Run zero or more fixed steps to catch up
  while (acc >= step) {
    // Update logic at a fixed rate
    value = value + 1;        // pretend physics
    acc = acc - step;
  }

  console.log("value", value);

  fixedFrames = fixedFrames + 1;
  if (fixedFrames < 5) {
    requestFrame(fixedLoop);
  } else {
    console.log("fixed stop");
  }
}

fixedLoop();
Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 6

Quiz: delta kontra stały krok

Szybkie sprawdzenie: po co używać czasu delta?

Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 7

Podsumowanie

Podsumowanie: zasymulowano rAF za pomocą setTimeout, mierzono czas delta, poruszano obiektem z prędkością jednostek na sekundę, dodano ease-out oraz poznano stały krok z użyciem akumulatora.

Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu — ilustracja 8

Często zadawane pytania

Czy lekcja „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu” jest bezpłatna?

Tak — pełny tekst „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu JavaScript Academy, przejdź na CoddyKit PRO. Kurs JavaScript Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu”?

Budowanie niewielkiej pętli animacji, aktualizowanie zależne od czasu (delta), symulowanie requestAnimationFrame i dodawanie prostego easing Ćwiczysz JavaScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć JavaScript Academy?

Nie wymagamy żadnego doświadczenia. JavaScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.

Ile czasu zajmuje lekcja „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji JavaScript Academy?

Tak. Każda lekcja JavaScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. setTimeout, setInterval i dryf czasomierza
  2. Debounce a throttle — implementacja od podstaw
  3. Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu
← Powrót do JavaScript Academy