我是新手,出于教育目的仍在学习 OOP 和 SDL。
所以,我有一个变量 SDL_Renderer 渲染器
。这个变量只需要启动一次,我在 GameManager
类中启动它。
我还有另一个名为 Texture
的类,它需要那个 renderer
。
这个Texture
会被频繁使用。
那么我如何传递这个renderer
?我必须在 Texture
类中调用 GameManager
吗?但如果我这样做,这意味着我每次使用 Texture
时都会创建 GameManager
对吗?或者有另一种解决方法?
谢谢你的帮助,如果我的问题含糊不清或不清楚,我真的很抱歉。
编辑
这是纹理类
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()
只是传递渲染器的 getter
这是我的主
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
被销毁时被销毁。
关于c++ - 将变量传递给多个类 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29096468/