由参数C ++ SDL实例化的Player类

时间:2013-12-29 08:18:36

标签: c++ class sdl instantiation game-development

所以,再次,制作一个乒乓球克隆,并遇到一个颠簸。我正在为我的状态机创建game类游戏状态,在定义中,我实例化了我为不同的玩家拨片创建的两个类,我给它们两个不同的参数来决定是否class成为玩家之一或玩家两个对象。

但似乎程序不允许我在类定义中传递参数。我试图将类实例化放在game类构造函数中,但事件/逻辑/渲染函数无法访问paddle类。这导致我认为它必须在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);
}

这里的问题是当我将它放在Title_Message构造函数中时,事件/逻辑/渲染函数不知道void Title::Title()存在。但是当我把它放在类定义中时,我无法通过它传递一个参数。

2 个答案:

答案 0 :(得分:0)

值应该在构造函数definiton中初始化:不在类定义中。

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");

答案 1 :(得分: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);
 }