آلة افتراضية على ESP8266 لتشغيل الألعاب

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

Loaf عربة حافلة

بشكل عام ، كان عملي قد غطى قليلاً من قبل tormozedison هنا . ولكن في ذلك الوقت كان هناك نموذج أولي كروي في الفراغ. والآن لدي جهاز روماني ، والذي قدمه لي للتجارب مجانًا تمامًا. يسمى هذا الجهاز ESPboy. يختلف عن الحرف الأخرى بفتحه للتوسعة والتوسع باستخدام شريحة MCP23017. هنا يمكنك معرفة المزيد عنه.

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

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

لقد بدأت بكتابة لعبة تحت اردوينو أونو ، أين تذهب بدونها. ثم كانت هي الوحيدة لي ، وكنت قلقًا جدًا من أدائها. حاولت وميض أقل قدر ممكن. ولكن مسار أشعل النار يذهب في خطوات صغيرة. كل تعديل صغير على الكود جعله وميضًا مرارًا وتكرارًا. وقررت أن أكتب آلة افتراضية مكدسة. بعد كل شيء ، هناك اثنين كيلو بايت ضخمة من ذاكرة الوصول العشوائي للبايت من التعليمات البرمجية والبيانات على متن الطائرة. ولكن كيف كان بطيئا ، ولكن لسبب ما كانت الذاكرة تفتقر باستمرار. ربما كان بيت القصيد هو أن جميع دراجات بلدي كانت مع عجلات مربعة وركب ببطء. ثم قررت أن أكتب محاكي شرائح 8 على Arduino Mega وصل لتوه من الصين. بالطبع ، أردت أن أكتب محاكي gameboy لها ، أول بلاي ستيشن وبعض أجهزة الكمبيوتر العملاقة أسهل. نتيجة لذلك ، فهمت الشيء الرئيسي. كان الجهاز الظاهري للرقاقة 8 بسيطًا جدًا وبسيطًا للغاية. لدرجة أنه عند كتابة ألعابك للضرب أو القسمة ، كان عليك كتابة روتين فرعي بطيء منفصل. لذلك تحتاج إلى كتابة VM الخاص بك ، والتخلص من عيب قاتل. في هذا الوقت ، وصل العديد من esp8266 ، مع 160MHz الفضاء الخاصة بهم.

إذا بدا لك أن الجهاز الظاهري مضيعة للموارد ، فأعيد أيضًا كتابة محاكي شرائح 8 لذلك. اتضح وجود آلة افتراضية في جهاز افتراضي على متحكم. ربما يمكنك الذهاب أبعد من ذلك وكتابة آلة تورينج على رقاقة 8.

ESP ليتل لعبة محرك المواصفات


يحتوي الجهاز الظاهري على 16 سجلًا لكل منها 16 بت ، وسجل صفري هو مؤشر مكدس. كل تعليمة مزدوجة البايت ، تحتوي بعض التعليمات على وحدتي بايت من البيانات. ذاكرة عنونة 64 كيلو بايت. في حالة ESP8266 ، يتوفر 20 كيلو بايت. يمكن تنزيل البرنامج من SPIFFS و UART. إذا رغبت في ذلك ، يمكنك إضافة تنزيل من بطاقة ذاكرة أو عبر شبكة WiFi. بالإضافة إلى الإرشادات والتعليمات الحسابية المعتادة لنقل البيانات ، هناك تعليمات منفصلة للتعامل مع العفاريت والشاشة والصوت. حجم الشاشة 128 × 128 بكسل. عند 16 لونًا لكل نقطة ، تشغل الشاشة 8 كيلو بايت من الذاكرة ، وهو نفس مقدار المخزن المؤقت لرسم العفاريت والجزيئات. على الرغم من أن مكتبة TFT_eSPI التي أستخدمها قادرة على تحديث الشاشة أكثر من 60 مرة في الثانية ، إلا أنني اضطررت إلى قصر 20 إطارًا في الثانية. خلاف ذلك ، لم يكن هناك ما يكفي من وقت المعالج للجهاز الظاهري. يمكنك رسم البلاط و 32 نقشًا يصل حجمها إلى 128 × 128 بكسل مع إمكانية الدوران والنسخ المتطابق. لحفظ الذاكرة ، يمكنك استخدام صور أحادية بت أو ضغط RLE. هناك فيزياء مبسطة: اكتشاف تصادمات العفاريت مع العفاريت والبلاط ، ودقة التصادم ، والجاذبية. يتم تحديث الشاشة سطراً سطراً فقط إذا تغير صف البكسل. تتراوح سرعة VM ، اعتمادًا على عدد الخطوط المرسومة في الإطار ، من 100 ألف إلى 900 ألف عملية في الثانية. يمكنك استخدام شاشات ملونة مختلفة ، هناك امتداد ناعم للصورة إلى النسب المطلوبة.


يمكن الاطلاع على بعض الألعاب التي كتبها لي هنا .

في نفس الوقت الذي كتبته VM لـ ESP8266 ، كتبت محاكي JavaScript للمتصفح. من أجل عدم تعديل الرمز الفرعي يدويًا ، تمت إضافة أداة تجميع بسيطة ، بناءً على تجربتي مع المجمّع الخاص بـ MOS6502. ثم قررت إضافة لغة ذات مستوى أعلى. ومع ذلك ، كانت مهمتي الرئيسية هي كتابة ألعاب بسيطة بسرعة ، وليس رمز تجميع تصحيح طويل. يبدو لي أن كتابة مترجمك سيكون أسهل من إضافة LLVM. وقد كتبت في جافا سكريبت ، لأنني أعرف أنها ليست سيئة مثل اللغات الأخرى. في الوقت الحالي ، هو بعيد عن دعم معايير C ، وعند التجميع ، يمكنك بسهولة أن تواجه خطأً غير مفهوم في مكان غير مفهوم. لكنه سريع ، لأنه يأخذ أقل من 2000 خطوط.

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

وبالنسبة لأولئك الذين قرأوا ، مثال على لعبة. يستغرق أقل من مائة خطوط وأقل من 1 كيلو بايت في شكل مترجم.

int stickCount; char key,previouseKey,takenSticks; void redraw(){ int i; //   setcolor(2); //   for(i = 0; i < stickCount; i++) line(22 + i * 6, 74, 22 + i * 6, 84); //   setcolor(11); //  for(i = stickCount; i < 15; i++) line(22 + i * 6, 74, 22 + i * 6, 84); //     setcolor(1); //   delayredraw(); } void playersMove(){ //    ,     .  while(key == previouseKey){ key = getkey(); } while(key != KEY_LEFT && key != KEY_DOWN && key != KEY_RIGHT){ key = getkey(); } if(key & KEY_LEFT){ takenSticks = 1; }else if(key & KEY_DOWN){ takenSticks = 2; }else{ takenSticks = 3; } printf("%d, ", takenSticks); stickCount -= takenSticks; previouseKey = key; } void computersMove(){ if(stickCount % 4){ //   ,    takenSticks = stickCount % 4; }else{ //      takenSticks = 1 + random(1); } stickCount -= takenSticks; printf("%d, ", takenSticks); } void game(){ // stickCount = 15; clearscreen(); //       gotoxy(8,0); puts(""); gotoxy(2,1); puts(" 1,2  3 .  ,   . :\n"); // 27,25  26   printf(" %c 1 %c 2 %c 3", 27, 25, 26); gotoxy(0,12); redraw(); while(1){ playersMove(); if(stickCount <= 0){ gotoxy(3,8); puts(" "); return; } redraw(); computersMove(); redraw(); if(stickCount <= 0){ gotoxy(3,8); puts(" "); return; } } } void main(){ while(1){ game(); //  settimer(1,1000); while(gettimer(1)){} while(getkey() == 0){} previouseKey = key; } } 

يمكنك اختباره على الفور. اتبع الرابط ، ثم انقر فوق ترجمة ، ثم قم بتشغيل. إذا كنت تريد معرفة المزيد عن إمكانيات IDE ، يمكنك قراءة البرنامج التعليمي . شكرا لاهتمامكم

Source: https://habr.com/ru/post/ar459714/


All Articles