แอนิเมชันด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่าบริบท Canvas
- การวาดรูปร่างและเส้นทาง
- การทำงานกับรูปภาพและข้อความ
- แอนิเมชันด้วย requestAnimationFrame