How to organize class member variables and functions
Hi, Just making a practice project (learning graphics, sockets,
wxWidgets). Its a ping pong game: playing against an opponent via
internet. It all works as fine/intended. But I am more interested in
making it professionally structured (not one of those beginner
structured ones again :)), as am trying to learn/practice C++ more.
The code is now (as you can see below) structured so that the
wxWidget window class has everything in it (PingPongFrame). Obviously
only window-based things should really be there, isn't it? I guess all
the graphics (using SFML library) should have their own class (Graphics)
- so all drawing and things like that should be there. All the game
related things (like moving objects etc) should be in a new class: Game.
Then I have the socket programming. But its code is very small so I
guess it does not need a class- I can just use it inside Game class.
So all of this I think I understand. My main question is that should I
put all the functions to be as member functions of classes or global
functions inside corresponding class header? I know we should avoid
member functions, but what would be a good rule here which ones to make
global functions and which ones members? Its easier to make them
members... Almost all of them are using private members, so is it just
best to make them members even though then I get a lot of member
functions, like 10-15? Also as you can see there are very many member
variables as well... should I put all of them inside Game and Graphics
classes, or group them into new structures?
The header of the game (window) class (I know its a bit mess, but I am
not sure yet how to group them so did not change much. Plus I know the
names are not well done, but I will fix it later...). sf:: refers to
SFML graphics library:
enum class Player {LEFT, RIGHT};
class PingPongFrame: public wxFrame
{
public:
void drawPanelMouseClick(float x, float y, bool right=false);
// called from a child window to pass mouse msg
PingPongFrame(wxWindow* parent,wxWindowID id = -1);
virtual ~PingPongFrame();
private:
sf::Text pauseMessage;
sf::Text scoreMessage;
sf::Font font;
sf::RenderWindow m_sfmlWindow; // sfml window
sf::Texture GroundTexture;
sf::Texture BoxTexture;
sf::String m_tcp;
void runTcpServer(unsigned short port);
void runTcpClient(unsigned short port);
bool m_isServer_ = false;
sf::String m_message;
bool connected;
sf::TcpListener m_listener;
sf::TcpSocket m_socket;
void TcpListenClientMessages(unsigned short port);
void TcpServerStart(unsigned short port);
void TcpClientConnect(unsigned short port);
// paddless
sf::RectangleShape leftPaddle;
sf::RectangleShape rightPaddle;
sf::CircleShape ball;
sf::Sound ballSound;
sf::Sound ballSoundHit;
sf::SoundBuffer ballSoundBuffer;
sf::SoundBuffer ballSoundBufferHit;
std::vector<std::pair<sf::SoundBuffer, sf::Sound>> m_applauseSound;
std::vector<std::pair<sf::SoundBuffer, sf::Sound>> m_ohhSound;
void addSound(const char* file,
std::vector<std::pair<sf::SoundBuffer, sf::Sound>>& soundVec);
void playRandomSound(std::vector<std::pair<sf::SoundBuffer,
sf::Sound>>& soundVec);
float paddleSpeed = 400.f;
float ballSpeed = 120.f;
sf::Clock clock;
const float pi = 3.14159f;
int gameWidth = 800;
int gameHeight = 600;
sf::Vector2f paddleSize = sf::Vector2f(25, 100);
float ballRadius = 10.f;
float deltaTime = 0.0;
bool isPlaying = false;
float ballAngle = 0.f;
int m_scoreServer = 0, m_scoreClient = 0;
void drawField();
void startGame();
void updateSceen();
void moveBall();
void sendGameInfoToServer(int rightPaddleX, int rightPaddleY);
void sendGameInfoToClient();
bool parseMsgFromServer(const std::string& msg);
bool parseMsgFromClient(const std::string& msg);
void sendMsgToClient(const std::string& msg);
void doWin(Player winner, const char* msg);
void drawScore();
bool m_isSceenChanged = true;
bool m_serverWaitingForPositionResponce = false;
float scalX, scalY;
float sizeBoxX = 32.0;
float sizeBoxY = 32.0;
float sizeGroundX = 150.0;
float sizeGroundY = 50.0;
void initWorld();
void debugInt(int i);
void DrawPanel();
}