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

แอนิเมชันด้วย requestAnimationFrame

สร้างแอนิเมชันบน Canvas ที่ลื่นไหล

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

เหตุใดจึงใช้ requestAnimationFrame

requestAnimationFrame(callback) กำหนดให้ฟังก์ชันวาดของคุณทำงานก่อนการวาดหน้าจอครั้งถัดไป โดยทั่วไปคือ 60 ครั้งต่อวินาที ฟังก์ชันนี้จะหยุดทำงานในแท็บเบื้องหลัง ช่วยประหยัด CPU และแบตเตอรี่ ต่างจาก setInterval

function frame() {
  // draw one frame
  requestAnimationFrame(frame);
}
requestAnimationFrame(frame);

ลูปพื้นฐาน

ลูปแอนิเมชันจะล้าง canvas อัปเดตสถานะ วาดภาพ แล้วกำหนดเวลาให้ตัวเองทำงานอีกครั้ง

let x = 0;
function loop() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillRect(x, 50, 30, 30);
  x += 2;
  requestAnimationFrame(loop);
}
requestAnimationFrame(loop);

การล้างในแต่ละเฟรม

หากไม่มี clearRect ภาพจากเฟรมก่อนหน้าจะยังคงอยู่ ทำให้เกิดรอยลาก ให้ล้างบัฟเฟอร์ทั้งหมดที่ต้นเฟรมทุกครั้งเพื่อวาดใหม่อย่างสะอาด

ctx.clearRect(0, 0, canvas.width, canvas.height);

อาร์กิวเมนต์การประทับเวลา

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

let last = 0;
function loop(now) {
  const dt = now - last;
  last = now;
  // dt = ms since previous frame
  requestAnimationFrame(loop);
}
requestAnimationFrame(loop);

การเคลื่อนไหวที่ไม่ขึ้นกับอัตราเฟรม

คูณความเร็วด้วยเวลาต่าง เพื่อให้ความเร็วในการเคลื่อนที่คงที่ไม่ว่าอัตราเฟรมจะเป็นเท่าใด

let x = 0;
const speed = 0.1; // px per ms
function loop(now) {
  const dt = now - (loop.last || now);
  loop.last = now;
  x += speed * dt;
  requestAnimationFrame(loop);
}

การทำให้ลูกบอลเด้ง

กลับทิศทางความเร็วเมื่อวัตถุชนขอบ เพื่อทำให้วัตถุนั้นเด้ง

let x = 50, vx = 3;
function loop() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  x += vx;
  if (x < 0 || x > canvas.width) vx = -vx;
  ctx.beginPath();
  ctx.arc(x, 75, 15, 0, Math.PI * 2);
  ctx.fill();
  requestAnimationFrame(loop);
}
loop();

การหยุดการวนซ้ำ

requestAnimationFrame จะส่งคืนรหัส ให้ส่งรหัสดังกล่าวไปยัง cancelAnimationFrame เพื่อหยุดภาพเคลื่อนไหว

let id;
function loop() {
  id = requestAnimationFrame(loop);
}
id = requestAnimationFrame(loop);
// later:
cancelAnimationFrame(id);

การหยุดชั่วคราวและการทำงานต่อ

ติดตามแฟล็ก running หากต้องการทำงานต่อ ให้ร้องขอเฟรมใหม่ หากต้องการหยุดชั่วคราว ก็เพียงหยุดการร้องขอ หรือยกเลิกรายการที่รอดำเนินการ

let running = true;
function loop() {
  if (!running) return;
  // draw...
  requestAnimationFrame(loop);
}
function pause() { running = false; }
function resume() { running = true; requestAnimationFrame(loop); }

การทำให้วัตถุหลายรายการเคลื่อนไหว

เก็บวัตถุไว้ในอาร์เรย์ แล้วอัปเดตวัตถุแต่ละรายการภายในลูป

const balls = [{ x: 10, vx: 2 }, { x: 80, vx: -3 }];
function loop() {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  for (const b of balls) {
    b.x += b.vx;
    ctx.fillRect(b.x, 60, 20, 20);
  }
  requestAnimationFrame(loop);
}
loop();

การผ่อนจังหวะเพื่อการเคลื่อนไหวที่ราบรื่น

ค่อย ๆ ปรับค่าเข้าใกล้เป้าหมายด้วยการผ่อนจังหวะ เพื่อให้การชะลอความเร็วดูเป็นธรรมชาติ

let x = 0;
const target = 200;
function loop() {
  x += (target - x) * 0.1; // ease out
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillRect(x, 50, 30, 30);
  if (Math.abs(target - x) > 0.5) requestAnimationFrame(loop);
}
loop();

เคล็ดลับด้านประสิทธิภาพ

หลีกเลี่ยงการจัดสรรวัตถุภายในลูป รวมการเรียกวาดเข้าด้วยกัน และวาดใหม่เฉพาะส่วนที่เปลี่ยนแปลงเมื่อทำได้ พยายามให้งานในแต่ละเฟรมมีขนาดเล็ก เพื่อไม่ให้เกินงบประมาณประมาณ 16 มิลลิวินาทีสำหรับ 60 เฟรมต่อวินาที

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความรู้เกี่ยวกับภาพเคลื่อนไหวของคุณ

ทบทวน: ภาพเคลื่อนไหว

คุณสร้างลูปภาพเคลื่อนไหวด้วย requestAnimationFrame ล้างข้อมูลในแต่ละเฟรมด้วย clearRect ใช้การประทับเวลาเพื่อให้ไม่ขึ้นกับอัตราเฟรม ทำให้ลูกบอลที่เด้งและวัตถุหลายรายการเคลื่อนไหว ใช้การผ่อนจังหวะ และเรียนรู้การหยุดหรือหยุดชั่วคราวด้วย cancelAnimationFrame

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

บทเรียน “แอนิเมชันด้วย requestAnimationFrame” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “แอนิเมชันด้วย requestAnimationFrame”

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

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

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

บทเรียน “แอนิเมชันด้วย requestAnimationFrame” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การตั้งค่าบริบท Canvas
  2. การวาดรูปร่างและเส้นทาง
  3. การทำงานกับรูปภาพและข้อความ
  4. แอนิเมชันด้วย requestAnimationFrame
← กลับไปที่ JavaScript Academy