لعب الصدأ في 24 ساعة: تجربة التنمية الشخصية

لعب الصدأ في 24 ساعة: تجربة التنمية الشخصية

سأتحدث في هذا المقال عن تجربتي الشخصية في تطوير لعبة صغيرة في Rust. استغرق إنشاء نسخة صالحة للعمل حوالي 24 ساعة (كنت أعمل غالبًا في المساء أو في عطلات نهاية الأسبوع). اللعبة لم تنته بعد، ولكن أعتقد أن التجربة ستكون مجزية. سأشارك ما تعلمته وبعض الملاحظات التي أدليت بها أثناء بناء اللعبة من الصفر.

يوصي Skillbox بما يلي: دورة عملية لمدة عامين "أنا مطور ويب محترف".

نذكر: لجميع قراء "Habr" - خصم 10 روبل عند التسجيل في أي دورة Skillbox باستخدام رمز "Habr" الترويجي.

لماذا الصدأ؟

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

لماذا اللعبة وأي نوع من اللعبة؟

صنع الألعاب أمر ممتع! أتمنى لو كان هناك المزيد من الأسباب، لكن بالنسبة للمشاريع "المنزلية" أختار موضوعات لا ترتبط ارتباطًا وثيقًا بعملي المعتاد. لعبة ما هو هذا؟ كنت أرغب في صنع شيء مثل جهاز محاكاة للتنس يجمع بين Cities Skylines وZoo Tycoon وPrison Architect والتنس نفسه. بشكل عام، اتضح أنها لعبة تدور حول أكاديمية للتنس، حيث يأتي الناس للعب.

التدريب الفني

كنت أرغب في استخدام Rust، لكنني لم أكن أعرف بالضبط مقدار العمل الأساسي الذي سيستغرقه البدء. لم أكن أرغب في كتابة تظليل البكسل واستخدام السحب والإفلات، لذلك كنت أبحث عن الحلول الأكثر مرونة.

لقد وجدت موارد مفيدة أشاركها معك:

لقد استكشفت العديد من محركات ألعاب Rust، وفي النهاية اخترت Piston وggez. لقد صادفتهم أثناء العمل في مشروع سابق. في النهاية، اخترت ggez لأنها بدت أكثر ملاءمة لتنفيذ لعبة صغيرة ثنائية الأبعاد. يعد الهيكل المعياري لـ Piston معقدًا للغاية بالنسبة للمطور المبتدئ (أو أي شخص يعمل مع Rust لأول مرة).

هيكل اللعبة

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

بعد أن فكرت في كل شيء، بدأت العمل.

خلق لعبة

البداية: الدوائر والتجريدات

أخذت مثالاً من ggez وحصلت على دائرة على الشاشة. رائع! الآن بعض التجريدات. اعتقدت أنه سيكون من الجيد التجريد بعيدًا عن فكرة كائن اللعبة. يجب تقديم كل كائن وتحديثه كما هو مذكور هنا:

// the game object trait
trait GameObject {
    fn update(&mut self, _ctx: &mut Context) -> GameResult<()>;
    fn draw(&mut self, ctx: &mut Context) -> GameResult<()>;
}
 
// a specific game object - Circle
struct Circle {
    position: Point2,
}
 
 impl Circle {
    fn new(position: Point2) -> Circle {
        Circle { position }
    }
}
impl GameObject for Circle {
    fn update(&mut self, _ctx: &mut Context) -> GameResult<()> {
        Ok(())
    }
    fn draw(&mut self, ctx: &mut Context) -> GameResult<()> {
        let circle =
            graphics::Mesh::new_circle(ctx, graphics::DrawMode::Fill, self.position, 100.0, 2.0)?;
 
         graphics::draw(ctx, &circle, na::Point2::new(0.0, 0.0), 0.0)?;
        Ok(())
    }
}

أعطاني هذا الجزء من التعليمات البرمجية قائمة جميلة بالكائنات التي يمكنني تحديثها وعرضها في حلقة لطيفة بنفس القدر.

mpl event::EventHandler for MainState {
    fn update(&mut self, context: &mut Context) -> GameResult<()> {
        // Update all objects
        for object in self.objects.iter_mut() {
            object.update(context)?;
        }
 
        Ok(())
    }
 
    fn draw(&mut self, context: &mut Context) -> GameResult<()> {
        graphics::clear(context);
 
        // Draw all objects
        for object in self.objects.iter_mut() {
            object.draw(context)?;
        }
 
        graphics::present(context);
 
        Ok(())
    }
}

يعد main.rs ضروريًا لأنه يحتوي على كافة أسطر التعليمات البرمجية. لقد أمضيت بعض الوقت في فصل الملفات وتحسين بنية الدليل. وهذا هو شكله بعد ذلك:
الموارد -> هذا هو المكان الذي توجد فيه جميع الأصول (الصور)
SRC
- جهات
- game_object.rs
— دائرة.rs
- main.rs -> الحلقة الرئيسية

الناس والأرضيات والصور

الخطوة التالية هي إنشاء كائن لعبة الشخص وتحميل الصور. يجب أن يتم بناء كل شيء على أساس 32*32 بلاطة.

لعب الصدأ في 24 ساعة: تجربة التنمية الشخصية

ملاعب التنس

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

في المجموع لدينا اثنين من هذه البلاط: 1 و 2.

يتكون كل قسم من الملعب من بلاطة 1 أو بلاطة 2. ويمكن وضعها كالمعتاد أو قلبها 180 درجة.

لعب الصدأ في 24 ساعة: تجربة التنمية الشخصية

وضع البناء الأساسي (التجميع).

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

لكننا ما زلنا بحاجة إلى تذكر ما يعنيه 1 و2، لذلك أضفت إطارًا سلكيًا لتوضيح الكائن الذي تم تحديده. هذا هو ما يبدو عليه الأمر.

لعب الصدأ في 24 ساعة: تجربة التنمية الشخصية

أسئلة حول الهندسة المعمارية وإعادة البناء

لدي الآن العديد من كائنات اللعبة: الأشخاص والملاعب والأرضيات. ولكن لكي تعمل الإطارات السلكية، يجب إخبار كل كيان كائن ما إذا كانت الكائنات نفسها في وضع العرض التوضيحي، أو ما إذا كان الإطار مرسومًا ببساطة. هذه ليست مريحة للغاية.

بدا لي أن الهندسة المعمارية بحاجة إلى إعادة التفكير بطريقة تكشف عن بعض القيود:

  • يعد وجود كيان يعرض ويحدث نفسه مشكلة لأن هذا الكيان لن يكون قادرًا على "معرفة" ما يُفترض أن يعرضه - صورة وإطار سلكي؛
  • عدم وجود أداة لتبادل الخصائص والسلوك بين الكيانات الفردية (على سبيل المثال، خاصية is_build_mode أو عرض السلوك). سيكون من الممكن استخدام الميراث، على الرغم من عدم وجود طريقة مناسبة لتنفيذه في Rust. ما كنت أحتاجه حقًا هو التخطيط؛
  • وكانت هناك حاجة إلى أداة للتفاعل بين الكيانات لتعيين الأشخاص في المحاكم؛
  • كانت الكيانات نفسها عبارة عن مزيج من البيانات والمنطق الذي خرج عن نطاق السيطرة بسرعة.

لقد قمت بمزيد من البحث واكتشفت الهندسة المعمارية ECS - نظام مكونات الكيانوالتي تستخدم عادة في الألعاب. فيما يلي فوائد ECS:

  • يتم فصل البيانات عن المنطق؛
  • التكوين بدلا من الميراث.
  • الهندسة المعمارية التي تركز على البيانات.

تتميز ECS بثلاثة مفاهيم أساسية:

  • الكيانات - نوع الكائن الذي يشير إليه المعرف (يمكن أن يكون لاعبًا أو كرة أو أي شيء آخر)؛
  • المكونات - الكيانات تتكون منها. مثال - تقديم المكون والمواقع وغيرها. هذه هي مستودعات البيانات.
  • الأنظمة - تستخدم كلاً من الكائنات والمكونات، بالإضافة إلى أنها تحتوي على السلوك والمنطق الذي يعتمد على هذه البيانات. ومن الأمثلة على ذلك نظام العرض الذي يتكرر عبر جميع الكيانات التي تحتوي على مكونات العرض ويقوم بالعرض.

وبعد دراستها تبين أن شركة ECS تحل المشاكل التالية:

  • استخدام التخطيط بدلاً من الميراث لتنظيم الكيانات بشكل منهجي؛
  • والتخلص من فوضى التعليمات البرمجية في أنظمة التحكم؛
  • باستخدام طرق مثل is_build_mode للحفاظ على منطق الإطار السلكي في نفس المكان - في نظام العرض.

وهذا ما حدث بعد تطبيق ECS.

الموارد -> هذا هو المكان الذي توجد فيه جميع الأصول (الصور)
SRC
- عناصر
—position.rs
— شخص.rs
— Tennis_court.rs
— Floor.rs
- wireframe.rs
- mouse_tracked.rs
- موارد
—mouse.rs
- الأنظمة
— تقديم.rs
- الثوابت.rs
- يوتيلز.رس
— World_factory.rs -> وظائف المصنع العالمية
- main.rs -> الحلقة الرئيسية

نحن نحيل الناس إلى المحاكم

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

ماذا فعلت:

  • البيانات المضافة حول المحاكم المخصصة للشخص؛
  • إضافة بيانات حول الأشخاص الموزعين إلى TennisCourt؛
  • تمت إضافة CourtChoosingSystem، الذي يسمح لك بتحليل الأشخاص والملاعب، واكتشاف الملاعب المتاحة وتوزيع اللاعبين عليها؛
  • أضاف نظام حركة الأشخاص، الذي يبحث عن الأشخاص المعينين في المحاكم، وإذا لم يكونوا هناك، يرسل الأشخاص إلى المكان الذي يحتاجون إليه.

لعب الصدأ في 24 ساعة: تجربة التنمية الشخصية

تلخيص

لقد استمتعت حقًا بالعمل على هذه اللعبة البسيطة. علاوة على ذلك، أنا سعيد لأنني استخدمت Rust لكتابتها، لأنه:

  • الصدأ يمنحك ما تحتاجه؛
  • لديها وثائق ممتازة، والصدأ أنيق للغاية؛
  • الاتساق رائع.
  • لست مضطرًا إلى اللجوء إلى الاستنساخ أو النسخ أو أي إجراءات أخرى مماثلة، وهو ما كنت أفعله غالبًا في لغة C++؛
  • الخيارات سهلة الاستخدام للغاية وتتعامل مع الأخطاء بشكل جيد للغاية؛
  • إذا كان من الممكن تجميع المشروع، فسيعمل بنسبة 99٪ من الوقت، تمامًا كما ينبغي. أعتقد أن رسائل خطأ المترجم هي أفضل ما رأيته.

لقد بدأ تطوير اللعبة في Rust للتو. ولكن يوجد بالفعل مجتمع مستقر وكبير إلى حد ما يعمل على فتح Rust للجميع. ولذلك فإنني أنظر إلى مستقبل اللغة بتفاؤل، وأتطلع إلى نتائج عملنا المشترك.

يوصي Skillbox بما يلي:

المصدر: www.habr.com

إضافة تعليق