如何使用C#在SDL中实现文本渲染?求代码示例
C# 基于SDL实现文本渲染的代码示例
首先确保你的项目已通过NuGet安装SDL2-CS和SDL2_ttf-CS包,它们是SDL及SDL_ttf的官方C#绑定。
以下是完整的文本渲染实现代码:
using System; using SDL2; using SDL2.TTF; class SdlTextRenderer { static void Main(string[] args) { // 初始化SDL视频子系统 if (SDL.SDL_Init(SDL.SDL_INIT_VIDEO) < 0) { Console.WriteLine($"SDL初始化失败: {SDL.SDL_GetError()}"); return; } // 初始化SDL_ttf if (TTF.TTF_Init() == -1) { Console.WriteLine($"SDL_ttf初始化失败: {TTF.TTF_GetError()}"); SDL.SDL_Quit(); return; } // 创建窗口 IntPtr window = SDL.SDL_CreateWindow( "SDL文本渲染示例", SDL.SDL_WINDOWPOS_CENTERED, SDL.SDL_WINDOWPOS_CENTERED, 800, 600, SDL.SDL_WindowFlags.SDL_WINDOW_SHOWN ); if (window == IntPtr.Zero) { Console.WriteLine($"窗口创建失败: {SDL.SDL_GetError()}"); TTF.TTF_Quit(); SDL.SDL_Quit(); return; } // 创建渲染器 IntPtr renderer = SDL.SDL_CreateRenderer(window, -1, SDL.SDL_RendererFlags.SDL_RENDERER_ACCELERATED | SDL.SDL_RendererFlags.SDL_RENDERER_PRESENTVSYNC); if (renderer == IntPtr.Zero) { Console.WriteLine($"渲染器创建失败: {SDL.SDL_GetError()}"); SDL.SDL_DestroyWindow(window); TTF.TTF_Quit(); SDL.SDL_Quit(); return; } // 加载字体(替换为你的字体文件路径,比如"arial.ttf") IntPtr font = TTF.TTF_OpenFont("arial.ttf", 24); if (font == IntPtr.Zero) { Console.WriteLine($"字体加载失败: {TTF.TTF_GetError()}"); SDL.SDL_DestroyRenderer(renderer); SDL.SDL_DestroyWindow(window); TTF.TTF_Quit(); SDL.SDL_Quit(); return; } // 设置文本颜色(RGBA) SDL.SDL_Color textColor = new SDL.SDL_Color { r = 255, g = 255, b = 255, a = 255 }; // 渲染文本到表面(Solid模式:无抗锯齿,速度快;若需要抗锯齿用TTF_RenderText_Blended) IntPtr textSurface = TTF.TTF_RenderText_Solid(font, "Hello SDL Text in C#!", textColor); if (textSurface == IntPtr.Zero) { Console.WriteLine($"文本渲染失败: {TTF.TTF_GetError()}"); TTF.TTF_CloseFont(font); SDL.SDL_DestroyRenderer(renderer); SDL.SDL_DestroyWindow(window); TTF.TTF_Quit(); SDL.SDL_Quit(); return; } // 将表面转换为纹理(渲染器可直接绘制) IntPtr textTexture = SDL.SDL_CreateTextureFromSurface(renderer, textSurface); if (textTexture == IntPtr.Zero) { Console.WriteLine($"纹理创建失败: {SDL.SDL_GetError()}"); SDL.SDL_FreeSurface(textSurface); TTF.TTF_CloseFont(font); SDL.SDL_DestroyRenderer(renderer); SDL.SDL_DestroyWindow(window); TTF.TTF_Quit(); SDL.SDL_Quit(); return; } // 获取文本纹理的尺寸 SDL.SDL_QueryTexture(textTexture, out _, out _, out int textWidth, out int textHeight); // 设置文本绘制的位置(居中显示) SDL.SDL_Rect textRect = new SDL.SDL_Rect { x = (800 - textWidth) / 2, y = (600 - textHeight) / 2, w = textWidth, h = textHeight }; bool running = true; SDL.SDL_Event e; while (running) { // 处理事件 while (SDL.SDL_PollEvent(out e) != 0) { if (e.type == SDL.SDL_EventType.SDL_QUIT) { running = false; } } // 清空渲染器(黑色背景) SDL.SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL.SDL_RenderClear(renderer); // 将文本纹理复制到渲染器 SDL.SDL_RenderCopy(renderer, textTexture, IntPtr.Zero, ref textRect); // 呈现渲染内容到窗口 SDL.SDL_RenderPresent(renderer); } // 清理资源 SDL.SDL_DestroyTexture(textTexture); SDL.SDL_FreeSurface(textSurface); TTF.TTF_CloseFont(font); SDL.SDL_DestroyRenderer(renderer); SDL.SDL_DestroyWindow(window); TTF.TTF_Quit(); SDL.SDL_Quit(); } }
关键说明
- 字体加载:
TTF_OpenFont需要传入字体文件路径和字号,确保字体文件存在于项目输出目录中。 - 文本渲染模式:
TTF_RenderText_Solid:生成无抗锯齿的文本表面,性能高但边缘粗糙。TTF_RenderText_Blended:生成带抗锯齿的文本表面,视觉效果更好但性能稍低。
- 纹理转换:SDL渲染器仅能直接绘制纹理,因此需要将文本表面转换为纹理后再绘制。
- 资源清理:所有创建的SDL/TTF资源都需要在程序退出前手动销毁,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Farid-ur-Rahman
相关产品推荐
相关产品推荐

