start refactoring pong entities to use classes

This commit is contained in:
andrea
2026-03-17 20:11:21 +01:00
parent c774e11923
commit d8efabd6da
5 changed files with 194 additions and 0 deletions

51
src/ball.cpp Normal file
View File

@@ -0,0 +1,51 @@
#include <Arduino.h>
#include <stdint.h>
#include "config.h"
class Ball {
private:
uint8_t _x, _y;
int8_t _direction_x, _direction_y;
void _init_directions(int8_t &_direction) {
if (random(2) == 0) _direction= 1;
else _direction= -1;
}
public:
void move() {
if (!_direction_x) _init_directions(_direction_x);
if (!_direction_y) _init_directions(_direction_y);
if (_x + _direction_x >= 0 && _x + _direction_x < MATRIX_WIDTH)
_x+= _direction_x;
if (_y + _direction_y >= 0 && _y + _direction_y < MATRIX_HEIGHT)
_y+= _direction_y;
}
void bounce_on_pad() {
_direction_x *= -1;
}
void bounce_on_sides() {
_direction_y *= -1;
}
void reset_position () {
_x= BALL_RESET_X;
_y= BALL_RESET_Y;
_init_directions(_direction_x);
_init_directions(_direction_y);
}
uint8_t get_x() {
return _x;
}
uint8_t get_y() {
return _y;
}
};

21
src/ball.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef PLAYER_H
#define PLAYER_H
#include <stdint.h>
#include "config.h"
class Ball {
private:
uint8_t _x, _y;
int8_t _direction_x, _direction_y;
public:
void move();
void bounce_on_pad();
void bounce_on_sides();
void reset_position ();
uint8_t get_x();
uint8_t get_y();
};
#endif

69
src/engine.cpp Normal file
View File

@@ -0,0 +1,69 @@
#include <Arduino.h>
#include "ball.h"
#include "paddle.h"
#include "config.h"
class Engine {
private:
Paddle& _p1;
Paddle& _p2;
Ball& _ball;
uint8_t _p1_score, _p2_score;
uint8_t _hits;
bool _check_pad_ball_collision(Paddle &p1, Ball &ball) {
return false;
}
void point_scored(Ball &ball) {
ball.reset_position();
Serial.print("P1: ");
Serial.print(_p1_score);
Serial.print(" - ");
Serial.print("P2: ");
Serial.print(_p2_score);
Serial.println();
_hits= 0;
// ball_delay= INITIAL_BALL_DELAY;
}
public:
// inizialize Engine constructor, linking all args with private args
Engine(Paddle &p_one, Paddle &p_two, Ball &ball): _p1(p_one), _p2(p_two), _ball(ball) {}
void run(uint8_t &ball_delay) {
_ball.move();
uint8_t bx= _ball.get_x();
uint8_t by= _ball.get_y();
if (bx == 0) {
if (!_check_pad_ball_collision(_p1, _ball)) {
// p2 scores
_p2_score +=1;
Serial.println("Player 2 Scores");
}
else {
_hits += 1;
_ball.bounce_on_pad();
}
}
else if (bx >= MATRIX_WIDTH-1) {
if (!_check_pad_ball_collision(_p2, _ball)) {
// p1 scores
_p1_score += 1;
Serial.println("Player 1 Scores");
}
}
if (by == 0 || by == MATRIX_HEIGHT-1) _ball.bounce_on_sides();
if (_hits >= 6 && ball_delay >= 80) {
// increase ball speed
_hits= 0;
ball_delay-= 20;
}
}
};

32
src/paddle.cpp Normal file
View File

@@ -0,0 +1,32 @@
#include <stdint.h>
#include "config.h"
class Paddle {
private:
// define player coordinates
uint8_t _position, _height;
bool _human;
public:
void move_pad_up(bool &need_refresh) {
if (_position > 0) {
_position -= 1;
need_refresh= true;
}
}
void move_pad_down(bool &need_refresh) {
if (_position + _height <= MATRIX_HEIGHT) {
_position += 1;
need_refresh= true;
}
}
uint8_t get_position() {
return _position;
}
bool is_human() {
return _human;
}
};

21
src/paddle.h Normal file
View File

@@ -0,0 +1,21 @@
#ifndef PADDLE_H
#define PADDLE_H
#include <stdint.h>
#include "config.h"
class Paddle {
private:
// define player coordinates
uint8_t position, height;
bool human;
public:
void move_pad_up(bool &need_refresh);
void move_pad_down(bool &need_refresh);
uint8_t get_position();
bool is_human();
};
#endif