Поэтому я изучаю C ++ с SDL (на Visual Studio 2013). Я следую инструкциям Lazy Foo (в частности: http://lazyfoo.net/tutorials/SDL/02_getting_an_image_on_the_screen/index.php).
Мое изображение не будет отображаться. В отличие от урока (который работает) у меня нет глобальных переменных поверхности. Вместо этого я объявил их в основном и передал указатели вокруг.
Код:
#include <SDL.h>
#include <SDL_image.h>
#include <stdio.h>
#include <string>
const int SCREEN_WIDTH = 600;
const int SCREEN_HEIGHT = 480;
//SDL init.
bool initialiseSDL(SDL_Window* gWindow, SDL_Surface* gWindowSurface)
{
bool success = true;
/*SDL_Init() initisalises SDL library. Returning 0 or less signifies an error.
SDL_INIT_VIDEO flag refers to graphics sub system.*/
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("SDL could not initialise. SDL Error: %s\n", SDL_GetError());
success = false;
}
else
{
//Create the window
gWindow = SDL_CreateWindow("Asteroids", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (gWindow == NULL)
{
printf("Could not create window. SDL Error: %s\n", SDL_GetError());
success = false;
}
else
{
//Get the window surface.
gWindowSurface = SDL_GetWindowSurface(gWindow);
}
}
return success;
}
bool loadMedia(SDL_Surface* surface, std::string path)
{
//Success flag
bool success = true;
surface = SDL_LoadBMP(path.c_str());
if (surface == NULL)
{
printf("SDL surface failed to load. SDL Error: %s\n", SDL_GetError());
success = false;
}
return success;
}
void close()
{
}
int main(int argc, char* argv[])
{
SDL_Window* gWindow = NULL;
SDL_Surface* gWindowSurface = NULL;
SDL_Surface* gImageSurface = NULL;
if (!initialiseSDL(gWindow, gWindowSurface))
{
printf("Failed to initialise.\n");
}
else
{
if (!loadMedia(gImageSurface, "hw.bmp"))
{
printf("Failed to load inital media.");
}
else
{
//Apply the image
SDL_BlitSurface(gImageSurface, NULL, gWindowSurface, NULL);
//Update the surface
SDL_UpdateWindowSurface(gWindow);
//Wait two seconds
SDL_Delay(2000);
}
}
return 0;
}
Ваша программа экспонатов неопределенное поведение, потому что указатели внутри main
функция не инициализируется.
Когда вы передаете их initialiseSDL
функция, которую вы передаете им по значению, что означает, что они копируются, и функция работает только с копиями, а не с оригинальными указателями, которые все еще будут неинициализированы после вызова.
Вам нужно вместо этого передать указатели по ссылке:
bool initialiseSDL(SDL_Window*& gWindow, SDL_Surface*& gWindowSurface)
Вы, конечно, должны сделать то же самое с loadMedia
функция.