開発環境: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)
# 実行可能ファイルを移動して、リソース(ttf/image)が見つからない問題を防ぐ
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 秒間に表示されるフレーム数を表すために使用されます。-- ウィキペディア
したがって、実装は非常に簡単です。このフレームの開始時の時間を知るために、プログラムのメインループの開始時に値を設定するだけです。SDL2 は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);
レンダラーでレンダリングされたすべてのものがターゲットボックス内に移動することに気付くでしょう。