← 作品一覧

IMPLEMENTATION NOTES / C++ / SDL2

Color Wall Game

C++とSDL2で制作したシンプルなアクションゲーム。指示された色の壁へWASDで移動し、制限時間内に接触してスコアを稼ぐ。

C++SDL2SDL2_ttf

IMPLEMENTATION / EQUATIONS & SOURCE

入力から出力まで、コードで追う。

各節は「何を計算するか → 数式 → 実際のコード」の順に読めます。コードは動作する実装からの抜粋で、単独実行用ではありません。省略した周辺処理は参照元で確認できます。

01 / 壁までの移動を時間で補間する

キー入力で移動先の壁を決め、移動開始座標と開始時刻を保存します。移動中は経過時間をMOVE_DURATIONで割り、始点と終点を線形補間。壁へ到着した後に方向に対応する壁の色と指示色を比較します。一般的な円と矩形の物理衝突判定ではありません。

計算式
t = min(1, elapsed / MOVE_DURATION)
pos(t) = start + t(target−start)
src/Player.cpp : 69COMMIT 811457c
    Uint32 elapsed = currentTime - moveStartTime;
    float t = static_cast<float>(elapsed) / MOVE_DURATION;

    // 移動完了後は位置を固定
    if (t >= 1.0f) {
        t = 1.0f;
    }

    // 線形補間で位置を更新
    x = startX + t * (targetX - startX);
    y = startY + t * (targetY - startY);
該当箇所をGitHubで読む ↗

02 / 5回成功ごとの制限時間

成功するとスコアと成功回数を1増やし、成功回数が5の倍数なら次の制限時間を0.2秒減らします。MIN_MAX_TIMEを下回らないようにクランプし、残り時間を新しい制限時間に戻して次のラウンドへ進みます。

計算式
T(k) = max(Tmin, T₀ − 0.2 floor(k/5))

kは累積成功数。T₀とTminは設定値。プレイ中・移動中の残り時間は毎フレームdeltaTimeだけ減らします。

src/game.cpp : 352COMMIT 811457c
                if (successCount % 5 == 0) {
                    currentMaxTime -= 0.2f;
                    if (currentMaxTime < MIN_MAX_TIME) {
                        currentMaxTime = MIN_MAX_TIME;
                    }
                }
該当箇所をGitHubで読む ↗

SOURCE / SCOPE

実装の読み方。

各コード抜粋はリンク先の固定コミットから取得しています。数式は該当処理を説明するための表記です。性能や品質の数値は、掲載した計算例を除き新しい実測を行っていません。ビルド手順と依存環境は各リポジトリを参照してください。

リポジトリへ ↗