ゲームを作りながら学ぶ Java実践①

マインクラフト ゲーム開発

  * 要件の中には、検証してみないとできるかわからない要件も含む

設計

機能要件

  • 体力や空腹ゲージは最大化されること
    • 前提条件を合わせるため

  • スコア(合計点数)ボードが表示できること
    • 画面上にバーンと出るようにする
    • スコアボードにするなど
  • 敵の種類はランダムであること
  • 時間制限を設定できること
  • 敵を倒すと点数が手に入ること
  • 敵の種類によって手に入る点数が異なること
    • ゲーム性を高めるため
    • ゲーム性をしてどうあるべきか
  • 一定のエリア内でしか敵は発生しないこと
    • エリア外で発生しても倒せない
  • 時間制限が来たらエリア内の敵は消滅すること
    • 終わったことをはっきりさせるため
  • 時間制限が来たら合計の点数が保存されること
    • できればデータベースなんかに保存して取り出せるようにしておきたい
  • 保存する情報はスコアとプレイヤー名と日時
  • 新しい情報が入った場合は上書きではなく、すべて保存すること
    • 追加されていく
  • 装備や武器はプレイするたびにおなじになること
    • 今の装備を取得して保存しといて、ゲームが始まったら指定の装備にして、終わったらもとの装備に戻す等)

非機能要件

  • コマンドでゲームを開始できる
    • コマンドでできる方が簡単だから
  • ゲーム中のエリア内のブロックは何があっても破壊されない
    • ゲームモードの変更をしなくてもプラグインで制御できればというもの
  • ゲーム中のオプションでプレイヤーの強さ、敵の種類をある程度コントロールできる
  • 敵の出現数が一定数を超えたときにゲームが重たくならないようにする。
    • マシンのスペックは人によって違うので考慮する
    • 敵の数を制御する
    • 超えたら前に出現したものから消える
  • プラグインを導入すればSpigotを使っていればどのサーバーでも導入できる
  • プログラムへの変更を加えずに、時間やスコアの項目などの設定値をある程度変更できる
    • お客さんはプログラムをいじることができない前提
    • プログラムをいじるのではなく、プログラム内の設定などのできることのモードを作っておく

機能要件

  • 体力や空腹ゲージは最大化されること
    • コマンドを実行したら、体力と空腹値に20を設定する
  • 敵を倒すと点数が手に入ること
    EntityのSpawnの仕組みを使って敵を出現させる
    Entityが倒れたときのイベントを使って、点数を設定する。

気をつけておべきこと

  • 優先順位をして(原則)、まず、やったことがないこと、リスクが高いこと((実装できるかわからないこと)から着手する
  • 納期が守らなければいけないときに不確定なことがあると納期を定めることができない
  • できないということがわかったときは報告してどうするかを相談する
  • プログラムの初期であれば、「すること」「してほしいこと」の調整は可能
  • お客さんに不安を覚えさせないためにもできることを進めでおくことも大切

実装

まずは新規プロジェクトを作る

プロジェクト名は「EnemyDown」に変更

Gloup IDは「plugin」のまま

Artifact IDは「EnemyDown」に変更

Plugin Nameは「EnemyDown」に変更

Main Classは「plugin.enemydown.Main」に変更

その後、保存先は、今までと同じ「java」を指定しておくほうが後々便利

そして、作成するをクリックしたあと、「新規ウィンドウで開く」

ここで、classがMainではなく「EnemyDown」になってしまっている違いが発生!!

原因判明

再度作り直してみると、プロジェクト名に「EnemyDown」を入れたときに、pluin Nameがエラーになっており、
そこを「EnemyDown」に打ち替えると、Main Classがまた「EnemyDownになてしまっているので、再度、
「Main」に変更して作成すると「Main」classが作成できた。

次に進んで

    @Override
    public void onDisable() {
        // Plugin shutdown logic
    }

は消去

そして、今まで使っていたプロジェクトから

Bukkit.getPluginManager().registerEvents(this, this);

をコピペで(敵が倒れたときというイベントがあるため、これがいる

package plugin.enemydown;

import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin {

    @Override
    public void onEnable() {
        // Plugin startup logic

    }

    @Override
    public void onDisable() {
        Bukkit.getPluginManager().registerEvents(this, this);
    }
}

こうする

そして

implements Listener

を追加して

package plugin.enemydown;

import java.net.http.WebSocket.Listener;
import java.util.ListIterator;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {
        // Plugin startup logic

    }

    @Override
    public void onDisable() {
        Bukkit.getPluginManager().registerEvents(this, this);
    }

とする

ここで何も動いていない状態で

右のウィンドウの「Gradle」の上の方にあるフォルダのような物を押し「Gradle タスクの実行」をクリックし、検索窓に出てきたものに「jar」を追加し、出てきたものの一番上をクリックしてエンター

すると、自分の名前のファイル内にある「EnemyDown」のフォルダーの中の「Build」の中の「Libs」の中に「jar」が作成される

そして、Minecraftフォルダーの中の「plugins」の中に生成できたものをいれて、ターミナルでサーバーを起動
(ちなみに紛らわしいため、以前入れていたプロジェクトの「jar」は削除じました)

すると、画像と同じ表示が出ました。

そして

しかし、ここでIntelliJ IDEAにエラーがでました。

エラー内容を見てみると、指示されたところにファイルがありません的なことが書いてある!!

そういえば!!

今までのプログラムフォルダではなく、違うフォルダに入っていたので移したのでした。
それで、指示したフォルダにないとなっていました。

原因としては、最初にプログラムを作るときに保存フォルダーをいつものところにしなかったせいなので、もう一回作り直して、いつもフォルダに保存先を指定して作成すると

エラーが無くなり、再度、動画のようなターミナル画面となりました。

これで次に行けるようになりました。

つぎに。

getCommand("allSetLevel").setExecutor(new AllSetLevelCommand());

の部分を前のプログラムからコピーしてきて、ペースト

package plugin.enemydown;

import java.net.http.WebSocket.Listener;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin implements Listener, org.bukkit.event.Listener {

    @Override
    public void onEnable() {
        Bukkit.getPluginManager().registerEvents(this, this);
        getCommand("allSetLevel").setExecutor(new AllSetLevelCommand());
    }
}

となりましたが、「allSetLevel」とかは、今回ないので、変更していきます。

「allSetLevel」を「enemyDown」(基本的にこれは任意の名前)に変更

ここを変えたことにより、「plugin.yml」にコマンドを追加する必要があるので、今入力しているプログラムの
「plugin.yml」の中に

commands:
  enemyDown:

を入力

そして、右側の「AllSetLevelCommand」の部分も「enemyDownCommand」に変更。

ここで、今変えた部分はエラーとなっている(classがないと言われている)ので、ここでは、違う階層のフォルダに保存するために、まず、Mainの上のフォルダに階層を作るために、そのフォルダを右クリックし、「新規」→「パッケージ」で、出てきたものに「command」を追加してエンター

すると階層フォルダができる。

そして、エラーが出ている部分にカーソルをあてて、クラスを作成で「.command」を追記して作成

すると自動的にクラスを作成してくれる。

そして、そのクラスの中のエラーが出ている部分にカーソルをあててメソッドを作る
(そのまま出てきたものを「ok」)

そして、もとのプログラムの「command」ファイルから

    if(sender instanceof Player player){

    }

をコピーしてきてペースト

ここでは、色々と一気にやることはせず、一つ一つする。
一気にすると何が悪かったのかわかりにくくなる

次に

 player.setHealth(20);
     player.setFoodLevel(20);

を入力し「EnemyDownCommand.java」を

package plugin.enemydown.command;

import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

public class EnemyDownCommand implements CommandExecutor {

  @Override
  public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
    if(sender instanceof Player player){
     player.setHealth(20);
     player.setFoodLevel(20);
    }
      return false;
  }
}

このようにする。

そして、検証するためにここで「EnemyDown[jar]」の実行をする。

クリエイティブモードだった場合は、ゲーム内のコマンドに「/gamemode survival」で変更する。

そして、「life」と「food」をへらして、コマンドに「enemydown」入力すると

成功!!

フォルターを分けたのは単一ファイルの原則による

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次