变量SDL_Renderer *似乎不起作用

时间:2018-02-09 16:10:49

标签: c++ sdl-2

我试图用SDL2库创建一些东西。 这是我的main.cpp中的两个函数:

 bool Init()
{
    bool success = true;
    window = SDL_CreateWindow("SDL Program", SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,SCREEN_WIDTH,SCREEN_HEIGHT,SDL_WINDOW_SHOWN);
    if ( window == NULL )
    {
        cout << "Window could not be created. Error: \n" << SDL_GetError();
        success = false;
    }
    else
    {
        renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);
        if (renderer == NULL)
        {
            cout << "Renderer could not be created. Error: \n" << SDL_GetError();
            success = false;
        }
        else
        SDL_SetRenderDrawColor(renderer,0xFF,0xFF,0xFF,0xFF);
    }
    return success;
}

SDL_Texture* loadTexture(string s)
{
    SDL_Texture* newTexture = NULL;
    SDL_Surface* loadedSurface = SDL_LoadBMP(s.c_str());
    if (loadedSurface == NULL)
    {
        cout << "Unable to load image. Error: \n " << SDL_GetError();
    }
    else
    {
        SDL_SetColorKey( loadedSurface, SDL_TRUE, SDL_MapRGB( loadedSurface->format, 0x00, 0xFF, 0xFF ) );
        newTexture = SDL_CreateTextureFromSurface(renderer,loadedSurface);
        if (newTexture == NULL)
            cout << "Unable to create texture from " << s << " Error: \n" << SDL_GetError();
        SDL_FreeSurface(loadedSurface);
    }
    return newTexture;
}

然后我想将loadTexture函数移动到core.h文件和core.cpp 这是我的core.h:

#ifndef _CORE_H_INCLUDED
#define _CORE_H_INCLUDED

#include <string>
#include <SDL.h>

using namespace std;

//SDL_Texture* loadTexture(string s);

const int SCREEN_WIDTH = 1280;
const int SCREEN_HEIGHT = 720;

static SDL_Window* window = NULL;
static SDL_Texture* texture = NULL;
static SDL_Renderer* renderer = NULL;
static SDL_Texture* current_render = NULL;
#endif

我将SDL_renderer *设置为静态变量但是当我将我的函数移动到core.cpp时,我的程序运行,但它没有加载纹理。我尝试了很多然后我认为它因为SDL_Renderer *变量在“newTexture = SDL_CreateTextureFromSurface(renderer,loadedSurface);”中无效。 发生了什么 ? 我现在该怎么办?

1 个答案:

答案 0 :(得分:0)

你的static声明在你的core.h文件中做了什么,实质上是说包含core.h的每个.cpp文件都应该有自己的变量副本。这可能不是您想要的行为以及导致您的问题的原因,I.E。 InitloadTexture正在修改一个cpp的变量集(core.cpp),而main.cpp正在使用另一个变量。如果你真的想使用全局变量,你应该做的是在core.cpp中有以下内容:

SDL_Window* window = NULL;
SDL_Texture* texture = NULL;
SDL_Renderer* renderer = NULL;
SDL_Texture* current_render = NULL;

以及core.h中的以下内容:

extern SDL_Window* window;
extern SDL_Texture* texture;
extern SDL_Renderer* renderer;
extern SDL_Texture* current_render;

extern所说的基本上与静态相反。它说“在.cpp文件的其他地方声明了一个SDL_Window *名称窗口,所以包含它的每个.cpp应该使用那个”。在这种情况下,这将是core.cpp。因此,当main.cpp包含core.h时,它使用的窗口将是core.cpp中声明的窗口。