SDL基础使用02(加载bmp图片、纹理和渲染)

 1. 加载bmp图片到SDL窗口

  •     1. 初始化SDL                                         SDL_Init
  •     2. 创建窗口                                             SDL_CreateWindow                
  •     3. 获取窗口表面                                      SDL_GetWindowSurface    
  •     4. 加载bmp图片到surface                       SDL_LoadBMP
  •     5. 将图片surface设置到窗口surface上    SDL_BlitSurface
  •     6. 更新窗口surface显示                           SDL_UpdateWindowSurface
  •     7. 释放资源,退出SDL                    SDL_FreeSurface  SDL_DestroyWindow  SDL_Quit
#include <iostream>
/* 加载bmp图片
*	1. SDL默认只能加载bmp图片
*/
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.lib")


#undef main
int main03()
{
	// 1. 初始化SDL
	int nRet = SDL_Init(SDL_INIT_EVERYTHING);
	if (nRet < 0)
	{
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 2. 创建窗口
	SDL_Window* pWnd = SDL_CreateWindow("BMP SHOW",
		SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
		640, 480,
		SDL_WINDOW_SHOWN);
	if (NULL == pWnd)
	{
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 3. 获取窗口表面 
	SDL_Surface* pWndSurface = SDL_GetWindowSurface(pWnd);
	if (NULL == pWndSurface)
	{
		SDL_DestroyWindow(pWnd);
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 4. 加载bmp图片
	SDL_Surface* pBmpSurface = SDL_LoadBMP("./Panda.bmp");

	// 5. 将图片的surface设置到窗口的surface上
	SDL_BlitSurface(pBmpSurface, NULL, pWndSurface, NULL);

	// 6. 更新窗口surface显示
	SDL_UpdateWindowSurface(pWnd);

	SDL_Delay(3000);

	// 7. 释放资源
	if (pBmpSurface)
	{
		SDL_FreeSurface(pBmpSurface);
	}
	if (pWnd)
	{
		SDL_DestroyWindow(pWnd);
	}

	// 8. 退出SDL
	SDL_Quit();

	return 0;
}

2. 纹理和渲染的简单使用

    1. 初始化SDL                SDL_Init
    2. 创建窗口                SDL_CreateWindow
    3. 基于窗口创建渲染器    SDL_CreateRenderer
    4. 基于渲染器创建纹理    SDL_CreateTexture
    5. 绘制三部曲
        5.1 清空渲染器上一次的显示        SDL_RenderClear
        /// 一些绘制操作     SDL_SetRenderDrawColor SDL_RenderFillRect  SDL_RenderDrawRect 
        5.2 拷贝纹理数据到渲染器            SDL_RenderCopy
        5.3 更新渲染器显示                SDL_RenderPresent
    6. 释放资源,退出        SDL_DestroyTexture  SDL_DestroyRenderer SDL_DestroyWindow                SDL_Quit

#include <iostream>
/* 纹理和渲染(方块跳动) */
extern "C"
{
#include <SDL.h>
}

#pragma comment(lib, "SDL2.lib")

#undef main
int main()
{
	// 1. 初始化
	int nRet = SDL_Init(SDL_INIT_EVERYTHING);
	if (nRet < 0)
	{
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 2. 创建窗口
	SDL_Window* pWnd = SDL_CreateWindow("Title",
		SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
		640, 480,
		SDL_WINDOW_SHOWN);
	if (NULL == pWnd)
	{
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 3. 创建渲染器
	SDL_Renderer* pRenderer = SDL_CreateRenderer(pWnd, -1, 0);
	if (NULL == pRenderer)
	{
		SDL_DestroyWindow(pWnd);
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	// 4. 创建纹理
	SDL_Texture*  pTexture = SDL_CreateTexture(pRenderer,						// 渲染器
											   SDL_PIXELFORMAT_RGBA8888,		// 渲染数据格式(YUV RGB)
											   SDL_TEXTUREACCESS_TARGET,		// 纹理类型 static、stream、target
											   640, 480);						// 纹理宽高
	if (NULL == pTexture)
	{
		SDL_DestroyRenderer(pRenderer);
		SDL_DestroyWindow(pWnd);
		std::cout << "SDL Error: " << SDL_GetError() << std::endl;
		return -1;
	}

	SDL_Event event;
	SDL_Rect  rect;
	rect.w = 50, rect.h = 50;
	while (true)
	{
		SDL_PollEvent(&event);			// 获取事件
		if (event.type == SDL_QUIT)
			break;
		rect.x = rand() % 640;			// 随机方块的位置
		rect.y = rand() % 480;

		SDL_SetRenderTarget(pRenderer, pTexture);					// 设置渲染器目标(此时绘制目标为整个纹理)
		SDL_SetRenderDrawColor(pRenderer, 0xFF, 0x00, 0x00, 0x00);	// 设置渲染器绘制颜色(背景颜色)(不设置,下一次循环渲染器绘制颜色为下面设置的颜色)
		SDL_RenderClear(pRenderer);									// 刷新渲染器(将渲染器上次渲染清空)

		SDL_SetRenderDrawColor(pRenderer, 0x00, 0xFF, 0x00, 0x00);	// 设置渲染器绘制颜色
		SDL_RenderDrawRect(pRenderer, &rect);						// 绘制矩形
		SDL_RenderFillRect(pRenderer, &rect);						// 绘制填充矩形
																	
		// 渲染三部曲:1. 清空上一次的显示	2. 拷贝纹理数据到渲染器		3. 更新渲染器显示 
		SDL_SetRenderTarget(pRenderer, NULL);						// 清除一下渲染器的目标
		SDL_RenderCopy(pRenderer, pTexture, NULL, NULL);			// 拷贝纹理绘制信息到渲染器
		SDL_RenderPresent(pRenderer);								// 更新渲染器
		SDL_Delay(500);
	}

	// 释放纹理
	if (pTexture)
	{
		SDL_DestroyTexture(pTexture);
	}
	// 释放渲染
	if (pRenderer)
	{
		SDL_DestroyRenderer(pRenderer);
	}
	// 释放窗口
	if (pWnd)
	{
		SDL_DestroyWindow(pWnd);
	}
	
	SDL_Quit();

	return 0;
}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在Linux平台上使用SDL将字符串生成固定分辨率的BMP,可以参考以下示例程序: ```c #include <SDL2/SDL.h> #include <SDL2/SDL_ttf.h> #include <stdio.h> #define WIDTH 640 #define HEIGHT 480 #define FONT_SIZE 24 int main(int argc, char* argv[]) { SDL_Window* window = NULL; SDL_Surface* surface = NULL; SDL_Renderer* renderer = NULL; TTF_Font* font = NULL; SDL_Color color = {255, 255, 255, 255}; SDL_Rect rect = {0, 0, WIDTH, HEIGHT}; SDL_Event event; char* text = "Hello, world!"; char* filename = "output.bmp"; SDL_Init(SDL_INIT_VIDEO); TTF_Init(); window = SDL_CreateWindow("SDL BMP Test", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN); renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED); font = TTF_OpenFont("arial.ttf", FONT_SIZE); if (!font) { printf("TTF_OpenFont error: %s\n", TTF_GetError()); return 1; } surface = TTF_RenderText_Solid(font, text, color); if (!surface) { printf("TTF_RenderText_Solid error: %s\n", TTF_GetError()); return 1; } SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface); SDL_RenderCopy(renderer, texture, NULL, &rect); SDL_SaveBMP(surface, filename); SDL_DestroyTexture(texture); SDL_FreeSurface(surface); TTF_CloseFont(font); SDL_DestroyRenderer(renderer); SDL_DestroyWindow(window); TTF_Quit(); SDL_Quit(); return 0; } ``` 在这个示例程序中,我们使用SDLSDL_ttf库加载Arial字体并渲染“Hello, world!”文本。然后,我们创建一个与窗口分辨率相同的矩形,并使用SDL_RenderCopy函数将渲染好的字体纹理复制到渲染器上。最后,我们使用SDL_SaveBMP函数将渲染器上的内容保存为BMP格式的文件。 注意,在使用SDL_SaveBMP函数保存文件时,需要传入指向SDL_Surface结构体的指针,而不是SDL_Texture结构体的指针。因此,我们需要先将渲染好的纹理复制到一个表面上,然后再保存表面为BMP文件。 另外,如果要生成其他分辨率的BMP文件,可以修改rect结构体的值来指定矩形大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石小浪♪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值