
مرحبا بالجميع! قضيت عطلة مؤخراً ، وكان هناك وقت لبرمجة مشاريع منزلي بهدوء. لذلك أردت أن أجعل لعبتي البسيطة على الإنترنت على Rust. بتعبير أدق ، مطلق النار 2D بسيط. قررت أن أجعل الشبكة جزءًا أوليًا ، وهناك بالفعل سوف نرى ماذا وكيف. نظرًا لأن النوع ينطوي على إجراء في جميع المجالات ، لذلك قررت استخدام بروتوكول UDP. بدأ تصميم بنية جزء الشبكة. أدركت أنه يمكنك وضع كل شيء في مكتبة منفصلة. لقد قمت أيضًا بتحميل المكتبة الناتجة إلى crates.io بموجب ترخيص MIT ، لأنه: أ) سيكون من المناسب بالنسبة لي توصيلها من هناك بمشاريعي. ب) ربما سيكون من المفيد لشخص آخر وسيحقق فوائد. لمزيد من التفاصيل ، مرحبا بكم في القط.
المراجع
->
المصادر->
مكتبة في crates.io->
الوثائقمثال للاستخدام
العملاء
الخادم
الجهاز داخليا
بشكل عام ، إذا استخدمت مآخذ UDP الأولية بدلاً من مآخذ UDP الأولية لجزء الشبكة من
Laminar ، فيمكن عندئذٍ تخفيض الشفرة بمعامل 100 ، واستخدم الخوارزمية الموضحة في هذه السلسلة من المقالات -
Network Programming for Developers Game .
تتضمن بنية الخادم تلقي أوامر من العملاء (على سبيل المثال ، الضغط على زر الماوس أو زر ما على لوحة المفاتيح) وإرسال حالة (على سبيل المثال ، الموضع الحالي للوحدات والاتجاه الذي ينظرون إليه) حيث يمكن للعميل عرض صورة للاعب.
على الخادم
على العميل
خاتمة
في الواقع ، كان من الأسهل إجراء خوارزمية تسليم الأوامر. على الخادم ، اقبل فقط الحزمة التي انتقلت إليها أكثر من مجرد الانتقال إلى آخر حزمة تم استلامها بواسطة +1 ، وتجاهل الباقي. إرسال العميل الحزمة الأخيرة المستلمة. على العميل ، احتفظ بذاكرة تخزين مؤقت لجميع الأوامر التي حاول المستخدم إرسالها إلى الخادم. في كل مرة تصل فيها حالة جديدة من الخادم ذي المعرف ، فإن آخر رزمة يتلقاها الخادم ، يحذفها من ذاكرة التخزين المؤقت وجميع الحزم ذات المعرف أقل مما كانت عليه. يتم إرسال جميع الحزم المتبقية إلى الخادم مرة أخرى.
علاوة على ذلك ، عندما أقوم بإجراء اللعبة نفسها ، في عملية الاستخدام ، سوف أقوم بتحسين وتحسين lib. ربما سأجد بعض الأخطاء.
لقد وجدت هنا مشروع خادم للألعاب في C # -
Networker + on Rust ، هناك
ورقة تشبه إلى حد ما نظير خادم ألعاب على Go-leaf. فقط هناك تطور في التقدم.
ملاحظة صديقي العزيز ، إذا كنت مبتدئًا وقررت قراءة الكود الخاص بي لهذا المشروع ورؤية الاختبارات التي كتبت هناك. حتى هنا نصيحتي لك - لا تفعل ما أفعله. لقد مزجت كل شيء في كومة في الاختبارات ولم أتبع قالب "AAA" (google ما هو). ليس عليك القيام بذلك في الإنتاج. يجب أن يتحقق الاختبار العادي من شيء واحد ، وليس عدة شروط في آن واحد ، ويجب أن يتكون من الخطوات:
- قمت بتعيين المتغيرات الخاصة بك.
- يمكنك تنفيذ الإجراء الذي تريد اختباره ؛
- قارنت النتيجة بالنتيجة المتوقعة.
على سبيل المثال
fn add_one(x:usize) -> usize { x+1 } #[test] fn add_one_fn_should_add_one_to_it_argument(){ let x = 2; let expected = x+1;