0Pricing
Lua Academy · درس

حلقة لعبة LOVE

نفّذ load وupdate وdraw

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

ما هي LÖVE؟

LÖVE، وتُكتب أيضًا love2d، هي إطار عمل مجاني يتيح لك إنشاء ألعاب ثنائية الأبعاد باستخدام Lua الخالصة. تكتب دوال callback، ويتولى المحرك استدعاءها نيابةً عنك.

توجد لعبة LÖVE داخل مجلد يحتوي على ملف main.lua. شغّلها باستخدام love . من ذلك المجلد، فيفتح المحرك نافذة ويبدأ الحلقة.

دوال callback الأساسية الثلاث

تشغّل LÖVE لعبتك من خلال ثلاث دوال callback تُعرّفها في main.lua: love.load وlove.update وlove.draw.

لا تستدعي هذه الدوال بنفسك. يستدعي المحرك love.load مرة واحدة، ثم يكرر استدعاء love.update وlove.draw في كل إطار طوال مدة تشغيل اللعبة.

function love.load() end
function love.update(dt) end
function love.draw() end

love.load: الإعداد لمرة واحدة

تُنفَّذ love.load مرة واحدة بالضبط عند بدء اللعبة. استخدمها لإعداد الحالة: حمّل الصور والخطوط، وأنشئ جداولك، وهيّئ المتغيرات قبل بدء الحلقة.

ينبغي تنفيذ أي عملية مكلفة هنا، لا داخل love.update أو love.draw، حتى لا تتكرر في كل إطار.

function love.load()
  player = { x = 100, y = 100, speed = 200 }
  score = 0
end

love.update: منطق اللعبة

تُنفَّذ love.update(dt) مرة واحدة في كل إطار، وتحتوي على منطق لعبتك: تحريك الكائنات، والتحقق من التصادمات، وتحديث المؤقتات، وقراءة حالة الإدخال.

الوسيط dt هو الزمن الفاصل، أي عدد الثواني المنقضية منذ الإطار السابق. يجب ألا ترسم داخل update مطلقًا؛ اترك الرسم لـ love.draw.

function love.update(dt)
  player.x = player.x + player.speed * dt
end

أهمية dt

يختلف معدل الإطارات بين الأجهزة. إذا حرّكت الكائنات بمقدار ثابت في كل إطار، فسيتحرك الكائن على جهاز سريع بسرعة أكبر من جهاز بطيء.

يجعل الضرب في dt الحركة مستقلة عن معدل الإطارات. وتعني speed * dt «وحدات السرعة في الثانية»، لذلك يقطع الكائن المسافة نفسها بصرف النظر عن عدد الإطارات المعروضة.

-- 200 pixels per second, on any machine
player.x = player.x + 200 * dt

love.draw: الرسم

تُنفَّذ love.draw مرة واحدة في كل إطار بعد love.update. ويُرسم كل ما تراه على الشاشة هنا باستخدام الوحدة love.graphics.

تُمسح الشاشة تلقائيًا قبل كل استدعاء للرسم، لذا تعيد رسم المشهد كاملًا في كل إطار انطلاقًا من حالة لعبتك الحالية.

function love.draw()
  love.graphics.rectangle('fill', player.x, player.y, 32, 32)
end

الحلقة الكاملة معًا

عند جمع دوال callback معًا تحصل على لعبة كاملة: يجهّز load اللاعب، ويحرّكه update باستخدام dt، بينما يعرضه draw.

تشكل دورة load-update-draw هذه نبض كل لعبة LÖVE، مهما ازدادت درجة تعقيدها.

function love.load() x = 0 end
function love.update(dt) x = x + 100 * dt end
function love.draw()
  love.graphics.circle('fill', x, 150, 20)
end

قراءة الساعة

اجمع قيمة dt لبناء مؤقتات. ومن الأنماط الشائعة جمع الزمن المنقضي والتصرف عندما يتجاوز عتبة معينة، ثم طرح العتبة مرة أخرى.

هذا أكثر موثوقية من عدّ الإطارات، لأن عدد الإطارات يعتمد على العتاد، بينما تتتبع dt الثواني الفعلية.

timer = 0
function love.update(dt)
  timer = timer + dt
  if timer >= 1 then
    score = score + 1
    timer = timer - 1
  end
end

love.run والتفاصيل الداخلية للحلقة

خلف الكواليس، تمثل love.run الحلقة الرئيسية الفعلية. فهي تستدعي love.load مرة واحدة، ثم تكرر إلى ما لا نهاية: تعالج الأحداث، وتحسب dt، وتستدعي update وdraw، ثم تعرض الإطار.

نادرًا ما تعيد تعريف love.run، لكن معرفة وجودها توضح مصدر dt ودوال callback.

-- simplified idea of love.run
-- love.load()
-- while true do
--   dt = timer.step()
--   love.update(dt)
--   love.draw()
-- end

love.quit ودورة الحياة

توفر LÖVE أيضًا دوال callback لدورة الحياة تتجاوز الدوال الأساسية الثلاث. تُستدعى love.quit عندما يغلق اللاعب النافذة، مما يتيح لك حفظ التقدم.

يؤدي إرجاع true من love.quit إلى إلغاء الإغلاق. كما تستجيب دوال callback أخرى مثل love.focus وlove.resize لأحداث النافذة.

function love.quit()
  print('Saving before exit...')
  return false  -- false lets the game close
end

إيقاف اللعبة مؤقتًا

بما أن love.update تقود كل المنطق، فإن إيقاف اللعبة مؤقتًا سهل: اربط منطقك بعلامة وتجاوزه عندما تكون اللعبة متوقفة مؤقتًا.

يستمر الرسم، لذا يمكنك عرض طبقة إيقاف مؤقت. وهذا الفصل بين update وdraw هو بالضبط ما يجعل تصميم الحلقة مرنًا إلى هذا الحد.

paused = false
function love.update(dt)
  if paused then return end
  player.x = player.x + player.speed * dt
end

اختبار سريع

اختبر فهمك لحلقة لعبة LÖVE.

مراجعة

تشغّل LÖVE لعبتك من خلال دوال callback: تجهّز love.load اللعبة مرة واحدة، ويتولى love.update(dt) المنطق في كل إطار، بينما ترسم love.draw كل إطار.

تحافظ قيمة dt على استقلالية الحركة عن معدل الإطارات، وتكمل دوال دورة الحياة مثل love.quit الحلقة. وتشغّل هذه الدورة كل لعبة love2d.

الأسئلة الشائعة

هل درس «حلقة لعبة LOVE» مجاني؟

نعم — نص درس «حلقة لعبة LOVE» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Lua Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Lua Academy 4 دروس في المجموع.

ماذا ستتعلم في «حلقة لعبة LOVE»؟

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

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

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

كم من الوقت يستغرق درس «حلقة لعبة LOVE»؟

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

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

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

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

  1. حلقة لعبة LOVE
  2. رسم الأشكال والصور
  3. التعامل مع الإدخال
  4. الحركة والتصادمات
← العودة إلى Lua Academy