我试图用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);”中无效。 发生了什么 ? 我现在该怎么办?
答案 0 :(得分:0)
你的static
声明在你的core.h文件中做了什么,实质上是说包含core.h的每个.cpp文件都应该有自己的变量副本。这可能不是您想要的行为以及导致您的问题的原因,I.E。 Init
或loadTexture
正在修改一个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中声明的窗口。