使用 SDL2 在屏幕上获取图像

Getting an image on screen with SDL2

我一直在尝试在屏幕上显示位图图像,但我一直想不通为什么它不能显示它。这是代码:

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

bool init(SDL_Window *window, SDL_Surface *surface) {
    bool success {true};

    if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0) {
        std::cout << "Could not initialize video: " << SDL_GetError() << "\n";
        success = false;
    }

    window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);

    if (window == NULL) {
        std::cout << "Could not create window: " << SDL_GetError() << "\n";
        success = false;
    }

    surface = SDL_GetWindowSurface(window);

    return success;
}

bool loadMedia(SDL_Surface *image) {
    bool success {true};

    image = SDL_LoadBMP("C:\Users\Admin\Documents\Files\Programming\C++\game\Untitled.bmp");

    if (image == NULL) {
        std::cout << "Could not load image: " << SDL_GetError() << "\n";
        success = false;
    }

    return success;
}

void close(SDL_Window *window, SDL_Surface *surface, SDL_Surface *image) {
    SDL_FreeSurface(surface);
    surface = nullptr;
    SDL_FreeSurface(image);
    image = nullptr;

    SDL_DestroyWindow(window);
    window = nullptr;

    SDL_Quit();
}

int main(int argc, char *argv[]) {
    bool quit {false};
    SDL_Event event;
    SDL_Window *window {nullptr};
    SDL_Surface *surface {nullptr};
    SDL_Surface *image {nullptr};

    if (!init(window, surface)) {
        std::cout << "Initialization failed\n";
        return 1;
    }

    if (!loadMedia(image)) {
        std::cout << "Loading media failed\n";
        return 1;
    }

    SDL_BlitSurface(image, NULL, surface, NULL);
    SDL_UpdateWindowSurface(window);

    while (!quit) {
        SDL_WaitEvent(&event);

        switch (event.type) {
        case SDL_QUIT:
            quit = true;
            break;
        default: break;
        }
    }

    close(window, surface, image);

    return 0;
}

文件结构如下:

-game/
  -image.bmp
  -main.cpp
  -main.exe
  -Makefile

Makefile 是这样的:

all : main.cpp
    g++ main.cpp -IC:\SDL2\include\SDL2 -LC:\SDL2\lib -w -lmingw32 -lSDL2main -lSDL2 -o main

SDL 版本 2.0.14 64 位

mingw 64 位

Windows 10 个 64 位

我什至不知道还需要多少信息。

我尝试过使用事件,不使用事件,使用绝对路径,使变量成为全局变量,不同的文件格式,尝试使用渲染器和纹理来显示它,将所有内容都放在 main 中,使图像相同屏幕大小,根据此处其他线程的答案建议使用 ImageMagick convert,使用 -Wl,-subsystem,windows 编译器标志禁用控制台 window,但我没有做任何工作.有什么帮助吗?

您正在将参数传递给 init() - 但该函数接收到这些内容的 copy。然后更改传递给函数的副本,使它们指向其他地方——但这不会改变原始指针指向的位置。然后当你 return 到 main() 你使用仍然指向空的原始指针。

这样写也是一样的:

void f(int x) {
    x=2; // change the copy of x passed to this function
}

int main() {
    int x=1;
    f(x);
    printf("%d\n",x); // prints the original value: 1
}

当你应该做的是将指针传递给你想要改变的东西,然后在函数内部改变参数的内容:

void f(int *x) {
    *x=2; // change the contents of the pointer: the original x
}

int main() {
    int x=1;
    f(&x); // pass a pointer to x
    printf("%d\n",x); // prints the changed value: 2
}

所以,在你的情况下,你需要做的是传递指向你想要改变的东西的指针(一个指向 window 的指针和一个指向表面的指针)然后在 init() 内部改变参数内容:

bool init(SDL_Window **window, SDL_Surface **surface) {
    // ...
    *window = SDL_CreateWindow("SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
    // ...
    *surface = SDL_GetWindowSurface(window);
    // ...
}

int main(int argc, char *argv[]) {
    // ...
    SDL_Window *window {nullptr};
    SDL_Surface *surface {nullptr};
    // ...
    if (!init(&window, &surface)) {
        std::cout << "Initialization failed\n";
        return 1;
    }
    // ...
}