Java Basic ミニゲーム作成 〜Step3_1〜

  • ミニゲームの作成を行います。
    処理の概要としては、以下の通りです。( version0.1)
=====補足==========
<基本設計レベル>
[詳細設計レベル]
==================

<初期処理>
画面状態管理Obj
リソースの読み込み
[テキストで表示する絵を読み込み変数に保存]→テキストファイル

[新規で追加するファイルも読み込める様に工夫する]

<選択→決定処理>
ゲームタイトル画面の「スタート」「コンテニュー」の選択をする

以下の様に表示する

START:S
CONTINUE: C
<イントロダクションの表示処理> イントロダクションのテキストファイルを読み込み ストーリーの序章を表示して、ゲームを開始できる様な文章を表示する

この仕様で実装します。
1.画面状態管理Objの作成
シンプルにMap型のフィールド変数を作成します。
2.リソースの読み込み、単純にテキストファイルの読み込みです。
※今後はプロパティファイルなど読み込む予定です。(XMLもやるかも?)

※未実装です

  1. これもテキストファイルを読み込みゲームの序章を表示します。

今回は、ここまでを実装します。

土台にするのは以前の実装です。
クラス名はブログの都合上変えてあります。
そして「画面状態」は今回初登場の「Map」インターフェースを使用して管理します。

<<元にするソースについて>>

ゲームの基本的な処理フロー

初期化→ゲームループ→終了

上記のメソッドを実装してあります。

まとめると

  1. ゲームの起動準備
  2. 入力→画面の更新をループする
  3. ゲームの終了

上記の3つの処理の中で、ゲームを進行させていくと言うことです。が実装してみないとイメージがわかないと思います。※イメージが湧く人は頭のいい人です。

サンプルコードは一番上の「ミニゲーム」の部分にリンクしています。

コンソールゲームで初めのタイトルが表示される様なものです。初めはこれからストーリーをつけて。。。と考えていたのですが、ストーリーができず。。。保留状態です。。。

関連ページ一覧

Java Basic

  1. Java Basic Level 1 Hello Java
  2. Java Basic Level2 Arithmetic Calculate
  3. Java Basic Level3 About String class
  4. Java Basic Level 4Boolean
  5. Java Basic Level 5If Statement
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 Traning of If statement
  8. Java Basic Level8 How to use for statement
  9. Java Basic Level 8.5 Array
  10. Java Basic Level 9Training of for statement
  11. Java Basic Level 10 While statement 
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1
  17. Java Basic JUnit 〜テストスイートの作り方〜

 

Java Basic ミニゲーム作成 〜コンソールゲーム〜

イントロダクション

コマンドプロンプト(Windows), ターミナル(Mac, Linux)で文字ベースでのゲームを作成しようと試みました。結局ゲームの内容までは届きませんでしたが、入力〜出力までの一連の流れを実装しました。

つまり、ゲームのイメージがあればこのまま完成まで行けるのでは?

Introduction

I will create a text based game on terminal or command prompt. But I implemented only from Input to output.

I mean if you have idea then you can implement game?

 

実際に作ったもの

作成したJarファイルはこちらです。
コマンドプロンプトから起動してください。
Macの場合はターミナルです。
ダウンロードしたディレクトリに移動
> cd ダウンロードしたディレクトリ
>java -jar ./CmdRpg.jar
で起動することができます。
GitからプロジェクトをそのままPullしてきてもおっけ
プロジェクトのPull方法を参照してください。(LWJGLの場合です)

ゲームの処理概要としては以下の様になります。ソースはこちら

/**
 * ゲームを起動する </br>
 * 標準入力の受付、「bye」コマンドでAPを終了する</br>
 *
 * @param args プログラム引数
 */
public static void main(String[] args) {
   // 初期化処理
   init();
   try {
      // ゲーム起動(GameLoop開始)
     gameLoop();
   } catch(IOException ie) {
      ie.printStackTrace();
   }
   // リソースの解放
   terminated();
}

このクラスは、どんどん拡張(追加で実装)できる様に
筆者なりに考えて作成いたしました。
これを土台にするもしないも自由にやってもらって結構です。

一応、記載しておきます。余計であれば読み飛ばしてください。
【考え方】
1.起動するメインメソッド→ゲームを起動する部分だけを記述したい。

1.Execute main method → I would like to write olnly game execution.

2. メインメソッドから呼び出したい(処理の範囲を切り分け)
処理を「staticメソッド」で定義。
→処理を「初期化」「ゲームループ」「終了(リソース解放)」と
カテゴリ分けをする。

Static method is called by main method → separates implementation as “init”, “game loop”, “terminated”.

3.静的メソッド(メインメソッドを含む)とメンバメソッドを切り分ける→
staticが付いているものとそうでないものを使用方法のサンプルとして記述

Separates static and member method→as sample for use these.

staticはメインメソッドから直接呼べる

メンバメソッドはインスタンスを作ってからでないと呼べない。

 

フィールドとか、クラスなど、実際にはどの様に使うの?
って部分をソースの方に記載しています。
※わかりずらかったらゴメンなさい

private static void gameLoop() throws IOException{
   // mainメソッドと同様にクラスをnewする必要あり
   game = new RpgMain(); // コンストラクタで入力部品を生成
   /*
    *  <ゲームループ>
    *  1.入力
    *  2.データ更新、
    *  3.レンダリング(今回はコマンドなので文字出力)   
    *  4.「bye」コマンドでゲームを終了する
    */
    while(true) {
        String command = game.listenInput();
        // command変数がnullになる可能性があるため定数.equals()の形にする
        if(TERMINATE_GAME.equals(command)) {
             break;
        }
    System.out.println("コマンド入力値: " + command);
    }
}

ゲームを起動して、入力→「コマンド:入力値」を表示する
というシンプルなゲーム?です。
「bye」と入力するとゲーム終了となります。
ここで、コンストラクタを開設いたします。
コンストラクタ→newした時に起動する処理を定義する
メソッドの時と同じ様に引数を与えることができる。

詳細はおいおい理解していきましょう。

今回使用しているのは、
フィールド→staticのものとメンバフィールドがあります。
メソッド   →フィールドに同じ、newしてから使用するのが「メンバ」
メインメソッドから呼ばれているのがstaticです。

ソースに細かいコメントなどをつけております。
参考になればと思います。

カスタムするなら

上記のソース赤字の部分を修正してどの様に入力を受けて何を表示するか?

を自分で考えて作成するのも1つの方法です。

 


プラスαの一覧

JavaDoc

    1. Java Doc 読解〜System.out〜
    2. JavaDoc 読解 〜 Filesクラス 〜
    3. Java Doc読解 BufferedReader
    4. Java Doc 読解〜BufferedWriter〜
    5. Java Doc 読解 List 〜JavaDocList その1〜
    6.  Java Doc 読解 Map

Java Discord

  1. IntelliJ IDEA Discord Botを作る〜Gradle環境のセットアップ〜
  2. Java Discord セットアップ〜Hello Discord〜
  3.  Java Discord ピンポン〜Discordプログラム〜
  4. Java Discord Listener実装〜コマンドを好きなだけ追加しよう〜

JavaFX

  1. Java 初めてでも大丈夫〜ステップアッププログラミングのススメ〜
  2. ステップアッププログラミング〜Java FxでHelloWorld解説〜
  3. Java StepUpPrograming〜JavaFX で四則計算〜
  4. Java StepUpPrograming〜JavaFXで画面切り替えを作る1〜
  5. Java StepUpPrograming〜JavaFXで画面切り替え2ボタン作成〜
  6. Java StepUpPrograming〜JavaFXで画面切り替え3アクション〜
  7. Java StepUpPrograming〜JavaFXで画面切り替え4Pane切り替え〜
  8. Java StepUpPrograming〜JavaFXで画面切り替え5WebEngine〜

JUnit関連

  1. Java Basic JUnit 〜テストスイートの作り方〜

Git

  1. Java Git clone in Eclipse 〜サンプルの取得〜
  2. Eclipse Gitリポジトリの取得 GitからソースをPullしよう〜
  3. IntelliJ IDEA GitGitリポジトリからクローン〜

LWJGL Core dump〜エラーが出た時の対処〜

以下の様なエラーログが出た時
「A fatal error has been detected by the Java Runtime Environment:」
ulimit -c unlimitedのコマンドを打ってみてとエラーメッセージがあるので
Eclipseを起動する時にコマンドから実行する

【terminalより】
1. ulimit -c unlimitedを実行する
2. eclipseをコマンドより実行

これで改めて実行すれば実行できる

ただし、自分は他のエラーが出力された。。。



Java Game作成 〜ゲームの処理フロー〜



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-[スリープ処理を実装する]
}
}

関連ページ一覧

  1.  Chapter1[セットアップ〜外枠の表示のみ]
  2. Chapter2-1〜クラスの構成〜
  3. Chapter2-2〜インターフェースの使い方と詳細〜
  4. Chapter2-3〜GameEngineクラス(サンプルクラス)〜/li>
  5. Chapter2-4〜Windowクラス(サンプルクラス)〜
  6. Chapter3〜描画処理を読む〜
  7. Chapter4〜シェーダについて〜
  8. Chapter5-1〜レンダリングについて〜
  9. Chapter5-2〜レンダリング詳細〜
  10. Chapter6Projection(投影)
  11. Chapter7-1〜Cubeを作る〜
  12. Chapter7-2〜Texture〜

Java Basic

  1. Java Basic Level 1 Hello Java
  2. Java Basic Level2 Arithmetic Calculate
  3. Java Basic Level3 About String class
  4. Java Basic Level 4Boolean
  5. Java Basic Level 5If Statement
  6. Java Basic Summary from Level1 to 5
  7. Java Basic Level 6 Traning of If statement
  8. Java Basic Level8 How to use for statement
  9. Java Basic Level 8.5 Array
  10. Java Basic Level 8.5 Array
  11. Java Basic Level 10 While statement
  12. Java Basic Swing〜オブジェクト指向〜
  13. Java Basic Swing Level 2〜オブジェクト指向2
  14. サンプル実装〜コンソールゲーム〜
  15. Java Basic インターフェース・抽象クラスの作り方
  16. Java Basic クラスとは〜Step2_1

Java ゲーム作成 〜ハローLWJGL〜



参考サイト: LWJGL3

上記のサイトを参考に写経しました。ソースはここからダウンロードできます。
※参考サイトからコピペもできます。初めのrun()のみ抜粋
TODOコメントをつけておくとIDE(Eclipseなど)でタスクの一覧を取得して
「あ〜直しておかないとな....」と気がつくことができる

/**
*  初期化処理<BR>
* ※間はよくわからなかったので TODOコメントをつけております。
* エラー時のコールバックのデフォルト設定<BR>
* GLFWの終了処理設定と自由呼び出しのコールバック関数指定
*/
public void run() {
   System.out.println("LWJGJL Version = " + Version.getVersion());
   // 初期化処理
   init();
   // TODO-[よくわかりませんでした。]
   loop();
   // TODO-[よくわかりませんでした。]
   // Free the window callbacks and destroy the window
   glfwFreeCallbacks(window);
   glfwDestroyWindow(window);
   // Terminate GLFW and free the error callback
   glfwTerminate();
   glfwSetErrorCallback(null).free();
}

とりあえず、参考サイトから写経しました。
実行結果は以下の通りです。
 ←バージョン名を表示しています。

とりあえずで表示しただけなので「おお〜起動したよ」ということ
以外に何もありませんが、まぁここから戦いの始まりということです(笑)

<JavaDoc:クラス(メソッド)の使い方が書いてあります>
ここのURLから参照できます。

<Wiki: ここにポイントとか色々と書いてあります>
WikiのURLはこちら

<DEMO: デモンストレーション>
Gitからソースをダウンロードしてビルド、Jarファイルを作成して実行

<その他: 実装中に困ったときに助かります。>
Memory FAQBindings FAQTroubleshooting

参考にしたチュートリアル