我是新手,仍在学习OOP和SDL以用于教育目的。

因此,我有一个变量SDL_Renderer renderer。这个变量只需要启动一次,我就在GameManager类中启动它。
我还有一个名为Texture的类,需要该renderer
Texture将经常使用。

那么如何通过此renderer?我必须在GameManager类中调用Texture吗?但是,如果我这样做,那意味着我每次使用GameManager时都会做出Texture吗?还是有另一种方法?

感谢您的帮助,如果我的问题不清楚或不清楚,我将深表歉意。

编辑

这是Texture类

class Texture
{
public:
    Texture();
    ~Texture();

    int getWidth();
    int getHeight();
    bool loadFromFile(std::string path);
    bool loadTextFromFile(std::string text, SDL_Color textColor, TTF_Font* font);
    void render(int x, int y, SDL_Rect* clip = NULL);
    void free();

    bool lockTexture();
    bool unlockTexture();
    void* getPixels();
    int getPitch();

private:
    int vWidth;
    int vHeight;
    SDL_Texture* vTexture;
    SDL_Renderer* renderer;

    void* pPixels;
    int pPitch;
};


这是发起者

Texture::Texture()
{
    vTexture = NULL;
    vWidth = 0;
    vHeight = 0;
    renderer = GameManager::getRenderer();
}


这是GameManager类

class GameManager
{
public:
    GameManager();
    ~GameManager();
    bool intializeGame();
    void gameLoop();
    static SDL_Renderer* getRenderer();

private:
    SDL_Window* window = NULL;
    static SDL_Renderer* renderer;
    TTF_Font* font = NULL;

    const int SCREEN_WIDTH = 640;
    const int SCREEN_HEIGHT = 480;
};


getRenderer()只是通过渲染器的获取器

这是我的主

int main(int argc, char* args[])
{
    GameManager gameManager;
    gameManager.intializeGame();

    Texture charTexture;
    SDL_Rect rect;

    bool text = charTexture.loadFromFile("foo.png");
    if (!text)
    {
        printf("texture not loaded");
    }

    rect.x = 0;
    rect.y = 0;
    rect.w = charTexture.getWidth();
    rect.h = charTexture.getHeight();

    while (true)
    {

        SDL_SetRenderDrawColor(GameManager::getRenderer(), 0xFF, 0xFF, 0xFF, 0xFF);
        SDL_RenderClear(GameManager::getRenderer());

        charTexture.render(10, 10, &rect);

        SDL_RenderPresent(GameManager::getRenderer());
    }

    return 0;
}


我希望不要混淆。

最佳答案

免责声明:我从未使用过SDL。这可能很糟糕,但这是基于您给我的。
重要的是所有权。这是一个共享所有权的示例。这非常简单,并且承担了确定何时销毁SDL_Renderer的负担。

class GameManager {

//BLABGLABLA

public:
    std::shared_ptr<SDL_Renderer> getRenderer();

private:
    std::shared_ptr<SDL_Renderer> renderer
}


class Texture
{
public:
    Texture(std::shared_ptr<SDL_Renderer> theRenderer, //some other args)

private:
    std::shared_ptr<SDL_Renderer> renderer;
}


因此,仅根据类的名称,您可能希望GameManager拥有渲染器,但也希望Texture可以访问它。
一种实现方法是在两个类中都有一个shared_ptr成员,并将渲染器传递到其构造函数中的纹理。

基本上,您在GameManager中初始化的渲染器对象只会在指向它的最后一个shared_ptr被销毁时销毁。

10-08 11:49