使用 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;
}
// ...
}
我一直在尝试在屏幕上显示位图图像,但我一直想不通为什么它不能显示它。这是代码:
#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;
}
// ...
}