この課題は、42Tokyo本科Common Core(基礎課程)のlevel4に位置するペア課題です。
基本的な3Dレンダリング技術、レイキャスティングの原理を学ぶためにシンプルな3DゲームエンジンをC言語で作成します。
また、この課題の制作過程は別のリポジトリにあります。
このプログラムの使用方法は以下の通りです。
- コンパイル方法
- ターミナル上でリポジトリのルートディレクトリに移動し、make コマンドを実行してください。
- 正しくコンパイルされると、実行ファイル(例: cub3D)が生成されます。
- 実行方法
- コンパイル後、生成された実行ファイルを実行します。
- マップファイル(例: map.cub)をコマンドライン引数として渡すことで、指定したマップを読み込んでゲームが開始されます。
- 例: ./cub3D map.cub
- 操作方法
- 移動: キーボードのWASDキーまたは矢印キーを使用して前進、後退、左右の移動が可能です。
- 視点変更: マウス操作またはキーボードの左右キーでカメラの視点を変更できます。
- 終了: ESCキーを押すとゲームが終了します。
このプロジェクトで実装した主な機能は以下の通りです。
- マップパーシング
- テキストファイル形式のマップデータを読み込み、2次元配列に変換。
- 壁やオブジェクトの配置、開始位置の情報などを解析しています。
- レイキャスティング
- プレイヤーの視点から複数のレイを飛ばし、壁との交差判定を行うことで3D空間を再現。
- 各レイの衝突位置に応じた距離計算を行い、遠近感を表現しています。
- テクスチャマッピング
- 壁や床に対して適切なテクスチャ画像を貼り付けることで、リアルな描写を実現。
- マップデータに基づいたテクスチャの選択と描画を行います。
- イベントハンドリング
- キーボードやマウス入力の処理を実装し、プレイヤーの移動や視点変更をリアルタイムに反映。
- 各入力に対して適切な関数を呼び出す設計となっています。
- 衝突判定
- プレイヤーが壁や障害物に近づきすぎた際に移動を制限することで、ゲーム内での不正な移動を防止。
- 衝突時の挙動をスムーズに処理する工夫を施しています。
42Tokyoの課題では、「Norminette」と呼ばれるコーディング規約があります。
それに準拠する形で記載しなければなりません。
それに加えて、各課題ごとに使用できる関数が決められており、指定されている関数以外は使用することができません。
その上で、for文の使用が禁止されていたり1つの関数につき25行までの記述制限がされていたりとかなり厳しいものになっており、それらに対応するためにコードをどのようにリファクタリングするかを常に考えました。
非常に頭を悩ませましたが、結果として的確に、短く無駄のないコードを記述する実装力が身についたと感じております。
このプロジェクトを通して得た学びは以下の通りです。
- コーディング規約の徹底
- Norminetteをはじめとする厳格なコーディング規約に従い、可読性と保守性の高いコードを書く重要性を学びました。
- 効率的なアルゴリズム設計
- レイキャスティングの実装を通じ、数学的なアプローチと最適化手法の理解を深めました。
- コードのリファクタリング
- 制限された行数や使用可能な関数の中で、いかにシンプルで無駄のないコードを書くかを試行錯誤し、実装力が向上しました。
- チームでの協力
- ペアプログラミングを通して、コミュニケーションの大切さや分担作業の進め方を学びました。
- デバッグとテストの重要性
- エラーチェックやテストケースの作成により、プログラムの安定性を高める手法を身につけました。
本プロジェクトの全体構成は、以下のポイントに注意して設計されています。
- モジュールの分割
- マップパーシング、レンダリング、イベント処理、衝突判定など、各機能を明確なモジュールに分割することで、コードの再利用性と管理のしやすさを実現しました。
- シンプルで直感的な設計
- 複雑な3D計算や描画処理をシンプルな構造に落とし込み、初心者でも理解しやすいコード構造を目指しました。
- エラーハンドリングと安定性
- 入力ファイルの不備やメモリ割り当て失敗など、各種エラーケースに対する堅牢な処理を実装し、プログラムの安定性を確保しました。
- パフォーマンスの最適化
- レイキャスティング処理の高速化や描画の最適化を意識し、リアルタイムでのゲームプレイを実現できるよう工夫しました。
- hurabe (Parser(構文解析)、一人称視点計算処理、データ構造設計)
- rkitao (描画演算処理、衝突判定)
- 2025/01/19~2025/03/04 (44日間 / 約1.5ヶ月)