You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 06:55:17