تطوير اللعبة على المعالجة مع التحكم عبر لوحة Arduino Uno

بادئ ذي بدء ، سوف أصف بإيجاز الغرض من المشروع. كنت أرغب في التوصل إلى شيء بسيط وبديهي لإظهار اتصال لوحة Arduino Uno والكمبيوتر عبر اتصال تسلسلي. شيء يناسب لوائح مشروع "عطلة نهاية الأسبوع" ، أي: تم ذلك في غضون ساعتين وتم ترميزه بسهولة.

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

الخطوة 1


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

الخطوة 2


اصنع "عصا تحكم" محلية الصنع. كل شيء تافه للغاية. يتم لعب دور عصا التحكم بواسطة مقياس جهد تقليدي متصل بين قوة + 5 فولت وأرض GND على لوحة Arduino Uno. يتم توصيل الدبوس الأوسط بالطرف التناظري "A0".



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

الخطوه 3


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

كود لوحة اردوينو اونو
int potPin = 0;//   ,     
// 
void setup() {
Serial.begin(9600);// serial      
}
void loop() {
 int val = map (analogRead(potPin), 0, 1023, 0, 640);//    
//     Arduino     0  1023.
//  map      0  640. 
// ,        
//  Processing   
 Serial.println(val);//       
 delay(50);//   50 
}


الخطوة 4


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

معالجة كود اللعبة
import processing.serial.*;//I/O library
Serial port;
PShape bot; //       
PFont font; //   
int radiusOfHero=100, radiusOfEnemy, speedOfEnemy=1, Counter=0;
float positionOfHeroX=100.0, positionOfEnemyY = 0.0 ,positionOfEnemyX=0.0;
void setup()
{
  size(640, 400);//   
  port = new Serial(this, "COM4", 9600);//     COM  
//  4 
  port.bufferUntil('\n');
  bot = loadShape("2.svg");//  ,      Processing
  font = loadFont("AgencyFB-Bold-200.vlw");//    
  textFont(font,200);
}
void draw() {
    background(0);
    fill(255);
    text(Counter, 30,175);//        (30; 175)
//===============definiton of hero position=============
fill(0, 102, 153);
ellipse(positionOfHeroX, height-radiusOfHero/2, radiusOfHero, radiusOfHero);// 
// -
//===============definition of enemy===============
fill(255,0,0);
radiusOfEnemy=round(random(60));{
    for(int i = 0; i < height; i++) 
      positionOfEnemyY=positionOfEnemyY+0.02*speedOfEnemy;//   -   
      ellipse(positionOfEnemyX, positionOfEnemyY, radiusOfEnemy*2, radiusOfEnemy*2); }//  -
if (positionOfEnemyY>height) {
positionOfEnemyY=0.0;
positionOfEnemyX = round(random(width)); //     -
Counter++;}
//==============clash==========================
if (abs(positionOfHeroX-positionOfEnemyX) < (radiusOfHero+radiusOfEnemy)/2 & 
   (abs(height-radiusOfHero/2)-positionOfEnemyY) < (radiusOfHero+radiusOfEnemy)/2){//   -
background(255,0,0);
shape(bot, positionOfHeroX-radiusOfHero/2,height-radiusOfHero, 100, 100);  
Counter=-1;
fill(255);
textFont(font,150);
text("TURN AWAY!", 0,height/2);
}
}
void serialEvent (Serial port) {
positionOfHeroX=round(float(port.readStringUntil('\n')));//    -   COM4
}


الخطوة الخامسة


لعبة تجريبية
فيديو


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


All Articles