こんにちは、運営者のハックです!
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で特定のダメージ減を指定できるなんて、ドンピシャすぎないかにゃ…
画像では分かりにくいのですが、スケルトンが放った矢を食らってもダメージを受けておらず、また、ミニゲーム中は空腹度が下がらないことも確認しました。
まとめ 追加したい機能は沢山あれど、上限がないため終了します
今回は主にプレイングを快適にする目的で機能を追加しました。今回で追加機能実装は終了します。
まだまだ追加したい機能や面白くできる機能は沢山ありますが、追加機能実装はやりだすと際限がないため、ここまでにします。
次回で提出前の準備を行い、卒業課題制作を終了とします。
以上で今回の学習記録を終えます。
ここまでご覧いただきありがとうございました。
コメント