Desenvolvimento de jogos em Processing com controle via placa Arduino Uno

Para começar, descreverei brevemente o objetivo do projeto. Eu queria criar algo simples e intuitivo para demonstrar a comunicação da placa Arduino Uno e de um PC através de uma conexão serial. Algo que se encaixa nos regulamentos do projeto "fim de semana", a saber: foi feito em algumas horas e foi facilmente codificado.

Foi decidido criar um jogo com as seguintes regras. A ação ocorre em um plano bidimensional em funcionamento. A bola "herói", cuja posição é controlada pelo jogador, está tentando evitar uma colisão com as bolas "adversárias". A bola do herói se move apenas ao longo do eixo da abcissa, os oponentes aparecem em um local arbitrário no plano de trabalho e se movem retilinearmente ao longo do eixo das ordenadas. Se a bola “herói” sair da colisão com o “adversário”, o valor do contador de pontos é aumentado; caso contrário, o contador é redefinido e os pontos acumulados anteriormente são “queimados”.

Passo 1


A escolha da linguagem de programação. O processamento foi escolhido porque a linguagem de programação das placas Arduino se baseia nela. O processamento também é uma ferramenta boa e simples para criar imagens, efeitos de animação etc. Sim, também é gratuito.

Passo 2


Construa um "joystick" caseiro. Tudo é totalmente trivial. O papel do joystick é desempenhado por um potenciômetro convencional conectado entre + 5V de potência e o terra GND na placa Arduino Uno. O pino do meio está conectado ao pino analógico "A0".



Naturalmente, se desejar, você pode usar o stick analógico, touchpad etc. A essência é a mesma.

etapa 3


Programação da placa Arduino. Neste projeto, a placa Arduino é obrigada a enviar dados continuamente sobre a posição do controle deslizante do potenciômetro. Posteriormente, esses dados no computador são “coletados” pelo Processing para as necessidades do jogo (determinando as coordenadas da bola do “herói”).

Código para o 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 
}


Passo 4


Na verdade, a escrita do jogo em si. Como mencionado anteriormente, o jogo é escrito na linguagem Processing . Você pode baixar o kit de distribuição no site, também há exemplos de uso. No meu caso, o "mecanismo" consiste em 49 linhas de código, das quais metade são comentários. O que eu quero dizer, entender, não é difícil. Você pode alterar de forma independente as "skins" dos heróis, adicionar o número de oponentes, introduzir bônus no jogo, livrar os dados do potenciômetro de chacoalhar, etc. Meu código é como no spoiler.

Processando código do jogo
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
}


Etapa 5


Demonstração do jogo
Vídeo


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


All Articles