class — классы игрока, созданные с помощью аргумента C ++ SDL

Итак, снова сделаем клон понг, и столкнемся с шишкой. Я создаю game class gamestate для моего конечного автомата, и в определении я создаю два класса класса, который я создал для весла разных игроков, и я даю им два разных аргумента, которые будут определять, станет ли класс объектом один игрок или игрок два. Но похоже, что программа не позволит мне передать аргумент в определении класса. Я пытался поместить экземпляр класса в game конструктор класса, но затем функции events / logic / render не имеют доступа к классам весла. Это заставляет меня думать, что это должно быть в game определение класса. Вот код, представляющий проблему.

class Ball
{
public:
void events();
void logic();
void render();
Ball(int server);
~Ball();
};

class Paddle
{
private:
SDL_Rect Paddle_Bound;
int yVel;
SDL_Rect *clip;
int player_key;
public:
void events();
void logic();
void render();
Paddle(int player);
~Paddle();
};

class Game : public GameState
{
private:
int server;
TTF_Font *score = NULL;
Paddle PlayerOne(1);
Paddle Playertwo(2);
Ball Ball(2);
public:
void events();
void logic();
void render();
Game();
~Game();
};

Линии, которые говорят

Paddle PlayerOne(1);
Paddle Playertwo(2);
Ball Ball(2);

Являются ли те, которые вызывают ошибки, которые говорят «ожидал спецификатор типа». Теперь я знаю, что это означает, что он хочет что-то вроде int player но мне нужно передать число, чтобы конструктор мог решить, каким игроком он будет, что в конечном итоге решает, какие клавиши перемещают класс вверх и вниз по экрану. Итак, чтобы быть совершенно ясным, я хочу иметь возможность передать аргумент для создания экземпляра класса, чтобы конструктор класса мог превратить класс в левое ИЛИ правое весло. Итак, как мне создать экземпляр класса внутри другого класса, используя аргументы?

Спасибо!

РЕДАКТИРОВАТЬ: Для проблемы конструктора у меня есть еще один пример, который полностью закодирован, где я не могу поместить инициализатор класса в конструктор. Так что в основном на экране заголовка есть одна кнопка, и она имеет свойства, хранящиеся в Button класс, который я создаю для управления кнопками.

class GameState
{
public:
virtual void events() = 0;
virtual void logic() = 0;
virtual void render() = 0;
virtual ~GameState(){};
};

class Button
{
public:
SDL_Rect button_clip[2];
SDL_Rect button;
SDL_Surface *button_sprite = NULL;
Button();
};

class Title : public GameState
{
private:
SDL_Surface *Title_Message = NULL;
SDL_Rect *clip;
// THIS IS WHERE I HAVE TO PLACE THIS LINE
//Button Title_Button;
public:
void events();
void logic();
void render();
Title();
~Title();
};

Title::Title()
{
//THIS IS WHERE IT SHOULD BE ACCORDING TO WHAT YOU'RE TELLING ME
Button Title_Message;
//text/sprites
Title_Message = TTF_RenderText_Solid(font, "PONG", color);
Title_Button.button_sprite = load_image("Start.png");
//region for button
Title_Button.button.x = 200;
Title_Button.button.y = 350;
Title_Button.button.w = 100;
Title_Button.button.h = 50;
//clips not hover
Title_Button.button_clip[0].x = 0;
Title_Button.button_clip[0].y = 0;
Title_Button.button_clip[0].w = 100;
Title_Button.button_clip[0].h = 50;
//clips hover
Title_Button.button_clip[1].x = 0;
Title_Button.button_clip[1].y = 50;
Title_Button.button_clip[1].w = 100;
Title_Button.button_clip[1].h = 50;
}

Title::~Title()
{
SDL_FreeSurface(Title_Message);
SDL_FreeSurface(Title_Button.button_sprite);
}

void Title::events()
{
int x = 0;
int y = 0;
while (SDL_PollEvent(&event))
{
if (event.type == SDL_MOUSEMOTION)
{
x = event.motion.x;
y = event.motion.y;
if ((x > Title_Button.button.x) && (x < (Title_Button.button.x + Title_Button.button.w)) && (y > Title_Button.button.y) && (y < (Title_Button.button.y + Title_Button.button.h)))
{
clip = &Title_Button.button_clip[1];
}
else
{
clip = &Title_Button.button_clip[0];
}
}
if (event.type == SDL_QUIT)
{
quit = true;
}
if (event.type == SDL_MOUSEBUTTONDOWN)
{
if (event.button.button == SDL_BUTTON_LEFT)
{
if ((x > Title_Button.button.x) && (x < (Title_Button.button.x + Title_Button.button.w)) && (y > Title_Button.button.y) && (y < (Title_Button.button.y + Title_Button.button.h)))
{
set_next_state(GAME);
}
}
}
}
}

void Title::logic()
{

}

void Title::render()
{
apply_surface(Title_Button.button.x, Title_Button.button.y, Title_Button.button_sprite, screen, clip);
apply_surface((SCREEN_WIDTH - Title_Message->w) / 2, 100, Title_Message, screen);
}

Проблема здесь в том, что функции events / logic / render не имеют ни малейшего представления о том, что Title_Message существует, когда я помещаю его в void Title::Title() конструктор. Но когда я помещаю это в определение класса, я не могу передать аргумент через него.

0

Решение

Значения должны быть инициализированы в определении конструктора: не в определении класса.

class Game : public GameState
{
private:
int server;
TTF_Font *score;
Paddle PlayerOne;
Paddle Playertwo;
Ball ball;  // same class name and variable name won't work
public:
void events();
void logic();
void render();
Game();
~Game();
};
...
Game::Game()
:   score(NULL)
,   PlayerOne(1)
,   PlayerTwo(2)
,   ball(2)
{
...
}

РЕДАКТИРОВАТЬ: для заголовка сообщения

class Title : public GameState
{
private:
SDL_Surface *Title_Message = NULL;
SDL_Rect *clip;
// THIS IS WHERE I HAVE TO PLACE THIS LINE
Button Title_Button;
Button Title_Message;
public:
void events();
void logic();
void render();
Title();
~Title();
};

Title::Title()
{
//text/sprites
Title_Message = TTF_RenderText_Solid(font, "PONG", color);
Title_Button.button_sprite = load_image("Start.png");
0

Другие решения

Вы не можете сделать это вне метода. Сделай это в конструкторе

class Game : public GameState
{
private:
int server;
TTF_Font *score;
Paddle PlayerOne(1);
Paddle Playertwo(2);
Ball ballObject(2);
public:
void events();
void logic();
void render();
Game(): PlayerOne(1), Playertwo(2), ballObject(2){};
~Game();

};

Изменить: Ответ уже был опубликован, я прошу прощения за размещение того же ответа. Я новичок в использовании интерфейса. Таким образом, потребовалось время, чтобы выяснить генерацию блока кода.

Редактировать 2: Отвечая на ваш редактировать.
Вы должны объявить объект в самом классе. Просто вы не можете создать его экземпляр в декларации. Вы должны изучить, как работают классы и классы С ++ в целом.

class class1
{
private:
class class2Obj(args);
public:
class1();
~class1();
}

Приведенный выше пример неверен. Чтобы сделать эту работу, вы должны сделать это так

class class1
{
private:
class2 class2Obj;
public:
class1();
~class1();
}

class1::class1()
{
class2Obj(args);
}
0

По вопросам рекламы [email protected]