г. Москва, ул.Новороссийская, дом 21, к.64. м.Люблино,ПН-ПТ с 10.00 до 19.30 и СБ с 12.00 до 16.00
+7(985) 997-37-74
07.09.2016

Arduino Pong

07.09.2016

 Сорок лет назад, 29 ноября 1972 года, компания Atari, основанная 27-летним Ноланом Бушнеллом в июне того же года, объявила о выпуске первой компьютерной игры, снискавшей широкую популярность, – Pong. 

Мы решили воссоздать некоторое подобие этой популярной игры. Для этого нам понадобится:

1. Arduino или Elemik UNO R3

2. Джойстик модуль 2 шт.

Игру будем создавать на языке Processing. Arduino же с джойстиками будем использовать как пульт управления планками в игре. Схема подключения джойстиков представлена ниже

 

Для Arduinoбыл составлен следующий скетч:

int const potPin1 = A1;
int const potPin2 = A0;
int const potPin3 = A3;
int const potPin4 = A2;

void setup() {
  Serial.begin(9600);
}
void loop() {
  String dat = "";
  dat += analogRead(potPin1);
  dat += '-';
  dat += analogRead(potPin2);
  dat += '-';
  dat += analogRead(potPin3);
  dat += '-';
  dat += analogRead(potPin4);
  Serial.println(dat);
  delay(50);
}

 Программанаязыке Processing:

import processing.serial.*;             
import java.awt.Rectangle;              

Serial myPort;   

Rectangle leftPaddle, rightPaddle;    

int paddleHeight = 50;            
int paddleWidth = 10;            

int ballSize = 10;     
int xDirection = 2;    
int yDirection = 2;   
int xPos, yPos;       
boolean moveLeftPaddle = false;
boolean moveRightPaddle = false;
boolean win = false;
boolean title = true;
int leftScore = 0;      
int rightScore = 0;    

int fontSize = 40;      



void setup() {

  size(840, 660);      

  leftPaddle = new Rectangle(50, height/2, paddleWidth, paddleHeight); //размеры планки
  rightPaddle = new Rectangle(width-50, height/2, paddleWidth, paddleHeight);
  noStroke(); 
  fill(255);  
  resetBall();
  PFont myFont = createFont(PFont.list()[3], fontSize);
  textFont(myFont);
  myPort = new Serial(this, Serial.list()[0], 9600);
  myPort.bufferUntil('\n');
}

void draw() {

  background(0);
  rect(leftPaddle.x, leftPaddle.y, leftPaddle.width, 70, 10); //рисуем планки
  rect(rightPaddle.x, rightPaddle.y, rightPaddle.width, 70, 10);
  animateBall();
  text(leftScore, 300, fontSize);
  text(rightScore, 500, fontSize);
}
void serialEvent(Serial thisPort) { 
  String inputString = thisPort.readStringUntil('\n');
  int sensors[] = int(split(inputString, '-'));
  inputString = trim(inputString);
  leftPaddle.y = int(map(sensors[0], 0, 1023, 0, height - leftPaddle.height));
  rightPaddle.y = int(map(sensors[1], 0, 1023, 0, height - rightPaddle.height));
}

void animateBall() {
  if (leftPaddle.contains(xPos, yPos) ||    
    rightPaddle.contains(xPos, yPos)) {       
    xDirection = -xDirection;
  }

  if (xPos < 0) 
  {     
    rightScore++;     
    resetBall();
  }    
  if (xPos > width) 
  {
    leftScore++;
    resetBall();
  }
  if ((yPos <= 0) || (yPos >=height)) {
    yDirection = -yDirection;
  }
  xPos = xPos + xDirection;
  yPos = yPos + yDirection;
  ellipse(xPos, yPos, ballSize, ballSize);
}
void resetBall()
{
  xPos = width/2;
  yPos = height/2;
}

 

Результат наших стараний:

#Элемик #arduinopong #elemik