プレイ画面に常駐するGUIを作りたいのですが、、

Modding・サーバPlugin制作・ツール制作など、開発関連の質問があればこちらにお願い致します。
フォーラムルール
質問関連フォーラムで質問する時は、必ず次のトピックを一読/厳守お願い致します。
viewtopic.php?f=5&t=999
  • (PostNo.315446)

プレイ画面に常駐するGUIを作りたいのですが、、

投稿記事by ashimof » 2018年4月03日(火) 22:11

環境
Minecraft 1.12.2
eclipse

やりたいこと:
map系modのように、GUI(?)をプレイ画面に常駐させたい

やったこと
YouTubeの動画を漁りました。
アイテムの追加やレシピの追加に関してはわかりましたが、GUIに関してはどうすればいいのか皆目見当もつかない状況です。
クライアントサイドだけのmodと言うことはわかります。
本当に困っているので教えてください。お願いします。

一応雛形だけは書けたので。。。
コード: 全て選択
package com.shitsumon.shitsumonMod;

import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

@Mod(modid = ShitsumonMod.MODID, name = ShitsumonMod.NAME, version = ShitsumonMod.VERSION)
public class ShitsumonMod {
    public static final String MODID = "shitsumonmod";
    public static final String NAME = "Shitsumon Mod";
    public static final String VERSION = "1.0";
   
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
       
    }
   
    @EventHandler
    public void Init(FMLInitializationEvent event) {
       
    }
   
    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
       
    }
}
アバター
ashimof
ID:97d5b044
水から上がったとこ
 
記事: 2
登録日時: 2018年4月03日(火) 22:01

  • (PostNo.315449)

Re: プレイ画面に常駐するGUIを作りたいのですが、、

投稿記事by kegare » 2018年4月04日(水) 06:43

あなたの仰る通り、描画だけであれば、クライアントサイドで完結させることも可能です。
ひとまずどのような方法でプレイ画面と一緒に描画させるかを示します。

クライアントのゲーム画面の描画イベント、RenderGameOverlayEvent#Postイベントを使用します。
Forge イベントシステムの使い方については、以下のページを参考にしてください。

Minecraft Forge Eventシステム概要 - Minecraft Modding Wiki

コード: 全て選択
@SubscribeEvent
public void onRenderGamePostOverlay(RenderGameOverlayEvent.Post event)
{
    // ホットバーの描画のタイミングで描画します。
    if (event.getType() != ElementType.HOTBAR)
    {
        return;
    }

    // 画面のサイズを取得できます。ここから計算し、最適な位置に描画しましょう。
    ScaledResolution resolution = event.getResolution();
}


肝心の描画部分については、具体的にどのようなインターフェースを描画したいかによりますので、もしわからなければ、より詳しい内容を提示してみてください。
アバター
kegare
ID:830946fb
レッドスト―ン掘り
 
記事: 699
登録日時: 2012年10月27日(土) 06:06

  • (PostNo.315492)

Re: プレイ画面に常駐するGUIを作りたいのですが、、

投稿記事by ashimof » 2018年4月05日(木) 04:49

kegareさん、返信ありがとうございます!
いただいたコードのおかげで、少し進展させることができました。
また、自分でもコードを追加したため、GUI描画以前のところで質問が生まれました。
この返信では先にそちらについて質問させていただこうと思います!よろしくおねがいします!

また、質問の意図を明確にするため、作りたいmodに関する詳細を書かせていただきます。
具体的に何を作りたいか:
某バトルロワイヤルゲーム(PU◯G)で存在する、マルチのプレイヤーの位置を画面に表示させてくれるマーカーを作りたいです。
プレイヤーが画面外にいても、画面の端っこに常駐して大まかな位置を教えてくれるあれです。

それを見越して必要なもの:
    自分の位置情報
    他プレイヤーの位置情報
    自分の向いている方向
    マーカー

質問1:
マーカーなのですが、GUIを自作するのではなく、画像を作って貼り付けて、それを動かすと言うことは可能でしょうか。

質問2:
提示していただいたコードと、自分の位置を表示するコード、自分の左右の頭の振り加減を表示するコードを追加しました。
また、プロキシも作りました。
ただ、マルチプレイヤーの位置の取得方法と、自分の上下の頭の振り加減を取得する方法がわかりません。
どうすればいいでしょうか。

以下コードです!(javaを書くのは初めてのため、クラス名等の命名が下手なのはお許しください)

メインクラスです
PlayerMarker.java
コード: 全て選択
package com.s3pt3mb3r.playerMarker;

import com.s3pt3mb3r.playerMarker.proxy.CommonProxy;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

@Mod(modid = PlayerMarker.MODID, name = PlayerMarker.NAME, version = PlayerMarker.VERSION)
public class PlayerMarker {
   public static final String MODID = "playermarker";
    public static final String NAME = "Player Marker";
    public static final String VERSION = "1.0";
    public static final String CLIENT_PROXY_CLASS = "com.s3pt3mb3r.playerMarker.proxy.ClientProxy";
    public static final String SERVER_PROXY_CLASS = "com.s3pt3mb3r.playerMarker.proxy.ServerProxy";

    @SidedProxy(clientSide = PlayerMarker.CLIENT_PROXY_CLASS, serverSide = PlayerMarker.SERVER_PROXY_CLASS)
    public static CommonProxy proxy;

    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
    }
   
    @EventHandler
    public void Init(FMLInitializationEvent event) {
        proxy.init();
    }
   
    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
       
    }
}


CommonProxyインターフェースを実装させたクライアントプロキシです
proxy.ClientProxy
コード: 全て選択
package com.s3pt3mb3r.playerMarker.proxy;

import com.s3pt3mb3r.playerMarker.GraspPlayer;
import com.s3pt3mb3r.playerMarker.HotbarEventSubscribe;
import com.s3pt3mb3r.playerMarker.PlayerLoggedInFlagToggle;
import net.minecraftforge.common.MinecraftForge;

public class ClientProxy implements CommonProxy {
    @Override
    public void init() {
        MinecraftForge.EVENT_BUS.register(HotbarEventSubscribe.class);
        MinecraftForge.EVENT_BUS.register(GraspPlayer.class);
        MinecraftForge.EVENT_BUS.register(PlayerLoggedInFlagToggle.class);
    }
}


ホットバーの描画イベントで発火するクラスです。
教えていただいたところまでしかわからなかったため先には進めていません; ;
個人的な嗜好でe.getType() != ElementType.HOTBARだったところをe.getType() == ElementType.HOTBARに書き換えました
HotbarEventSubscriber.java
コード: 全て選択
package com.s3pt3mb3r.playerMarker;

import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class HotbarEventSubscribe {
   @SubscribeEvent
   public static void onRenderGamePostOverlay(RenderGameOverlayEvent.Post e) {
      // ホットバーの描画のタイミングで描画します。
       if (e.getType() == ElementType.HOTBAR)
       {
          System.out.println("ホットバーが描画されたよ!!");
       }
   }
}


手探りで自分の位置と左右の頭の振り加減を表示するようにしてみたものです。
PlayerEventというイベントを使いました。
e.getEntityPlayer()となっているところを、e.getEntity()としても同じように動いたのですが違いはわかりません。
PlayerEventはマイクラが起動した瞬間からほとんどずっと発火し続けるイベントのようで、起動した瞬間にNullPointerExceptionになるので、ログイン状態のみに限定するため、後のPlayerLoggedInFlagger.javaからフラグ切り替えをして、確認させるようにしてみました。
GraspPlayer.java
コード: 全て選択
package com.s3pt3mb3r.playerMarker;

import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;

public class GraspPlayer {
   
   public static Boolean loggedInFlag = false;
   
   @SubscribeEvent
   public static void onPlayerEvent(PlayerEvent e) {
      if (loggedInFlag) {
         System.out.println(e.getEntityPlayer().rotationYawHead);
         System.out.println(e.getEntityPlayer().posX);
         System.out.println(e.getEntityPlayer().posY);
         System.out.println(e.getEntityPlayer().posZ);
      }
   }
}


これはログイン・ログアウトイベントで発火して、前述のフラグを切り替えするクラスです。
PlayerLoggedInFlagToggle.java
コード: 全て選択
package com.s3pt3mb3r.playerMarker;

import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;

public class PlayerLoggedInFlagToggle {
   @SubscribeEvent
   public static void onPlayerLoggedInEvent(PlayerLoggedInEvent e) {
      GraspPlayer.loggedInFlag = true;
   }
   
   @SubscribeEvent
   public static void onPlayerLoggedOutEvent(PlayerLoggedOutEvent e) {
      GraspPlayer.loggedInFlag = false;
   }
}
アバター
ashimof
ID:97d5b044
水から上がったとこ
 
記事: 2
登録日時: 2018年4月03日(火) 22:01


Return to 質問:開発・制作関連

x