我是新人,仍在学习OOP和SDL用于教育目的。
所以,我有一个变量SDL_Renderer renderer
。这个变量只需要启动一次,我在GameManager
类中启动它。
我有另一个名为Texture
的类需要renderer
。
这个Texture
会经常使用。
那我如何通过这个renderer
?我是否必须在GameManager
课程中致电Texture
?但如果我这样做,这意味着我每次使用GameManager
权利时都会Texture
?还是有另一种方式?
修改
这是Texture class
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;
}
我希望它不会混淆。
答案 0 :(得分: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
被销毁时销毁。