快適なプレイを目指そう Javaコース上級 ミニゲーム開発編Day13「ゲームを快適にする機能を追加しよう」

デイトラJava
ハック
ハック

こんにちは、運営者のハックです!

Javaコース上級ミニゲーム開発編Day13の今回は前回と同じく、作成したミニゲームの内容をさらにブラシュアップさせたので、その内容を紹介します。

快適なプレイングができるような実装を目指そう

今回は前回と同じくミニゲームの内容をブラシュアップして、ゲームとして面白くなるような追加機能やミニゲームを快適にプレイできるように機能を追加していきます。
今回は主にゲームプレイを快適にできるように機能を追加しました。

ゲームプレイ時にメッセージが表示されるように追加しよう

現段階では、ゲームが終了した際に獲得スコアが表示されるようになっていますが、ゲームスタート時にも制限時間を知らせるメッセージが表示されるように追加しました。

実際のコードと実行結果

//OreMiningCommandクラス
public boolean onExecutePlayerCommand(Player player, Command command, String label, String[] args) {
        if (args.length == 1 && args[0].equals(LIST)) {
            sendPlayerList(player);
            return true;
        }

        if (args.length == 0 || "oremining".equalsIgnoreCase(args[0])) {
            ExecutingPlayer nowExecutingPlayer = getPlayerScore(player);
            InitStatus(player);

            int gameDuration = nowExecutingPlayer.getGameTime() / 60;
            player.sendTitle("鉱石採掘ゲームスタート!", "制限時間は" + gameDuration +
                    "分です。たくさん採掘しよう!", 10, 70, 20);
            gamePlay(player, nowExecutingPlayer);
            return true;
        }
        return false;
    }
ねこ奈
ねこ奈

何で「GAME_TIME」を60で割っているのにゃ?

モナ
モナ

ゲームの全体的な制限時間を秒単位で設定しているためです。

GAME_TIMEを300に設定することで、「5分」と表示するすることが可能となります。

「oremining」コマンドを入力すると画像のようなメッセージが表示され、制限時間を知らせることができるように実装しました。

モナ
モナ

時間の設定が難しかったです。

時間経過は別途「nowExecutingPlayer.setGameTime(nowExecutingPlayer.getGameTime() – 5); }, 0, 100);」というコードでカウントしているのですが、ここのコードで使用している「runTaskTimer」の第三引数はタスク間隔をticksで指定します。

Minecraftの1 tickは0.05秒なので、100 ticksは5秒に相当します。

つまり、このコードは「5秒ごとに残りゲーム時間を5秒減少させる」という機能になっているので、結果的にゲームのタイマーが正確にカウントダウンされます。

ねこ奈
ねこ奈

5秒ごとに残り時間を5秒減少させるから、ゲーム時間300秒を5秒ずつ減らしたらちょうど5分になるってことだにゃ。なんか回りくどいにゃあ。

残り時間が半分及び1分の時にメッセージが表示されるように実装

モナ
モナ

実際にプレイしていて、今どれくらい時間が経ったのかが気になったため、追加で残り時間が半分及び1分の時にメッセージが表示されるように実装しました。

実際のコードと実行結果

//OreMiningCommandクラス
private void gamePlay(Player player, ExecutingPlayer nowExecutingPlayer) {
        nowExecutingPlayer.setGameActive(true);
        nowExecutingPlayer.setGameTime(GAME_TIME);
…
       if (remainingTime == GAME_TIME / 2) {
                player.sendTitle("残り時間はあと半分!","",0,45,5);
            }

            if (remainingTime == 60) {
                player.sendTitle("残り時間はあと1分!","",0,45,5);
            }
ねこ奈
ねこ奈

確かに、残り時間が表示されたほうがプレイヤーには親切なのにゃ。

残り時間が半分及び1分の時にメッセージが表示されるように実装することができました。

ミニゲーム中は敵からダメージを受けず、空腹度も減らないように実装

ミニゲーム中は敵(モンスター)の攻撃からはダメージを受けず、空腹度も減少しないように実装します。

ねこ奈
ねこ奈

落下時やマグマダイブのダメージなどは受けるってことかにゃ?

それだったら、ゲーム中はモンスターを出現しないように実装すればいいんじゃないのかにゃ?

モナ
モナ

モンスターがいた方がゲームとしては面白くなると思ったので、ダメージは食らわないけど敢えて出現させることにしました。

あと、先輩方が出現しない方向で作成していたので、二番三番煎じを避けたかったのです…

ねこ奈
ねこ奈

(本音が漏れているのにゃ。)

実際のコードと実行結果

//OreMiningCommandクラス
//全てのコードを追加で作成した

//エンティティ(モンスター)から受けるダメージを0にするように実装
   @EventHandler
    public void onEntityDamage(EntityDamageEvent event) {
        if (event.getEntity() instanceof Player player) {
            ExecutingPlayer executingPlayer = findExecutingPlayer(player.getName());

            if (executingPlayer != null && executingPlayer.isGameActive() && (
                    event.getCause() == EntityDamageEvent.DamageCause.ENTITY_ATTACK ||
                    event.getCause() ==EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK))                    
         {
                event.setCancelled(true);
            }
        }
    }

//空腹度を減少させないように実装
    @EventHandler
    public void onFoodLevelChange(FoodLevelChangeEvent event) {
        if (event.getEntity() instanceof Player player) {
            ExecutingPlayer executingPlayer = findExecutingPlayer(player.getName());
            if (executingPlayer == null || !executingPlayer.isGameActive()) {
                return;
            }
            event.setCancelled(true);
        }
    }

//特定のプレイヤーの状態を取得
    private ExecutingPlayer findExecutingPlayer(String playerName) {
        return executingPlayerList.stream()
                .filter(p -> p.getPlayerName().equals(playerName))
                .findFirst()
                .orElse(null);
    }
ねこ奈
ねこ奈

DamageCauseで特定のダメージ減を指定できるなんて、ドンピシャすぎないかにゃ…

画像では分かりにくいのですが、スケルトンが放った矢を食らってもダメージを受けておらず、また、ミニゲーム中は空腹度が下がらないことも確認しました。

まとめ 追加したい機能は沢山あれど、上限がないため終了します

今回は主にプレイングを快適にする目的で機能を追加しました。今回で追加機能実装は終了します。

ハック
ハック

まだまだ追加したい機能や面白くできる機能は沢山ありますが、追加機能実装はやりだすと際限がないため、ここまでにします。

次回で提出前の準備を行い、卒業課題制作を終了とします。

以上で今回の学習記録を終えます。

ここまでご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました