【问题标题】:C and SDL in Ubuntu not working as intendedUbuntu 中的 C 和 SDL 未按预期工作
【发布时间】:2015-02-22 18:28:39
【问题描述】:

我正在关注 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;
}

它应该在窗口中间创建一个白色矩形并用蓝色填充其余部分,但是当我运行它时不会发生这种情况。相反,它会“捕获”其下程序的图片,例如背景。为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 尝试添加SDL_RenderPresent(renderer);更新屏幕。
  • 我应该把它放在哪里?

标签: c ubuntu sdl sdl-2


【解决方案1】:

您有两个问题需要解决。首先,您需要修改start() 函数以获取指向指针的指针,而不仅仅是指针,以便可以修改main() 中的window 和renderer 变量......否则,window start() 中的 renderer 和 start() 将有效,但 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 中的值,使其不会绘制到窗口外。

【讨论】:

  • 我是新手,所以不要对我太苛刻。指针不应该通过引用传递,这意味着它的值可以从另一个函数中更改吗?为什么我必须使用指向指针的指针?
  • @ErikW 传递一个指针可以让你修改它指向的东西.. 但在这种情况下,由于你要修改的东西 是 一个指针,你需要一个 指向指针的指针.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多