開発環境: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=10
、y=50
、300*300 の領域に表示したい場合、次のように書くことができます。
// ターゲットボックスのパラメータ
struct SDL_Rect viewport = {10, 50, 300, 300};
// レンダラーはレンダリングするものです
SDL_RenderSetViewport(renderer, &viewport);
すると、レンダラーでレンダリングされたすべての要素がターゲットボックス内に表示されることに気づくでしょう。