total reframe with classes
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
|
||||
#include "src/config.h"
|
||||
#include "src/pong_render.h"
|
||||
#include "src/pong_player.h"
|
||||
#include "src/pong_ball.h"
|
||||
|
||||
#include "src/paddle.h"
|
||||
#include "src/ball.h"
|
||||
#include "src/engine.h"
|
||||
|
||||
// create LED matrix object
|
||||
ArduinoLEDMatrix matrix;
|
||||
@@ -20,18 +22,8 @@ byte frame[MATRIX_HEIGHT][MATRIX_WIDTH] = {
|
||||
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
// players coordinates
|
||||
int players_coords[2]= {1, 4};
|
||||
int players_scores[2]= {0, 0};
|
||||
|
||||
// initials balls coordinates
|
||||
int ball_x= BALL_RESET_X;
|
||||
int ball_y= BALL_RESET_Y;
|
||||
|
||||
int need_refresh= true;
|
||||
|
||||
int ball_delay= INITIAL_BALL_DELAY;
|
||||
|
||||
uint8_t ball_delay= INITIAL_BALL_DELAY;
|
||||
long exec_t2= millis();
|
||||
|
||||
enum game_statuses : uint8_t {
|
||||
@@ -43,6 +35,10 @@ enum game_statuses : uint8_t {
|
||||
};
|
||||
game_statuses game_status= TIMER;
|
||||
|
||||
Ball ball(4, 6);
|
||||
Paddle p1(1);
|
||||
Paddle p2(4);
|
||||
Engine engine(p1, p2, ball);
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
@@ -61,6 +57,7 @@ void loop() {
|
||||
long exec_t1= millis();
|
||||
|
||||
switch (game_status) {
|
||||
|
||||
case TIMER:
|
||||
for (int i = START_TIMER; i >= 0; i--) {
|
||||
render_timer(frame, i);
|
||||
@@ -73,38 +70,52 @@ void loop() {
|
||||
break;
|
||||
|
||||
case RUN:
|
||||
pong_move_p1(players_coords[0], need_refresh);
|
||||
pong_move_p2(players_coords[1], need_refresh);
|
||||
if (exec_t1 - exec_t2 > ball_delay) {
|
||||
if (digitalRead(P1_BTN_UP) == LOW) {
|
||||
p1.move_pad_up();
|
||||
need_refresh= true;
|
||||
bool scored= move_ball(ball_x, ball_y, ball_delay, players_coords, players_scores);
|
||||
if (scored) {
|
||||
}
|
||||
else if (digitalRead(P1_BTN_BOTTOM) == LOW) {
|
||||
p1.move_pad_down();
|
||||
need_refresh= true;
|
||||
}
|
||||
if (digitalRead(P2_BTN_UP) == LOW) {
|
||||
p2.move_pad_up();
|
||||
need_refresh= true;
|
||||
}
|
||||
else if (digitalRead(P2_BTN_BOTTOM) == LOW) {
|
||||
p2.move_pad_down();
|
||||
need_refresh= true;
|
||||
}
|
||||
if (exec_t1 - exec_t2 > ball_delay) {
|
||||
engine.run(ball_delay);
|
||||
need_refresh= true;
|
||||
if (engine.get_event() == P1SCORE || engine.get_event() == P2SCORE) {
|
||||
game_status= SCORE;
|
||||
// delay the ball movement after score
|
||||
exec_t2= millis() + FIRST_START_BALL_DELAY;
|
||||
exec_t2= millis() + FIRST_START_BALL_DELAY + 1000;
|
||||
} else exec_t2= exec_t1;
|
||||
}
|
||||
// rerender matrix only if something is changed
|
||||
if (need_refresh) {
|
||||
render_matrix(frame, players_coords, ball_x, ball_y);
|
||||
render_matrix(frame, p1, p2, ball);
|
||||
matrix.renderBitmap(frame, MATRIX_HEIGHT, MATRIX_WIDTH);
|
||||
need_refresh= 0;
|
||||
need_refresh= false;
|
||||
}
|
||||
delay(50);
|
||||
break;
|
||||
|
||||
case SCORE:
|
||||
render_score(frame, players_scores);
|
||||
render_score(frame, p1, p2);
|
||||
matrix.renderBitmap(frame, MATRIX_HEIGHT, MATRIX_WIDTH);
|
||||
delay(1000);
|
||||
if (players_scores[0] >= MAX_POINTS || players_scores[1] >= MAX_POINTS) {
|
||||
if (p1.get_score() >= MAX_POINTS || p2.get_score() >= MAX_POINTS) {
|
||||
game_status= GAMEOVER;
|
||||
}
|
||||
else game_status= RUN;
|
||||
break;
|
||||
|
||||
case GAMEOVER:
|
||||
render_winner(frame, matrix, players_scores);
|
||||
render_winner(frame, matrix, p1, p2);
|
||||
game_status= WAIT;
|
||||
break;
|
||||
|
||||
@@ -113,8 +124,7 @@ void loop() {
|
||||
// restart game once one button is pressed
|
||||
if (digitalRead(P1_BTN_UP) == LOW || digitalRead(P1_BTN_BOTTOM) == LOW || digitalRead(P2_BTN_UP) == LOW || digitalRead(P2_BTN_BOTTOM) == LOW) {
|
||||
game_status= TIMER;
|
||||
players_scores[0]= 0;
|
||||
players_scores[1]= 0;
|
||||
engine.reset();
|
||||
}
|
||||
delay(100);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user