0Pricing
JavaScript Academy · บทเรียน

การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา

สร้างลูปภาพเคลื่อนไหวขนาดเล็ก ใช้การอัปเดตตามเวลา (เดลตา) จำลอง requestAnimationFrame และเพิ่มการผ่อนจังหวะแบบง่าย

การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา เป็นบทเรียน JavaScript Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน JavaScript Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน

เหตุใดจึงใช้ภาพเคลื่อนไหวตามเวลา

เป้าหมาย: ขับเคลื่อนการเคลื่อนไหวที่ราบรื่นด้วยการอัปเดตตามเวลา

  • จำลอง requestAnimationFrame
  • วัด เวลาที่ผ่านไประหว่างเฟรม
  • เคลื่อนที่ด้วยหน่วยต่อวินาที
  • เพิ่ม การผ่อนความเร็ว เล็กน้อย
การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 1

rAF จำลอง

ที่นี่ไม่มี DOM เราจึงจำลอง requestAnimationFrame โดยใช้ setTimeout ประมาณ 16 มิลลิวินาที

// 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);
});
การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 2

พื้นฐานเวลาที่ผ่านไประหว่างเฟรม

คำนวณ เวลาที่ผ่านไประหว่างเฟรม ในแต่ละเฟรม: (now − last) / 1000 วิธีนี้จะปรับขนาดการเคลื่อนไหวตามเวลาจริง

// 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);
การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 3

หน่วยต่อวินาที

ใช้ speed คูณกับเวลาที่ผ่านไประหว่างเฟรมเพื่ออัปเดตตำแหน่ง ทำให้การเคลื่อนไหวยังคงสม่ำเสมอแม้อัตราเฟรมต่างกัน

// 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();
การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 4

สาธิตการผ่อนความเร็วเล็กน้อย

การผ่อนความเร็ว จะกำหนดรูปทรงของเส้นโค้ง ในที่นี้ easeOutQuad เริ่มต้นเร็วและช้าลงเมื่อใกล้จบ

// 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);
การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 5

ลองใช้ขั้นคงที่

ขั้นคงที่ ช่วยให้ตรรกะมีเสถียรภาพ ตัวสะสมจะทำงานชดเชยหากเฟรมมาช้า

// 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();
การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 6

แบบทดสอบเวลาส่วนต่างเทียบกับขั้นคงที่

ตรวจสอบอย่างรวดเร็ว: เหตุใดจึงใช้เวลาที่ผ่านไประหว่างเฟรม

การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 7

ทบทวน

ทบทวน: คุณจำลอง rAF ด้วย setTimeout วัด เวลาที่ผ่านไประหว่างเฟรม เคลื่อนที่ด้วยหน่วยต่อวินาที เพิ่ม การผ่อนความเร็วช่วงท้าย และได้ลองใช้ขั้นคงที่พร้อมตัวสะสม

การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา — ภาพประกอบ 8

คำถามที่พบบ่อย

บทเรียน “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส JavaScript Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส JavaScript Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา”

สร้างลูปภาพเคลื่อนไหวขนาดเล็ก ใช้การอัปเดตตามเวลา (เดลตา) จำลอง requestAnimationFrame และเพิ่มการผ่อนจังหวะแบบง่าย คุณปฏิบัติ JavaScript Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน JavaScript Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน JavaScript Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน JavaScript Academy นี้ได้ไหม

ได้ บทเรียน JavaScript Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. setTimeout, setInterval และการคลาดเคลื่อนของตัวจับเวลา
  2. Debounce กับ Throttle — เขียนเอง
  3. การจับเวลาภาพเคลื่อนไหว — เกริ่นนำด้วยลูปอิงเวลา
← กลับไปที่ JavaScript Academy