我正在使用SDL用C ++编写一个基本的2D游戏,就在昨天我从1.2转换为2.0。
我想创建一个移动相机,我意识到我应该从使用SDL_Surfaces切换到SDL_Textures以使用2.0的一些新功能。我之前的设置包括将一堆sprite表面blitting到一个名为buffer的主表面,然后将其翻转到屏幕,它运行良好。
因此,我创建了一个渲染器并将其分配给窗口。然后我使用SDL_CreateTextureFromSurface从我的主SDL_Surface创建纹理。我的表面目前设置为nullptr,我意识到我应该将它初始化为某些东西,但我无法弄清楚是什么。这是相关的代码。
void Game::Init() {
// Initialize SDL.
SDL_Init(SDL_INIT_EVERYTHING);
window = nullptr;
buffer = nullptr;
camera = { player.GetLocation().x - 50, player.GetLocation().y - 50, player.GetLocation().x + 50, player.GetLocation().y + 50 };
fullscreen = false;
screenWidth = 640, screenHeight = 480;
if (fullscreen) {
window = SDL_CreateWindow("Rune", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screenWidth, screenHeight, SDL_WINDOW_FULLSCREEN_DESKTOP);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
}
else {
// Initialize our window.
window = SDL_CreateWindow("Rune", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screenWidth, screenHeight, SDL_WINDOW_SHOWN);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_SOFTWARE);
// Assign the buffer surface to the window.
}
texture = SDL_CreateTextureFromSurface(renderer, buffer);
SDL_SetRenderTarget(renderer, texture);
// Run the game loop.
Run();
}
在Run中,有一个涉及游戏循环的正常工作代码,但在游戏循环中我有一个方法,Render(),这会导致问题。在这里。
void Game::Render() {
// Clear the buffer.
SDL_FillRect(buffer, NULL, 0x000000);
// Draw everything to the buffer.
level.Draw(buffer);
if (enemy.IsAlive()) enemy.Draw(buffer);
player.Draw(buffer);
SDL_UpdateTexture(texture, NULL, buffer->pixels, buffer->pitch);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, NULL, NULL);
SDL_RenderPresent(renderer);
// Draw buffer to the screen.
//SDL_UpdateWindowSurface(window);
}
运行此代码会给出错误,即缓冲区为nullptr,它出现在SDL_UpDateTexture行上。如果我在Init()函数中为缓冲区分配内存,则会出现内存访问错误。有人能提供解决方案吗?谢谢。
答案 0 :(得分:0)
在将所有SDL_Surfaces更改为Textures之后,我意识到在我的头文件中,我一直在调用依赖于渲染器的构造函数已经初始化,但它不是。我将它们设置为空白构造函数,然后在渲染器之后在Game.cpp文件中初始化它们,现在一切正常。谢谢本杰明的帮助!