هذا ما يجب أن نحصل عليه ، حسنًا ، لا يزال يعرف كيفية القفز والمشي وضرب الصبار الشرير الذي يهاجمه ، لكننا سنصل إلى هذه الخطوة خطوة بخطوة :)
الجزء الأول أساسيات
طلبت نفسي اردوينو ، "لعبة صغيرة" ، اعتقدت ، مجموعة صغيرة (للاختبار) ، والتي ندمت عليها لاحقًا. أردت إطلاق العنان للإمكانيات ، ولكن بسبب عدم وجود وحدات إضافية لم ينجح ذلك ، كان علي أن أجرب ، وأقطع اردوينو إلى نظام الأمن وشاهدت كيفية عمل المستشعرات ، ثم قررت إجراء إنذار صوتي (باستخدام جهاز العصي من المجموعة) ، لذلك فطم الكلاب بصوت عالٍ أو ينبح فجأة :) ثم وصلت يدي إلى الشاشة 1602. "همم ... هذا عرض حقيقي" ، اعتقدت ، لكنني شعرت بخيبة أمل لمعرفة أنه يأكل ما يقرب من نصف جميع الاتصالات على اردوينو نفسها. فتشت حوله ووجدت لوحة غريبة في حزمة "i2C" وكان الأمر مريبًا للغاية! أن عدد الثقوب تزامن مع عدد القواد على الشاشة. "هم ، ليس من السهل ..." فكرت ، وقررت لحامها. بعد ذلك بقليل ، أدركت أنني فعلت الشيء الصحيح والآن يأكل عرضي قناتين فقط. بدأ في دراسة نوع العرض وما يمكن أن يفعله. بعد أن درست ما يكفي من المواد ، اكتشفت أن الشاشة نصية بحتة ، ولكن ها! يمكنه التعامل مع 8 أحرف جديدة بأبعاد 5x8 بكسل. حسنًا ، فلنبدأ بكتابة لعبة! أولاً ، أنت بحاجة إلى معرفة نوع اللعبة التي ستجريها ، فقررت أن أشبه ديناصور Google Chrome ، ولكن مع بضع شرائح ، إذا جاز التعبير ، بالنسبة للمبتدئين ، أعتقد أنها ستعمل :)
ولكن لا يزال عليك إدارة شيء ما ، والأزرار المتعددة ، لم يكن عليك التفكير طويلاً. أخذت جهاز التحكم عن بعد IR من المجموعة.

"هذا هو عصا التحكم" ، تمتمت بشكل مريب تحت أنفاسي ، وأفكر في التأخير من جهاز التحكم عن بعد ، ووضوح مستشعر الأشعة تحت الحمراء ، وعمومًا حول مدى كفاية هذه الفكرة ، ولكن لم يكن هناك ما يمكنني فعله ، يمكنني تدريب اردوينو على العمل مع لوحة المفاتيح للكمبيوتر ، ولكن كان الكسل حقًا للقيام بذلك. لذلك بدأت في كتابة رموز التحكم عن بعد ، حتى أتمكن من العمل معهم في المستقبل. رمز متحكم هو أبسط هنا:
"--------------------------------------------------------------------------" // IRremote #include <IRremote.h> decode_results results; IRrecv irrecv (A0); // void setup () { Serial.begin(9600); // com irrecv.enableIRIn(); // } void loop () { if (irrecv.decode( &results )) // , { Serial.println( results.value, HEX ); // irrecv.resume(); // } } "--------------------------------------------------------------------------"
يبدو رمز إشارة التحكم عن بعد كما يلي: "FF18E7" ستكون رموزك مختلفة ، بالطبع ، ولكن يجب أن تفهم الجوهر ، وعندما تقدم التماسا إلى هذا الرمز ، فإننا نضيف "0x" في البداية ونحصل على (0xFF18E7).
بعد ملء هذا في اردوينو وتوصيله كما ينبغي ، يمكننا البدء في التسجيل من منفذ السجل الخاص بـ tsiforka ، بعد النقر على أزرار جهاز الأشعة تحت الحمراء. ولكن هنا أريد فقط أن أوضح لك كيفية توصيل مستشعر الأشعة تحت الحمراء.
إذا نظرنا إلى المستشعر ، نرى ثلاثة أرجل ، يسار (إشارة تناظرية) ، وسط (أرضي) ، يمين (زائد 5 فولت).

نظرًا لأنني ما زلت أملك فكرة بسيطة عن كيفية عمل ذلك على الإطلاق ، فقد بدأت التجارب. في البداية قمت بعمل رمز الرسم خطوة بخطوة ، من خلال (تأخير (الوقت)) في البداية لم أكن أشك في أن هذه كانت فكرة سيئة :)
ما هي الدعامة الرئيسية. هذا الميكروكونترولر غير قادر على القيام بالمهام المتعددة. يعتبر الرمز من الأعلى إلى الأسفل ، ويمر عبر جميع الفروع والوظائف ، وبعد الانتهاء ، يبدأ من جديد. والآن ، عندما يكون لدينا الكثير من هذه "التأخيرات" في الشفرة ، نبدأ في ملاحظة تأخيرات واضحة. بالمناسبة ، نعم ، لماذا نحتاج إلى الكثير من "التأخير" على الإطلاق. عندما نصنع لعبة ، يبدأ عدد عمليات التحقق والتفاعل في النمو. على سبيل المثال ، يتحرك عدو تجاهنا وأريد أن أقفز فوقه ، وأضغط على "القفز" ، ووفقًا للخطة ، يجب أن أعلق في الهواء على سبيل المثال 0.8f ثانية في الهواء ، وهذه هي اللعبة بأكملها وتتجمد لمدة 0.8f ثانية. "غير قادر" فكرت وبدأت أفكر في حل. تم العثور على الحل بسرعة. وحدة التحكم الدقيقة نفسها قادرة على قراءة الرمز بسرعة من البداية إلى النهاية (إذا لم يزعجه ذلك) وهو يعرف أيضًا كيف يحسب الوقت من بداية إدراجه. هذا ما نحتاجه. الآن نقوم فقط بإنشاء متغيرات ستخزن الوقت لهذا الإجراء أو ذاك ومتغير يقارن الفرق بين الوقت الحالي والمدة اللازمة لتنشيط الرمز. يستغرق Arduino في الثانية 1000 مللي ثانية ، وهو مريح تمامًا. هنا مقتطف عندما يصبح أكثر وضوحا:
"--------------------------------------------------------------------------" // , , // long ClearTime = 150; // 150 = 0.15f ~6 long ClearTimeCheck = 0; // , long currentMillis = 0; // void loop () { currentMillis = millis(); // = } void clearscreen () // { // if (currentMillis - ClearTimeCheck >= ClearTime) // ( - 0.15f { ClearTimeCheck = currentMillis; // lcd.clear(); // , } } "--------------------------------------------------------------------------"
ليس من الصعب ، أليس كذلك؟
بعد إعادة كتابة الرمز بالكامل بطريقة جديدة ، بدأت اللعبة في العمل بسرعة ووضوح ، لمحاكاة إجراءات تعدد المهام :) لقد قطعت شوطا طويلا. بعد كل شيء ، ما زلنا بحاجة إلى إنشاء شخصية ونوع من الواجهة والرسوم المتحركة. نظرًا لأنه لا يمكننا إنشاء سوى ثمانية أحرف جديدة ، فنحن بحاجة إلى إفساد كل شيء بذكاء. لا أخطط للقيام بالكثير من الأشياء على الشاشة حتى الآن ، لذلك ، يمكن القيام بذلك حتى يكون لدي فقط ثمانية كائنات نشطة على الشاشة في معالجة واحدة للرمز. ماذا سيكون؟ حسنًا ، بطبيعة الحال الشخصية الرئيسية ، ضربة ، شرير ، قلب ومؤشر للصحة. بالنسبة للمبتدئين ، هذا يكفي. نعم ، ولدي ثلاثة أشياء فريدة أخرى في المخزون.
ستبدو الشخصية الرئيسية كما يلي:

عملية إدخال شخصية جديدة ، أنتجها في رمز ثنائي (أشعر بالراحة)
سيبدو هكذا:
01110
01110
00100
01110
10101
00100
01110
01010
إذا نظرت عن كثب ، ثم من أحد ، سنرى شخصيتنا ، ولكن حتى لا يقف مكتوف الأيدي ، فلنجعله رسمًا متحركًا.

الآن إلى رمزنا ، يتم إضافة مجموعة أخرى من الأرقام الثنائية ، وهي هذه:
00000
01110
01110
00100
11111
00100
01110
01010
كيفية عمل رسوم متحركة على هذا العرض ، أشرت إلى المنطق أعلاه ، والآن دعنا نتدرب ، في الوقت الحالي ، نضعه في منتصف الشاشة ونجعله ثابتًا ، وتذكر ، مهمتنا هي استخدام خلية ذاكرة واحدة فقط لكراتين متحركة. هذا أسهل مما يبدو عليه:
"--------------------------------------------------------------------------" #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F,16,2); // long AnimatedTime = 300; // long AnimatedTimeCheck = 0; // ( ) int AnimPlayer = 1; // int GGpozX = 8; // int GGpozY = 1; // 1 2 0 long currentMillis = 0; // // , , :) enum { SYMBOL_HEIGHT = 8 }; byte Player_1[SYMBOL_HEIGHT] = {B01110,B01110,B00100,B01110,B10101,B00100,B01110,B01010,}; // 1 byte Player_2[SYMBOL_HEIGHT] = {B00000,B01110,B01110,B00100,B11111,B00100,B01110,B01010,}; // 2 void setup() { lcd.init(); lcd.backlight();// loop(); PlAn(); } void loop() { if (AnimPlayer != 50) { // , :) //
بعد البدء ، نرى الرجل الصغير ، الموجود في وسط الشاشة ، على السطر الثاني ويتأرجح ، إذا جاز التعبير.
الخلاصة: تحدثت اليوم عن كيفية معرفة البيانات من خلال منفذ الأشعة تحت الحمراء ، وكيفية تجاوز تأخير رمز وحدة التحكم الدقيقة ، وكيفية عمل الرسوم المتحركة الأولية.
سيأتي الباقي قريبًا :) لا يزال لدي الكثير لأكتبه ، لذلك سألقي نظرة على كيف سيكون الأمر مثيرًا للاهتمام لك على الإطلاق ، وإذا كان الأمر كذلك ، سأبدأ غدًا في كتابة تكملة.
شكرا لكم جميعا على اهتمامكم ، كاكاو!
الجزء الثاني من المقال ->
habr.com/post/425367