SDL2:显示文字

(一)环境搭建:

ubuntu:

sudo apt install libsdl2-dev
# 以下是拓展
sudo apt install libsdl2-image-dev # 用于显示png、jpg等格式的图片
sudo apt install libsdl2-mixer-dev # 一种简单的多声道混音器
sudo apt install libsdl2-ttf-dev # 用于显示文字
sudo apt install libsdl2-gfx-dev # SDL图形绘制图元和其他支持功能 作者:开源者

(二)编译

SDL2编译:
pkg-config --cflags --libs sdl2
g++ -Wall test.cpp -o test -I /usr/include/SDL2 -lSDL2 -lSDL2_image

 

例子:

#include <iostream>

/*因SDL2是C语言开发,所以这里需要加入C语言声明*/
extern "C"
{
#include "SDL.h"
#include "SDL_ttf.h"
}

/*因为SDL2内部存在main函数,则需要将其去掉。否则编译失败!*/
#undef main

const int SCREEN_WIDTH = 680;
const int SCREEN_HEIGHT = 240;

int main(int, char**)
{
    // 初始化SDL
    if (SDL_Init(SDL_INIT_VIDEO) != 0) { return -1; }
    
    // 初始化TTF
    if (TTF_Init() != 0) { return -1; }

    // 创建SDL窗口
    SDL_Window *sdlWindow = SDL_CreateWindow("SDL_ttf", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
    if (!sdlWindow) { return -1; }

    // 创建渲染器
    SDL_Renderer *sdlRender = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (!sdlRender) { return -1; }

    // 打开字体库
    TTF_Font *ttfFont = TTF_OpenFont("./simhei.ttf", 64);
    if (!ttfFont) { return false; }
    
    // 创建一个32位的ARGB表面,并渲染给定的文本在高质量,使用alpha混合来使给定颜色的字体抖动。
    SDL_Surface *sdlSurface = TTF_RenderText_Blended(ttfFont, "TTF fonts are cool!", SDL_Color{ 255, 255, 255, 255 });
    if (!sdlSurface) { TTF_CloseFont(ttfFont); return -1; }
    
    // 创建纹理
    SDL_Texture *sdlTexture = SDL_CreateTextureFromSurface(sdlRender, sdlSurface);
    if (!sdlTexture) { TTF_CloseFont(ttfFont); return -1; }

    // 文字纹理居中
    SDL_Rect sdlRect;
    SDL_QueryTexture(sdlTexture, NULL, NULL, &sdlRect.w, &sdlRect.h);
    sdlRect.x = SCREEN_WIDTH  / 2 - sdlRect.w / 2;
    sdlRect.y = SCREEN_HEIGHT / 2 - sdlRect.h / 2;

    SDL_Event sdlEvent;
    bool quit = false;
    while (!quit)
    {
        while (SDL_PollEvent(&sdlEvent)) { if (sdlEvent.type == SDL_QUIT) { quit = true; break; } }

        // 刷新三部曲
        SDL_RenderClear(sdlRender);
        SDL_RenderCopy(sdlRender, sdlTexture, nullptr, &sdlRect);
        SDL_RenderPresent(sdlRender);

        SDL_Delay(1);
    }

    if (ttfFont)    { TTF_CloseFont(ttfFont); }            ttfFont        = nullptr;
    if (sdlSurface)    { SDL_FreeSurface(sdlSurface); }    sdlSurface    = nullptr;
    if (sdlTexture) { SDL_DestroyTexture(sdlTexture); }    sdlTexture    = nullptr;
    if (sdlRender)  { SDL_DestroyRenderer(sdlRender); }    sdlRender    = nullptr;
    if (sdlWindow)  { SDL_DestroyWindow(sdlWindow); }    sdlWindow    = nullptr;

    TTF_Quit();
    SDL_Quit();

    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值