我是新手,仍在学习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
被销毁时销毁。