Développement de jeux sur Traitement avec contrôle via la carte Arduino Uno

Pour commencer, je décrirai brièvement l'objectif du projet. Je voulais trouver quelque chose de simple et intuitif pour démontrer la communication de la carte Arduino Uno et d'un PC via une connexion série. Quelque chose qui cadrerait avec les règlements du projet "week-end", à savoir: cela a été fait en quelques heures et a été facilement codé.

Il a été décidé de créer un jeu avec les règles suivantes. L'action se déroule sur un plan bidimensionnel de travail. La balle «héros», contrôlée par le joueur, essaie d'éviter une collision avec les balles «adversaires». La balle héroïque ne se déplace que le long de l'axe des abscisses, les adversaires apparaissent à un endroit arbitraire sur le plan de travail et se déplacent rectiligne le long de l'axe des ordonnées. Si la balle «héros» quitte la collision avec «l'adversaire», la valeur du compteur de score est incrémentée, sinon le compteur est réinitialisé et les points accumulés plus tôt sont «brûlés».

Étape 1


Le choix du langage de programmation. Le traitement a été choisi, car le langage de programmation des cartes Arduino est basé sur celui-ci, le traitement est également un outil simple et efficace pour créer des images, des effets d'animation, etc. Oui, il est également gratuit.

Étape 2


Construisez un «joystick» fait maison. Tout est absolument banal. Le rôle du joystick est joué par un potentiomètre conventionnel connecté entre + 5V et la masse GND sur la carte Arduino Uno. La broche centrale est connectée à la broche analogique «A0».



Naturellement, si vous le souhaitez, vous pouvez utiliser le stick analogique, le pavé tactile, etc. L'essence est la même.

Étape 3


Programmation de la carte Arduino. Dans ce projet, la carte Arduino est requise pour envoyer en continu des données sur la position du curseur du potentiomètre. Par la suite, ces données sur l'ordinateur sont «récupérées» par Traitement pour les besoins du jeu (détermination des coordonnées de la balle «héros»).

Code pour Arduino Uno Board
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 
}


Étape 4


En fait, l'écriture du jeu lui-même. Comme mentionné précédemment, le jeu est écrit dans le langage de traitement . Vous pouvez télécharger le kit de distribution sur le site, il existe également des exemples d'utilisation. Dans mon cas, le «moteur» se compose de 49 lignes de code dont la moitié sont des commentaires. Ce que je veux dire, le comprendre n'est pas difficile. Vous pouvez changer indépendamment les "skins" des héros, ajouter le nombre d'adversaires, introduire des bonus dans le jeu, débarrasser les données du potentiomètre des cliquetis, etc. Mon code est comme sous le spoiler.

Traitement du code de jeu
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
}


Étape 5


Démo de jeu
Vidéo


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


All Articles