صفائح الشخصيات المتحركة · مُختبَر

من GIF إلى صفيحة شخصيات متحركة: دع الذكاء الاصطناعي يفحص كل إطار قبل الاستيراد

رزمة من أوراق عاجية شفافة منشورة كالمروحة عليها أشكال فحمية صغيرة بوضعيات متغيرة، وبجانبها الأوراق نفسها مصفوفة حافة إلى حافة في صف واحد مع ورقة كهرمانية واحدة
عمل فني تحريري تجريدي أصلي وُلّد في Ciyo باستخدام GPT Image 2.5 Sunburst.

ملف GIF طريقة مريحة لمشاركة رسوم متحركة، وطريقة سيئة لتسليمها. فمحركات الألعاب مثل Godot وUnity وPhaser تحتاج إلى صفيحة شخصيات متحركة: كل الإطارات في شبكة من خانات متساوية، بحجم بكسلات الرسم الحقيقي، مع المدة التي يبقى فيها كل إطار على الشاشة. ويخفي GIF أيضاً المشكلات حتى تدور الحلقة في لعبتك: إطار مكرر، أو إطار منحرف ببكسل واحد، أو توقف في المكان الخطأ.

في 30 سبتمبر 2026 أعطينا Ciyo Agent (وكيل Ciyo) ملف GIF من 7 إطارات لكائن هلامي يقفز، وطلبنا صفيحة قابلة للاستيراد. قرأ الوكيل كل إطار، ووجد ثلاث مشكلات في الحلقة، ثم أصلحها حين طلبنا. وفحصنا كل ملف بأنفسنا.

ما يحتاجه محرك اللعبة من ملف GIF

ثلاثة أشياء: الإطارات بحجمها الأصلي، مرتبة في خانات متساوية؛ وحجم الإطار وعدد الإطارات؛ ومدة كل إطار. والحجم الأصلي هو الحجم الذي رسمه الفنان. وكثير من ملفات GIF لفن البكسل تُصدَّر بتكبير 4× أو 6× أو 8× لتبدو جيدة على وسائل التواصل الاجتماعي، واستيرادها بذلك الحجم يهدر الذاكرة ويسبب الضبابية عند التحجيم.

يستطيع الوكيل في Ciyo قراءة كل إطار في ملف GIF مرفق. وهذا مهم، لأن الشخص الذي يستعرض GIF بسرعته الكاملة لن يلاحظ إطاراً منحرفاً ببكسل واحد.

ما تطلبه، ولماذا
اطلبالسبب
حجم البكسل الأصليبكسل واحد في الملف لكل بكسل في الرسم؛ حاد عند أي تكبير بعدد صحيح
صف واحد من خانات متساويةيقطّع المحرك الصفيحة حسب حجم الخانة
خلفية شفافةلا لون مفتاحي ولا حواف ملونة
مدة لكل إطارإطارات GIF كثيراً ما تختلف تأخيراتها
فحص كل إطارالإطارات المكررة والاهتزاز لا تظهر إلا حين تدور الحلقة

ملف GIF الذي اختبرناه: قفزة كائن هلامي من لعبة منصات متخيَّلة

صنعنا ملف GIF صغيراً للاختبار للعبة Tumblebrook، وهي لعبة منصات متخيَّلة: كائن هلامي أخضر ينضغط ويقفز ويهبط. مقاسه 192 × 192 بكسل، وفيه 7 إطارات و4 ألوان، وهو في الحقيقة رسم بمقاس 32 × 32 مُصدَّر بتكبير 6× بالضبط. وتتراوح التأخيرات من 80 إلى 200 ملّي ثانية، كما يحدث كثيراً.

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

الرسالة التي أرسلناها مع ملف GIF مرفقاً
ملف GIF هذا هو رسم القفزة المتحرك للعبة Tumblebrook، وهي لعبة منصات صغيرة أصنعها في Godot. من فضلك حوّله إلى صفيحة شخصيات متحركة أستطيع استيرادها: صف واحد، وخانات متساوية، وخلفية شفافة، بحجم بكسلات الرسم الأصلي (لا بتكبير التصدير 6x). قبل أن تبنيها، انظر إلى كل إطار وأخبرني بعدد الإطارات، وتأخير كل إطار، وأي شيء سيبدو خطأً حين تدور الحلقة. احفظ الصفيحة وملف JSON فيه حجم الإطار والمدد على اللوحة.

ما وجده الوكيل في 7 إطارات

تحقق الوكيل من أن 192 تقبل القسمة على 6 بالضبط، وأكد الحجم الأصلي 32 × 32، وبنى صفيحة بمقاس 224 × 32: سبع خانات في صف واحد، بخلفية شفافة ودون بكسلات حافة ممزوجة. وسرد التأخيرات: 120 و80 و80 و80 و200 و80 و140 ملّي ثانية.

ثم أبلغ عن ثلاث مشكلات، وكانت الثلاث حقيقية. كان الإطار الأخير “pixel-for-pixel the same as frame 0” (مطابقاً للإطار 0 بكسلاً ببكسل)، لذلك تبقى وضعية الراحة على الشاشة 260 ms و“the hop will seem to stall at the landing” (ستبدو القفزة كأنها تتوقف عند الهبوط). وكان الإطار 5 نسخة من الإطار 3 “moved 1 px right and 2 px down” (منقولة 1 px إلى اليمين و2 px إلى الأسفل)، ومركزها عند x = 17 بدلاً من 16، فيرتعش الكائن الهلامي جانبياً. كما أعاد الإطار 5 استخدام وضعية الصعود في طريق النزول، فتقفز الحافة السفلية 4 بكسلات إلى إطار الهبوط.

وقال أيضاً ما لم يستطع فعله: اللوحة لا تقبل إلا الصور والفيديو، لذلك لم يستطع أن يحفظ ملف .json عليها. وعرض أن يلصق JSON في المحادثة بدلاً من ذلك.

لوحة Ciyo مع صفيحة الكائن الهلامي على خلفية مربعات أرجوانية وعلى خلفية شفافة، ولوحة الوكيل تسرد إطاراً أول مكرراً واهتزازاً ببكسل واحد وهبوطاً خشناً
الصفيحة الأولى وفحص الوكيل للإطارات: إطار أول مكرر، واهتزاز ببكسل 1، وهبوط خشن. 30 سبتمبر 2026.

أصلح الحلقة، ثم صدّر

طلبنا صفيحة مُصلحة. وقبل أن يرسم أي شيء، درس الوكيل الإطارات الموجودة ليتعلم قواعدها في الخط المحيط والزوايا والتظليل والضوء اللامع. بل صحّح نفسه (“Highlight sits one pixel further in than I assumed”، أي أن الضوء اللامع يقع إلى الداخل ببكسل واحد أكثر مما افترض)، وأثبت القواعد بإعادة بناء ثلاثة إطارات أصلية بكسلاً ببكسل.

في الصفيحة المُصلحة ستة إطارات. اختفى الإطار المكرر، وصار مركز كل إطار عند x = 16، ووضعية سقوط جديدة ممدودة بمقاس 13 × 19 بكسل تنزل 3 بكسلات إلى إطار الهبوط بدلاً من القفز 4. وتستغرق الحلقة الكاملة الآن 640 ms، ونبّه الوكيل إلى أن وضعية الراحة صارت أقصر (120 ms بدلاً من 260 ms) في حال بدت القفزة متعجلة. ولم يُنفَق أي رصيد.

صفان من كائنات هلامية خضراء بفن البكسل مكبَّرة 8 مرات: سبعة إطارات كما في ملف GIF في الأعلى، وستة إطارات مُصلحة في الأسفل مع وضعية سقوط طويلة جديدة
في الأعلى: الصفيحة كما كان ملف GIF بالضبط (224 × 32). وفي الأسفل: الصفيحة المُصلحة (192 × 32) مع وضعية السقوط الجديدة. معروضة بتكبير 8×.
طلب الإصلاح
نعم من فضلك: اصنع الصفيحة المُصلحة. احذف الإطار المكرر، وأعد الإطار 5 إلى المركز، وأعطِ الهبوط وضعية سقوط ممدودة حقيقية بدلاً من وضعية الصعود المعاد استخدامها. احتفظ بالألوان الـ 4 نفسها وبالخانات 32x32. ثم الصق هنا JSON جاهزاً لـ Godot (حجم الإطار، وعدد الإطارات، ومدة كل إطار)، واحفظ معاينة GIF بتكبير 6x للحلقة المُصلحة كي أشاهدها.

ملف JSON وإعدادات Godot

لصق الوكيل كتلة JSON فيها اسم الصورة، وحجم الصفيحة (192 × 32)، وحجم الإطار (32 × 32)، وستة إطارات في صف واحد، ومنطقة كل إطار ومدته بالملّي ثانية، ومدة نسبية لـ Godot. ولأن كل تأخير مضاعف لـ 40 ms، اقترح رسماً متحركاً من نوع SpriteFrames بسرعة 25 إطاراً في الثانية بمدد نسبية 3 و2 و2 و2 و5 و2، مع تصفية الجار الأقرب كي تبقى البكسلات حادة.

احفظ ملف JSON بجانب ملف PNG في مشروعك. وإذا كان محركك يستخدم صيغة مختلفة، فاطلب تلك الصيغة باسمها؛ فقائمة الإطارات هي الجزء المهم.

لوحة وكيل Ciyo تعرض ملف JSON الملصوق بستة إطارات ومدة إجمالية 640 ms، بجانب الصفيحتين القديمة والمُصلحة ومعاينة بتكبير 6 مرات على اللوحة
ملف JSON الملصوق، ونصيحة Godot، والصفيحة المُصلحة مع معاينة GIF بتكبير 6× على اللوحة.

خمسة فحوص قبل أن تستورد أي صفيحة

سواء جاءت الصفيحة من الذكاء الاصطناعي أو من أداة تحويل أو من تصديرك أنت، فهذه الفحوص تلتقط المشكلات المعتادة. ويعرض عمودنا الأخير صفيحة Tumblebrook المُصلحة.

فحوص صفيحة الشخصيات المتحركة، مع صفيحتنا المُصلحة في 30 سبتمبر 2026
الفحصالطريقةالصفيحة المُصلحة
الحجم الأصليحجم GIF ÷ تكبير التصدير عدد صحيح192 ÷ 6 = 32 بكسل
لا إطارات مكررةقارن الإطار الأخير بالأولحُذف الإطار المكرر
لا اهتزازالمركز نفسه (أو خط الأقدام) في كل خانةالمركز x = 16 في الستة كلها
لوحة الألوانعُدّ الألوان؛ الخلفية شفافة4 ألوان مع الشفافية
التوقيتاسرد كل تأخير؛ افحص طول وضعية الراحةحلقة 640 ms، والراحة 120 ms

الخطوات التالية لرسوم لعبتك

بعد أن تصبح في المحرك صفيحة نظيفة، ارسم الرسم المتحرك التالي من الإطارات نفسها كي يبقى الأسلوب واحداً، وافحص الشخصية بالحجم الذي سيراه اللاعبون.

من GIF إلى صفيحة شخصيات متحركة

كيف أجد حجم البكسل الأصلي لملف GIF؟

اقسم حجم GIF على تكبير التصدير وتحقق من أن الناتج عدد صحيح. كان ملفنا بمقاس 192 × 192 رسماً بمقاس 32 × 32 بتكبير 6×. وأكد الوكيل أن كل إطار صُغّر بدقة.

لماذا تتوقف حلقتي أو ترتعش؟

السبب عادة إطار مكرر في النهاية (فتبقى وضعية الراحة على الشاشة ضعف المدة) أو إطار منحرف عن المركز ببكسل واحد. في اختبارنا وجد الوكيل الاثنين بمقارنة كل إطار.

هل تستطيع لوحة Ciyo حفظ ملف JSON؟

لا. في 30 سبتمبر 2026 كانت اللوحة تقبل ملفات png وjpg وwebp وgif وmp4 وmov فقط، لذلك لصق الوكيل JSON في المحادثة لتحفظه أنت.

كم كانت التكلفة؟

لا شيء في اختبارنا. فقراءة الإطارات، وبناء الصفيحتين، ورسم الإطار الجديد، ومعاينة GIF، كلها جرت في مساحة عمل الوكيل دون نموذج صور.

افحص ملف GIF في Ciyo

أرفق رسمك المتحرك، وأخبر Ciyo Agent بمحركك وبتكبير التصدير، واطلب منه أن يفحص كل إطار قبل أن يبني الصفيحة.