邱 璇洛 (ゝ∀・)

邱 璇洛 (ゝ∀・)

你好哇(*゚∀゚*)~这里是邱璇洛的博客,常常用来记录一些技术文章和小日常~(σ゚∀゚)σ
twitter
tg_channel

SDL2学習ノート - テキストの描画、フレームレートの検出、および表示領域

開発環境:MacOS
参考リンク:陳雲先生の SDL2 チュートリアル
注:学習ノート

テキストの描画#

テキストの描画には、フォントライブラリが必要です。私のおすすめは源ノ角ゴシックまたは Bilibili の大佬oooooohmygoshのチームが作った得意体です。どちらもオープンソースで無料です。
また、SDL2_imageライブラリをダウンロードする必要があります。

brew を使用してダウンロードするbrew install sdl2_image

そして、brew info sdl2_imageで場所を確認します。

最後に、CMake を設定します。

cmake_minimum_required(VERSION 3.23.2)
project(DrewText C)

set(CMAKE_C_STANDARD 11)

# SDL2
set(SDL_DIR /usr/local/Cellar/sdl2/2.26.0)
include_directories(${SDL_DIR}/include/SDL2)
link_directories(${SDL_DIR}/lib/)
# SDL2_image
set(SDL2_image /usr/local/Cellar/sdl2_image/2.6.2)
include_directories(${SDL2_image}/include/)
link_directories(${SDL2_image}/lib/)
# SDL2_ttf
set(SDL2_ttf /usr/local/Cellar/sdl2_ttf/2.20.1)
include_directories(${SDL2_ttf}/include/)
link_directories(${SDL2_ttf}/lib/)

link_libraries(SDL2)
link_libraries(SDL2_image)
link_libraries(SDL2_ttf)

# 実行ファイルを移動してリソースが見つからない問題を防ぐ
set(EXECUTABLE_OUTPUT_PATH ../)
add_executable(DrewText main.c)

まず、mainでフォントを開きます。

/* フォントを開く */
font = TTF_OpenFont("フォントファイルのパス", FONT_SIZE);
if (font==NULL) {
    SDL_Log("Can not open font");
}

忘れずに解放することも忘れないでください。

...
/* フォントを解放する */
TTF_CloseFont(font);
...

次に、draw関数を作成してテキストをレンダリングします。

void draw(SDL_Surface * screen, SDL_Window * win) {
    // テキストのレンダリング
    /* フォントの色 */
    SDL_Color color = {225, 0, 0, 255}; // RGBA
    /* テキストをレンダリング */
    SDL_Surface * text = TTF_RenderUTF8_Blended(font, "東雪蓮、本当に好きだよ", color); // フォント、内容、フォント(前景)の色
    /* メイン画面に表示 */
    // 矩形のパラメータ
    SDL_Rect text_src = {0, 0, text->w, text->h};
    // レンダリング先
    SDL_BlitSurface(text, &text_src, screen, &text_src);

    // メイン画面を更新
    SDL_UpdateWindowSurface(win);
}

それから実行するだけです。

フレームレートについて#

まず、フレームレートとは何でしょうか?

フレームレート(英語:frame rate)は、表示されるフレーム数を測定するための指標です。測定単位は「フレーム毎秒」(frame per second、FPS)または「ヘルツ」で、一般的にはビデオ、電子グラフィックス、またはゲームの 1 秒間に表示されるフレーム数を表すために使用されます。 - ウィキペディア

したがって、実装は非常に簡単です。プログラムのメインループが開始されるときに、開始時の時間を知るためにSDL_GetTicks()関数を使用できます。

/* フレームレート:ミリ秒値を取得 */
long begin = SDL_GetTicks();

そして、終了時の時間から開始時の時間を引きます。

/* フレームレート:現在の値 */
long current = SDL_GetTicks();
/* 現在のフレームにかかった時間 */
long cost = current - begin;

フレームレートを固定することもできます。フレームレートを一定の値に保つために、フレームごとにかかる時間を計算します。

// フレームレートを設定
#define FRAMERATE 60
...
/* 1フレームあたりの時間 */
long frame = 1000/FRAMERATE;

/* フレームレートを維持するために休眠する時間を計算 */
long delay = frame - cost;
/* delayが負の場合はフレームレートを維持するために休眠しない */
if (delay > 0) {
    SDL_Delay(delay);
}
/* システムリソースが十分な場合、十分なフレームレートを維持できますが、不十分な場合は仕方ありません */

可視領域について#

可視領域を設定すると、すべての要素が条件付きで表示されるように制限できます。
例えば、すべての要素をx=10y=50、300*300 の領域に表示したい場合、次のように書くことができます。

// ターゲットボックスのパラメータ
struct SDL_Rect viewport = {10, 50, 300, 300};
// レンダラーはレンダリングするものです
SDL_RenderSetViewport(renderer, &viewport);

すると、レンダラーでレンダリングされたすべての要素がターゲットボックス内に表示されることに気づくでしょう。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。