/** * Collision (Pong). * * Перемещайте мышь вверх и вниз, чтобы двигать ракетку. * * Изменена в 2007 Тодом Куртом, чтобы использовать последовательный порт * * Updated 13 January 2003 by K Pfeiffer */ import processing.serial.*; String portname = "/dev/tty.usbserial-A4001qa8"; // или "COM8" Serial port; // Создать объект класса Serial // Глобальные переменные для мячика float ball_x; float ball_y; float ball_dir = 1; float ball_size = 5; // Радиус float dy = 0; // Направление // Глобальные переменные для ракетки int paddle_width = 5; int paddle_height = 20; int paddle_pos; // новая позиция int paddle_ppos; // старая позиция int dist_wall = 15; void setup() { size(255, 255); rectMode(CENTER_RADIUS); ellipseMode(CENTER_RADIUS); noStroke(); smooth(); ball_y = height/2; ball_x = 1; // Открыть порт, к которому подключена плата, и использовать ту же самую скорость (19200 бод) port = new Serial(this, portname, 19200); } void draw() { background(51); ball_x += ball_dir * 1.0; ball_y += dy; if(ball_x > width+ball_size) { ball_x = -width/2 - ball_size; ball_y = random(0, height); dy = 0; } if (port.available() > 0) { // Если есть данные, paddle_ppos = paddle_pos; // сохранить старую позицию, paddle_pos = port.read(); // считать их и сохранить как новую позицию } // Уместить ракетку на экране float paddle_y = constrain(paddle_pos, paddle_height, height-paddle_height); // Проверить, касается ли мяч ракетки float py = width-dist_wall-paddle_width-ball_size; if(ball_x == py && ball_y > paddle_y - paddle_height - ball_size && ball_y < paddle_y + paddle_height + ball_size) { ball_dir *= -1; if(paddle_pos != paddle_ppos) { dy = (paddle_pos - paddle_ppos)/2.0; if(dy > 5) { dy = 5; } if(dy < -5) { dy = -5; } } } // Если мяч ударяется о ракетку или стену, изменить направление if(ball_x < ball_size && ball_dir == -1) { ball_dir *= -1; } // Если мяч касается верхнего или нижнего края, поменять направление if(ball_y > height-ball_size) { dy = dy * -1; } if(ball_y < ball_size) { dy = dy * -1; } // Нарисовать мяч fill(255); ellipse(ball_x, ball_y, ball_size, ball_size); // Нарисовать ракетку fill(153); rect(width-dist_wall, paddle_y, paddle_width, paddle_height); }