LWJGLのチュートリアル: ゲーム処理の流れについて
LWJGLでのゲームプログラム処理フローについてまとめます。
参考にしたサイトは上記のリンクより観れます。
全体として実行する処理は2種類に分かれていました。
・ゲームを起動する準備と終了処理(ループしない)
・ゲーム中の無限ループ処理(ループする)
処理の概要
1. メインメソッド→ゲーム(処理)の起動
2. リソース読み込み
※ゲームに必要なプログラムやイメージファイル、3Dモデルなど)
3. ゲームの終了処理
4. ゲームループ処理(ゲームをプレーしている時の処理)
4-1. 入力に対する処理
4-2. データなどの更新処理
4-3. 画面のレンダリング
4-4. プログラムのスピードが早いのでスピートの調節処理
5. ゲームの終了処理
ソース実行: 前提としてLWJGLのセットアップが完了していること
上の画像は実行結果です。処理フローを流しただけのプログラムになります。
LWJGLは何も使用しておりません。
メインメソッドを起動して処理の概要を順番に標準出力へと出力しています。
ちゃんと実装するのは各メソッドの中にTODOコメントを記載しています。
TODOコメントは今後実装する部分、FIXMEは不適切な処理が実装してあるので
それを修正する必要がある部分です。
/** * チュートリアル1 * ゲームのプログラム的な動きを理解する * * @author takunoji * @see https://github.com/SilverTiger/lwjgl3-tutorial/wiki/Game-loops */ public class GameFlow_1 { /** * 起動フラグ * 起動中はTRUE * 終了するときに FALSE */ privatebooleanrunning = false; /** * チュートリアル1を起動する * 「LWJGLの基本的な処理フロー」 * 1. init(): 初期化処理、ウィンドウの作成〜リソースの読み込み * 2. gameLoop(): 入力→データなどの更新→画面のレンダリング * 3. dispose(): ゲームで使用した全てのリソースを解放する * @param args プログラム引数 */ public static void main(String[] args) { System.out.println("1: メインメソッド起動"); GameFlow_1 flow = new GameFlow_1(); // ゲームのスタート flow.startGame(); } /** * ゲームの開始処理 */ public void startGame() { System.out.println("2: ゲームを開始します"); init(); gameLoop(); dispose(); } //////////////////////////////////////////// // <<ゲームの外枠の処理>> // 1. 初期化 // 2. ゲームのループ処理 // 3. 終了処理 //////////////////////////////////////////// /** * 初期化処理、以下の処理を行う * 1. ウィンドウの作成 * 2. リソースの読み込み */ public void init() { System.out.println("3: ゲームを初期化します"); // ゲームを起動するので起動フラグをTRUEにする running = true; // TODO-[初期化処理を実装する] } /** * 終了処理 */ public void dispose() { // TODO-[ゲームで使用したリソース全てを解放する(終了処理)] } /** * ゲーム起動中の処理 * ゲーム起動中は無限ループしている中で * * 以下の処理を繰り返す * 1. 入力を受ける * 2. データなどの更新 * 3. 画面を更新する */ public void gameLoop() { System.out.println("4: ゲームループを開始します"); long sleepTime = 1000L / 60L; // ゲーム起動中は無限ループする // FIXME-[ここは修正する必要があるときに使用する] // 起動した後にFALSEに戻す処理がないので止まらなくなる while(running) { input(); update(); render(); // プログラムはものすごいスピートで // 処理をしているので処理休憩する時間を作る sleep(sleepTime); // FIXME-[間違って実行したとき用] running = false; System.out.println("9: ゲームループをぬけます"); } } //////////////////////////////////////////// // <<ゲームのループ処理>> // 1. 入力を受け対応する処理を行う // 2. データなどの更新処理 // 3. 画面のレンダリング処理 // 4. 処理を少し止める(スピートの調節) //////////////////////////////////////////// /** * 入力に対する処理 */ public void input() { System.out.println("5: 入力処理を実行します"); // TODO-[入力に対応する処理を実装] } /** * データなどの更新処理 */ public void update() { System.out.println("6: ゲームデータなどの更新処理を行います"); // TODO-[更新の処理を実装する] } /** * 画面のレンダリング処理 */ public void render() { System.out.println("7: ゲーム画面をレンダリングします"); // TODO-[画面のレンダリングの実装] } /** * 16ミリ秒の固定スリープ時間があるため、ゲームは毎秒62.5回更新されます。 * ※サイトより引用 * @param time */ publicvoid sleep(long time) { System.out.println("8: 処理が早すぎるのでスリープします"); // TODO-[スリープ処理を実装する] } }
関連ページ一覧
- Chapter1[セットアップ〜外枠の表示のみ]
- Chapter2-1〜クラスの構成〜
- Chapter2-2〜インターフェースの使い方と詳細〜
- Chapter2-3〜GameEngineクラス(サンプルクラス)〜/li>
- Chapter2-4〜Windowクラス(サンプルクラス)〜
- Chapter3〜描画処理を読む〜
- Chapter4〜シェーダについて〜
- Chapter5-1〜レンダリングについて〜
- Chapter5-2〜レンダリング詳細〜
- Chapter6〜Projection(投影)〜
- Chapter7-1〜Cubeを作る〜
- Chapter7-2〜Texture〜
Java Basic
- Java Basic Level 1 〜Hello Java〜
- Java Basic Level2 〜Arithmetic Calculate〜
- Java Basic Level3 〜About String class〜
- Java Basic Level 4〜Boolean〜
- Java Basic Level 5〜If Statement〜
- Java Basic Summary from Level1 to 5
- Java Basic Level 6 〜Traning of If statement〜
- Java Basic Level8 〜How to use for statement〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 8.5 〜Array〜
- Java Basic Level 10 〜While statement 〜
- Java Basic Swing〜オブジェクト指向〜
- Java Basic Swing Level 2〜オブジェクト指向2〜
- サンプル実装〜コンソールゲーム〜
- Java Basic インターフェース・抽象クラスの作り方
- Java Basic クラスとは〜Step2_1〜