Я кодирую аркадную игру pong для введения в проект С++ в университете. В игре есть режим тренировки для одного игрока, в котором мяч просто отскакивает от противоположной стороны экрана, и режим для двух игроков, в котором используются клавиши w и s для движения ракетки игрока 1 и клавиши вверх и вниз для движения игрока 2. Первоначально я написал игру для одного класса, но после консультации с моим лектором он предложил построить игру, используя три класса для дополнительных преимуществ.
Fl_Window
^
|
Game Interface
^ ^
| |
One Player Two Player
Диаграмму, которую мне прислал мой лектор, можно увидеть выше.
У меня есть класс игрового интерфейса, который содержит методы, общие для обоих режимов игры (например, рисование мяча, столкновения с верхней и нижней частью экрана и перемещение ракетки игрока 1), и два других класса для режимов одного игрока и двух игроков, которые содержат методы зависит от режима (например, перемещение ракетки игрока 2, система подсчета очков и рисование ракетки игрока 2).
Сначала я создаю экземпляр класса игрового интерфейса и запускаю функцию меню инициализации игры, которая создает меню с выбором режима игры. Когда выбран любой режим, функция в классе игрового интерфейса стирает виджеты меню, рисует ракетку игрока 1, рисует мяч и отправляет мяч в произвольном направлении с постоянной скоростью.
Затем я хочу, чтобы был создан экземпляр правильного класса игрового режима и запускалась другая конкретная функция инициализации (либо для одного игрока, либо для двух игроков) из этого класса.
Я также хочу иметь возможность вернуться из любого игрового режима в главное меню и иметь возможность выбрать другой режим.
Это мой первый крупномасштабный проект на С++, так что простите меня за плохое общее концептуальное понимание!
Как и где я могу создать эти экземпляры определенных классов игрового режима? В базовом классе интерфейса игры или в основном?
Я инициализирую игровое меню следующим образом:
//Main Function
int main()
{
GameInterface MyInterface(GameInterface::WindowSizeX,
GameInterface::WindowSizeY, "PONG");
MyInterface . InitialiseMenu();
return Fl::run();
}
Который запускает функцию:
void GameInterface :: InitialiseMenu()
{
begin();
MenuTitle = new Fl_Box (400, 50, 100, 50, "Welcome to PONG");
MenuTitle -> labelcolor (FL_WHITE);
MenuTitle -> labelsize (MenuTitleTextSize);
MenuTitle -> box (FL_NO_BOX);
MenuTitle -> show();
TwoPlayerMode = new Fl_Button (400, 300, 150, 50, "Two Player Mode");
TwoPlayerMode -> callback(TwoPlayerMode_cb, this);
TwoPlayerMode -> show();
show();
}
(Примечание: в настоящее время я просто пытаюсь заставить класс для 2 игроков работать с игровым интерфейсом, прежде чем я попытаюсь заставить работать все три класса)
Используемая функция обратного вызова:
//Define two player mode button call back function
void GameInterface :: TwoPlayerMode_cb(Fl_Widget* w,void* data )
{
((GameInterface*) data) -> TwoPlayerMode_cb_i(w);
}
void GameInterface :: TwoPlayerMode_cb_i(Fl_Widget* w)
{
TwoPlayerMode -> hide();
MenuTitle -> hide();
InitialiseGameObjects();
}
Функция инициализации игрового объекта:
//Define initialise game objects
void GameInterface :: InitialiseGameObjects()
{
Fl::add_timeout(0.01, GameInterfaceUpdate_cb, this);
begin();
Ball = new Fl_Box (400, 300, 10, 10);
Ball -> box(FL_FLAT_BOX);
Ball -> color (FL_WHITE);
Ball -> show();
Player1Paddle = new Fl_Box(0, 300, PaddleSizeX, PaddleSizeY);
Player1Paddle -> box(FL_FLAT_BOX);
Player1Paddle -> color(FL_WHITE);
Player1Paddle -> show();
InitialBallDirectionGenerator();
BallVelocityX = InitialBallDirectionX * InitialBallSpeed;
BallVelocityY = InitialBallDirectionY * InitialBallSpeed;
//TwoPlayerModeInitialise_i();
end();
}
Там, где написано //TwoPlayerModeInitialise_i(); Я хочу, чтобы метод, содержащийся в классе для двух игроков, запускался и инициализировал другие объекты, функции и т. д., необходимые для режима игры для двух игроков. Я предполагаю, что мне нужно создать экземпляр этого класса в этот момент? Затем я хочу, чтобы методы обоих классов управляли игрой (например, движение ракетки игрока 1 исходит из класса игрового интерфейса, а движение ракетки игрока 2 исходит из класса режима двух игроков).
Мои занятия сделаны так:
//Game Interface Class
class GameInterface : public Fl_Window
{
//Defining Public Members
public:
GameInterface(int width, int height, const char* title=0) : Fl_Window(width, height, title)
{
color(FL_BLACK);
show();
}
...
};
&
class TwoPlayerMode : public GameInterface
{
...
};
Любая помощь будет принята с благодарностью, так как я действительно застрял в том, куда идти дальше! Спасибо.