0Pricing
JavaScript Academy · درس

التحريك باستخدام requestAnimationFrame

أنشئوا تحريكات سلسة على Canvas.

التحريك باستخدام requestAnimationFrame درس مجاني في JavaScript Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في JavaScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

لماذا requestAnimationFrame؟

تجدول requestAnimationFrame(callback) تشغيل دالة الرسم قبل إعادة رسم الشاشة التالية، وعادةً ما يحدث ذلك 60 مرة في الثانية. وتتوقف في علامات التبويب الموجودة في الخلفية، مما يوفر وحدة المعالجة المركزية والبطارية، بخلاف 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);

الإيقاف المؤقت والاستئناف

تتبّع علامة تشير إلى حالة التشغيل. للاستئناف، اطلب إطارًا جديدًا؛ وللإيقاف المؤقت، توقّف ببساطة عن طلب الإطارات (أو ألغِ الطلب المعلّق).

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» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة JavaScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة JavaScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «التحريك باستخدام requestAnimationFrame»؟

أنشئوا تحريكات سلسة على Canvas. تتمرن على JavaScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ JavaScript Academy؟

لا تُشترط خبرة سابقة. JavaScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «التحريك باستخدام requestAnimationFrame»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس JavaScript Academy هذا؟

نعم. كل درس في JavaScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. إعداد سياق Canvas
  2. رسم الأشكال والمسارات
  3. التعامل مع الصور والنصوص
  4. التحريك باستخدام requestAnimationFrame
← العودة إلى JavaScript Academy