Классы проигрывателя, созданные с помощью аргумента C ++ SDL

0

Итак, опять же, сделав клон-клон и наткнувшись на удар. Я создаю game класс игры для своего конечного автомата, и в определении я создаю два класса класса, который я создал для разных игровых манипуляторов, и я даю им два разных аргумента, которые решат, станет ли класс игроком один или игрок - два объекта. Но похоже, что программа не позволит мне передать аргумент в определении класса. Я попытался поместить экземпляр класса в конструктор класса game но затем функции событий/логики/рендеринга не имеют доступа к классам весла. Это заставляет меня думать, что это должно быть в определении 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 но мне нужно передать число, чтобы конструктор мог решить, какой игрок он будет, и в конечном итоге решит, какие клавиши перемещают класс вверх и вниз по экрану. Поэтому, чтобы быть совершенно ясным, я хочу иметь возможность передать аргумент в экземпляр класса, чтобы конструктор класса мог превратить класс в левый ИЛИ правый весло. Итак, как мне создать экземпляр класса, внутри другого класса, используя аргументы?

Благодарю!

EDIT: Для проблемы с конструктором у меня есть еще один пример, который полностью закодирован, где я не могу поместить инициализатор класса в конструктор. Таким образом, в основном на экране заголовка есть одна кнопка, и у нее есть свойства, хранящиеся в классе 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);
}

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

Теги:
class
sdl
instantiation
player

2 ответа

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)
{
...
}

EDIT: для материала заголовка

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
    Это очень простая ссылка - она объясняет основы: publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/…
  • 0
    Я пробовал это, и проблема в том, что когда я инициализирую классы в конструкторе, я не могу ссылаться на них в функциях events/logic/render . Это означает, что когда я устанавливаю различные аспекты весла, такие как смещение по x / y и скорость y, внутри конструктора, это не похоже на то, что функции events/logic/render имеют область действия для свойств объектов. Как я могу это исправить?
Показать ещё 6 комментариев
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: Отмените свое редактирование. Вы должны объявить объект в самом классе. Просто вы не можете создать его в декларации. Вам нужно изучить, как c++ классы и классы в целом работают.

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

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

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

 class1::class1()
 {
     class2Obj(args);
 }
  • 0
    На самом деле, возможно, вы можете помочь мне, потому что я все еще застрял Я пробовал это, и проблема в том, что когда я инициализирую классы в конструкторе, я не могу ссылаться на них в функциях events / logic / render. Это означает, что когда я устанавливаю различные аспекты весла, такие как смещение по x / y и скорость по y, внутри конструктора, это не похоже на то, что функции events / logic / render имеют область действия для свойств объектов. Как я могу это исправить?
  • 0
    О каких событиях / рендере / логических функциях вы говорите: Game One или Paddle One?
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню