SDL_LoadBMP()在引用表面时显示黑色表面

SDL_LoadBMP() displaying a black surface while surface is referenced

本文关键字:表面 显示 黑色 引用 LoadBMP SDL      更新时间:2023-10-16

尝试将图像加载到SDL_Surface上。然而,表面总是黑色的,虽然bmp显然不是。

注意

这是一个工作的SDL_Window,创建一个表面指针是成功的,不成功的是加载位于Code::Blocks项目文件夹中的"Kassadin.bmp"。它的表面是黑色的。

这个问题的所有答案都没有解决这个问题,在此之前将其标记为重复。

  #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;
}

问题行

if(!loadMedia){

它不是一个函数调用。它所做的是检查函数loadMedia的地址是否为NULL,这总是为false,因为函数地址是由链接器分配的(而不是在运行时手动分配的函数指针)。

正如您提到的代码块,我认为您使用gcc来编译代码。如果你至少添加了-Wall标志(这是一个很好的做法),编译器就会警告你,你正在做的事情看起来很像一个错误:

test2.cpp:70:9: warning: the address of ‘bool loadMedia()’ will always evaluate as ‘true’ [-Waddress]