40 лет назад, 29 ноября 1972 года, компания Atari, основанная 27-летним Ноланом Бушнеллом, объявила о выпуске первой компьютерной игры, снискавшей широкую популярность – Pong.
40 лет назад, 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; }
Результат наших действий: