gpt4 book ai didi

c - 使用 SDL2 绘制矩形

转载 作者:太空狗 更新时间:2023-10-29 16:36:42 26 4
gpt4 key购买 nike

我刚开始使用 SDL2,但我已经遇到了问题。我想创建一个窗口并将其涂成红色。但它仍然是白色的,我不明白为什么。

代码如下:

int main (int argc, char** argv) {
SDL_Window* pWindow = NULL;
pWindow = SDL_CreateWindow("Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_SHOWN);

SDL_Surface* pSurface = NULL;
pSurface = SDL_GetWindowSurface(pWindow);
SDL_FillRect(pSurface, NULL, SDL_MapRGB(pSurface->format, 255, 0, 0));

while(1);

SDL_FreeSurface(pSurface);
SDL_DestroyWindow(pWindow);
SDL_Quit();
return EXIT_SUCCESS;
}

最佳答案

您的代码有几个问题,我会尽力解决其中的大部分问题。

初始化SDL

SDLSDL2 需要先初始化,然后才能使用。初始化SDL的方法是下面的函数。

int SDL_Init(Uint32 flags)

其中 flags 对于不同的子系统可以是不同的值。使用 SDL_INIT_EVERYTHING 来初始化所有内容。

int SDL_Init(SDL_INIT_EVERYTHING)

阅读更多相关信息 here. .


初始化SDL_WindowSDL_Renderer

SDL_RendererSDL_Window 需要先设置,然后才能使用。您已经正确地创建了窗口,所以我不会介绍它。以下是设置 SDL_Renderer

的方法
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window,
int index,
Uint32 flags)

index 定义要使用的驱动程序。将其设置为 -1 以使用支持其他参数的第一个驱动程序。
flags 用于优化渲染、软件渲染、防止 vsync 等。将其设置为 SDL_RENDERER_ACCELERATED

阅读有关 SDL_CreateRenderer 的更多信息 here .

混合 SDLSDL2

SDL_Surface 主要用于 SDL,而不是 SDL2SDL2_imageSDL2_ttf 等仍然使用SDL_Surface,但它们在使用之前被转换为SDL_Texture

SDL_FillRect(...); 也主要是一个 SDL 东西。但是如上所述,可以使用SDL_Surface,但您需要先将其转换为SDL_Texture:

SDL_Texture* SDL_CreateTextureFromSurface(SDL_Renderer* renderer,
SDL_Surface* surface)

阅读更多 here .

并使用

int SDL_RenderCopy(SDL_Renderer*   renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect)

要渲染它,请阅读更多 here .

无限循环(while(1);)

你真的不应该这样做,它只会永远循环。使用 SDL_Delay( 5000 ); 暂停 5000 毫秒或 5 秒。

更简单的方法

你可以使用

int SDL_RenderDrawRect(SDL_Renderer*   renderer,
const SDL_Rect* rect)

绘制一个矩形。

你应该使用

int SDL_SetRenderDrawColor(SDL_Renderer* renderer,
Uint8 r,
Uint8 g,
Uint8 b,
Uint8 a)

要设置你正在绘制的颜色,使用

int SDL_RenderClear(SDL_Renderer* renderer)

之后调用 SDL_RenderDrawRect()

到目前为止,一切都是在“幕后”绘制的。要将其呈现到屏幕上,请使用

void SDL_RenderPresent(SDL_Renderer* renderer)

例子

#include <SDL2/SDL.h>

int main (int argc, char** argv)
{
SDL_Window* window = NULL;
window = SDL_CreateWindow
(
"Jeu de la vie", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_SHOWN
);

// Setup renderer
SDL_Renderer* renderer = NULL;
renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED);

// Set render color to red ( background will be rendered in this color )
SDL_SetRenderDrawColor( renderer, 255, 0, 0, 255 );

// Clear winow
SDL_RenderClear( renderer );

// Creat a rect at pos ( 50, 50 ) that's 50 pixels wide and 50 pixels high.
SDL_Rect r;
r.x = 50;
r.y = 50;
r.w = 50;
r.h = 50;

// Set render color to blue ( rect will be rendered in this color )
SDL_SetRenderDrawColor( renderer, 0, 0, 255, 255 );

// Render rect
SDL_RenderFillRect( renderer, &r );

// Render the rect to the screen
SDL_RenderPresent(renderer);

// Wait for 5 sec
SDL_Delay( 5000 );

SDL_DestroyWindow(window);
SDL_Quit();

return EXIT_SUCCESS;
}

结果

Rendered result


您可以在我的 blog. 上阅读更多关于 SDL2 的信息

关于c - 使用 SDL2 绘制矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21890627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com