SDL_LoadBMP () отображает черную поверхность, когда на нее ссылаются

c++ sdl

92 просмотра

1 ответ

Попытка загрузить изображение на SDL_Surface. Однако поверхность всегда черная, хотя bmp явно нет.

НОТА

Это рабочее SDL_Window, и создание указателя поверхности прошло успешно, но неудачной является загрузка файла «Kassadin.bmp», который находится в папке проекта Code :: Blocks. Он отображает черную поверхность.

ВСЕ ответы на этот конкретный вопрос НЕ решили эту проблему, прежде чем пометить ее как дубликат.

  #include <iostream>
  #include <SDL.h>
  #include <stdio.h>

  using namespace std;

  const int SCREEN_WIDTH = 700;
  const int SCREEN_HEIGHT = SCREEN_WIDTH / 12 * 9;

  //Create an SDL_Window pointer
  SDL_Window* window = NULL;

  //Create an SDL_Surface pointer
  SDL_Surface* surface = NULL;

  //SDL_Surface for an image
  SDL_Surface* imgSurface = NULL;

  bool init(){
  //try init SDL
  if(SDL_Init(SDL_INIT_VIDEO) < 0){
    cout << "Failed init SDL" << endl;
    return false;
  }else{

    //create window           title            x pos                    y  pos                    width         height         flags
    //This doesnt include a surface ie it will be a plain window
    window = SDL_CreateWindow("An SDL Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);

}

if(window == NULL){
    cout << "Failed creating SDL window" << endl;
    return false;
}else{
    // creates surface with an SDL_Window object
    surface = SDL_GetWindowSurface(window);
}
return true;
}

bool loadMedia(){
imgSurface = SDL_LoadBMP("Kassadin.bmp");

return true;
}

void close(){
//Sets the SDL_Window pointer to NULL again
SDL_DestroyWindow(window);

window = NULL;

SDL_FreeSurface (imgSurface);
imgSurface = NULL;

//quits
SDL_Quit();
}

int main(int argc, char* argv[]){

if(!init()){
    cout << "error init sdl" << endl;
}else{

    if(!loadMedia){
        cout << "Trouble loading media..." << endl;
    }else{

        SDL_BlitSurface(imgSurface, NULL, surface, NULL);

    }

}

//This is so it's not just a static window ie it can update
SDL_UpdateWindowSurface(window);

SDL_Delay(5000);

close();

return 0;
}
Автор: felix9801 Источник Размещён: 08.11.2019 11:22

Ответы (1)


0 плюса

Проблемная линия

if(!loadMedia){

Это не вызов функции. Он проверяет, что адрес функции loadMediaравен NULL, что всегда ложно, поскольку адрес функции назначается компоновщиком (в отличие от указателей функций, которые вы назначаете вручную во время выполнения).

Как вы упомянули кодовые блоки, я предполагаю, что вы используете gcc для компиляции вашего кода. Если бы вы только добавили хотя бы -Wallфлаг (это очень хорошая практика), компилятор предупредил бы вас, что вы делаете что-то, что очень похоже на ошибку:

test2.cpp:70:9: warning: the address of ‘bool loadMedia()’ will always evaluate as ‘true’ [-Waddress]
Автор: keltar Размещён: 21.08.2016 10:46
Вопросы из категории :
32x32