【问题标题】:How do I draw multiple rects to the screen in SDL2?如何在 SDL2 中将多个矩形绘制到屏幕上?
【发布时间】:2022-01-20 18:34:18
【问题描述】:

我尝试先使用SDL_RenderFillRect()SDL_RenderFillRects() 来实现它,但是它不起作用,我决定研究使用表面,如SDL_FillRect() 中所述的文档中所述,它还需要一个表面,所以我相信绘制多个的关键是使用表面。但是,我发现文档很难理解(我什至不知道从哪里开始查找)。谁能给我一个纲要?

编辑:我认为我遇到了这个问题,因为我认为SDL_Rect(s) 被读写,结果它是只读的。现在还是不知道怎么办

顺便说一句,我正在用 c 编码。

编辑:这是我尝试过的

我没有具体的代码,因为它不起作用,但是我的想法存在根本缺陷,因为我的思维过程是:

  1. 制作一个 SDL_Rect 数组。
  2. 制作一个矩形并将其附加到此数组中。
  3. 渲染它。
  4. 对不同颜色的数组执行此操作。

我相信这行不通。我首先听说你需要制作纹理或其他东西。我还不确定你能告诉我如何使用 SDL_Textures。

【问题讨论】:

  • 您能否提供一个minimal reproducible example 来演示您如何尝试绘制多个矩形?
  • 我不经常使用 SDL:但是在绘图时,您通常会构建图像,然后将图像“blit”到屏幕上。这意味着您需要将所有矩形绘制到缓冲区或表面,然后一次显示所有结果。
  • @DavidC.Rankin Not with SDL_RenderFillRect 它只是绘制一个填充了当前渲染绘制颜色的矩形。不过,我可能会更多地阅读您所说的内容。绘制完所有想要的矩形后,您确实需要调用 SDL_RenderPresent 来显示框架。
  • @RetiredNinja 你去我给你编辑了
  • 您可以制作一个不起作用的代码示例,我们可以帮助您修复它。这是一个非常简单的 API。在每个帧中,在绘制矩形之前调用SDL_RenderClear,之后调用SDL_RenderPresent。在两者之间调用SDL_SetRenderDrawColor 设置颜色,设置SDL_Rect 结构中的值,然后调用SDL_RenderFillRect(renderer, &rectangle); 以获得所需的多个不同矩形。

标签: c sdl sdl-2


【解决方案1】:

我不确定你的目标到底是什么,但这里有一个简单的示例,演示了使用 SDL_RenderFillRect 绘制 5 个不同颜色的矩形和 SDL_RenderFillRects 绘制 5 个相同颜色的矩形。

希望你可以混合搭配其中的一些来获得你想要的东西。

#include "SDL.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *args[])
{
    SDL_Window *win;
    SDL_Renderer *renderer;

    if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
    {
        fprintf(stderr, "SDL_Init Error: %s\n", SDL_GetError());
        return EXIT_FAILURE;
    }

    win = SDL_CreateWindow("Hello World!", 100, 100, 400, 400, SDL_WINDOW_SHOWN);
    if (win == NULL)
    {
        fprintf(stderr, "SDL_CreateWindow Error: %s\n", SDL_GetError());
        return EXIT_FAILURE;
    }

    renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (renderer == NULL)
    {
        fprintf(stderr, "SDL_CreateRenderer Error: %s\n", SDL_GetError());
        SDL_DestroyWindow(win);
        SDL_Quit();
        return EXIT_FAILURE;
    }

    SDL_RenderClear(renderer);

    SDL_Rect single_rect;
    SDL_Rect multi_rect[5];
    for (int i = 0; i < 5; i++)
    {
        single_rect.w = 50;
        single_rect.h = 50;
        single_rect.x = i * 50;
        single_rect.y = i * 50;
        SDL_SetRenderDrawColor(renderer, 255, (Uint8)(i * 50), 0, 255);
        SDL_RenderFillRect(renderer, &single_rect);

        multi_rect[i].w = 50;
        multi_rect[i].h = 50;
        multi_rect[i].x = i * 50 + 50;
        multi_rect[i].y = i * 50;
    }
    SDL_SetRenderDrawColor(renderer, 0, 255, 255, 255);
    SDL_RenderFillRects(renderer, multi_rect, 5);

    SDL_RenderPresent(renderer);
    SDL_Delay(5000);

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(win);
    SDL_Quit();

    return EXIT_SUCCESS;
}

【讨论】:

  • 每个矩形的绘制调用? Madness! :) (在 b4 “但一些渲染器后端批处理!”)
  • @genpfault 是的,这似乎是一种简单的方法,可以在屏幕上放置一些你一旦发现替代品就永远不会使用的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多