Ubuntu 中的 C 和 SDL 未按预期工作
C and SDL in Ubuntu not working as intended
我正在关注 Youtube 上的一个教程,但是当我尝试时它没有按预期工作。
代码如下:
#include <stdio.h>
#include <SDL2/SDL.h>
void start(SDL_Window* window, SDL_Renderer* renderer)
{
SDL_Init(SDL_INIT_EVERYTHING);
window = SDL_CreateWindow("Hello", 200, 200, 200, 200, 0);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_Rect rect = {220, 140, 200, 200};
SDL_RenderFillRect(renderer, &rect);
}
void stop(SDL_Window* window, SDL_Renderer* renderer)
{
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
}
int main(int argc, char **argv)
{
SDL_Window* window;
SDL_Renderer* renderer;
start(window, renderer);
SDL_Delay(5000);
stop(window, renderer);
return 0;
}
应该在 window 的中间创建一个白色矩形并用蓝色填充其余部分,但是当我 运行 它时不会发生这种情况。相反,它 "captures a picture" 它下面的程序,例如背景。为什么会这样,我该如何解决?
您有两个问题需要解决。首先,您需要修改您的 start()
函数以获取指向指针的指针,而不仅仅是指针,以便可以修改 main()
中的 window
和 renderer
变量... 否则,start()
中的 window
和 renderer
将有效,但 main()
中相应的指针变量将不会更改并保持未初始化状态。所以...
/* Use 'SDL_Window**' and 'SDL_Renderer**' instead of 'SDL_Window*' and
* 'SDL_Renderer*', and dereference once during use (eg. '*window'
* instead of 'window' */
void start(SDL_Window** window, SDL_Renderer** renderer)
{
SDL_Init(SDL_INIT_EVERYTHING);
*window = SDL_CreateWindow("Hello", 200, 200, 200, 200, 0);
*renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(*renderer, 0, 0, 255, 255);
SDL_RenderClear(*renderer);
SDL_SetRenderDrawColor(*renderer, 255, 255, 255, 255);
SDL_Rect rect = {220, 140, 200, 200};
SDL_RenderFillRect(*renderer, &rect);
}
然后在main()
中使用:
start(&window, &renderer); /* pass addresses, not values */
第二个问题是您需要在完成绘图操作后更新屏幕。您可以在 SDL_RenderPresent()
时执行此操作
完成绘图,例如在调用 start()
函数后立即在 main()
中:
...
start(&window, &renderer);
SDL_RenderPresent(renderer); /* add this */
SDL_Delay(5000);
...
您可能还想更改 SDL_Rect
中的值,这样它就不会绘制在 window 之外。
我正在关注 Youtube 上的一个教程,但是当我尝试时它没有按预期工作。
代码如下:
#include <stdio.h>
#include <SDL2/SDL.h>
void start(SDL_Window* window, SDL_Renderer* renderer)
{
SDL_Init(SDL_INIT_EVERYTHING);
window = SDL_CreateWindow("Hello", 200, 200, 200, 200, 0);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_Rect rect = {220, 140, 200, 200};
SDL_RenderFillRect(renderer, &rect);
}
void stop(SDL_Window* window, SDL_Renderer* renderer)
{
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
}
int main(int argc, char **argv)
{
SDL_Window* window;
SDL_Renderer* renderer;
start(window, renderer);
SDL_Delay(5000);
stop(window, renderer);
return 0;
}
应该在 window 的中间创建一个白色矩形并用蓝色填充其余部分,但是当我 运行 它时不会发生这种情况。相反,它 "captures a picture" 它下面的程序,例如背景。为什么会这样,我该如何解决?
您有两个问题需要解决。首先,您需要修改您的 start()
函数以获取指向指针的指针,而不仅仅是指针,以便可以修改 main()
中的 window
和 renderer
变量... 否则,start()
中的 window
和 renderer
将有效,但 main()
中相应的指针变量将不会更改并保持未初始化状态。所以...
/* Use 'SDL_Window**' and 'SDL_Renderer**' instead of 'SDL_Window*' and
* 'SDL_Renderer*', and dereference once during use (eg. '*window'
* instead of 'window' */
void start(SDL_Window** window, SDL_Renderer** renderer)
{
SDL_Init(SDL_INIT_EVERYTHING);
*window = SDL_CreateWindow("Hello", 200, 200, 200, 200, 0);
*renderer = SDL_CreateRenderer(*window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(*renderer, 0, 0, 255, 255);
SDL_RenderClear(*renderer);
SDL_SetRenderDrawColor(*renderer, 255, 255, 255, 255);
SDL_Rect rect = {220, 140, 200, 200};
SDL_RenderFillRect(*renderer, &rect);
}
然后在main()
中使用:
start(&window, &renderer); /* pass addresses, not values */
第二个问题是您需要在完成绘图操作后更新屏幕。您可以在 SDL_RenderPresent()
时执行此操作
完成绘图,例如在调用 start()
函数后立即在 main()
中:
...
start(&window, &renderer);
SDL_RenderPresent(renderer); /* add this */
SDL_Delay(5000);
...
您可能还想更改 SDL_Rect
中的值,这样它就不会绘制在 window 之外。