JMonkeyEngine3——NiftyGui Console

Console

 控制台控件显示类似于终端窗口中的命令提示符。它允许输入和输出文本。还有一个附加类可用,它添加了更多高级功能,如命令行完成、命令历史记录和命令解析。

此外,您还可以使用 ConsoleCommands 类来为控制台控件添加更多功能。其工作原理是,您可以使用 ConsoleCommands 类注册命令,然后将 ConsoleCommands 实例连接到实际的控制台控件。这样,ConsoleCommands 类就可以拦截和处理命令。这样就可以实现命令行完成(针对所有已注册的命令)以及命令历史记录等功能。

常用属性

Name Datatype Default Description
lines integer 2 定义文本输入字段上方控制台的历史记录和输出窗口显示的行数。

EventBus Notification

当使用返回键提交命令时,控制台支持 EventBus 通知。在这种情况下,将使用控制台的 ID 作为主题以及您应该执行的实际命令行发布 ConsoleExecuteCommandEvent。事件类允许访问已解析的命令行。

EventBus 通知仅用于基本控制台。当您使用 ConsoleCommands 时,仅当发现未知命令时才会发布 ConsoleExecuteCommandEvent。当检测到先前注册的命令时,将直接调用已注册的 ConsoleCommand。

Java Builder 示例

 1 // this creates a simple console with 25 lines that is 80% width (of the parent element) and for demonstration purpose there is an effect added
 2 control(new ConsoleBuilder("console") {{
 3   width("80%");
 4   lines(25);
 5   alignCenter();
 6   valignCenter();
 7   onStartScreenEffect(new EffectBuilder("move") {{
 8     length(150);
 9     inherit();
10     neverStopRendering(true);
11     effectParameter("mode", "in");
12     effectParameter("direction", "top");
13   }});
14 }});

XML 示例

1 <!-- simple default console control that displays 25 lines. please note: event notification requires an id -->
2 <control id="console" name="nifty-console" lines="25" align="center" valign="center">

参考

https://github.com/nifty-gui/nifty-gui/wiki/Console

案例

添加一个NiftyGuiConsole.xml,写入如下xml代码:

 1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 2 <nifty xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://nifty-gui.lessvoid.com/nifty-gui" xsi:schemaLocation="https://gitee.com/JoyClm/nifty-gui/raw/1.4/nifty-core/src/main/resources/nifty.xsd https://gitee.com/JoyClm/nifty-gui/raw/1.4/nifty-core/src/main/resources/nifty.xsd">
 3     <useControls filename="nifty-default-controls.xml"/>
 4     <useStyles filename="nifty-default-styles.xml"/>
 5     <screen id="GScreen0" controller="mygame.NiftyGuiConsole">
 6         <layer id="GLayer0" childLayout="center">
 7             <panel id="GPanel0" childLayout="vertical" width="70%" x="158" y="242" style="nifty-panel-simple" height="40%">
 8                 <control name="nifty-console" id="console0" backgroundColor="#00000055" width="*" lines="8" height="85%"/>
 9                 <control name="button" id="submit" childLayout="center" label="submit" align="right"/>
10             </panel>
11         </layer>
12     </screen>
13 </nifty>

在设计器中查看结果如下:

 转到NiftyGuiConsole.java代码,添加如下代码:

 1 import com.jme3.app.SimpleApplication;
 2 import com.jme3.math.ColorRGBA;
 3 import com.jme3.niftygui.NiftyJmeDisplay;
 4 import de.lessvoid.nifty.Nifty;
 5 import de.lessvoid.nifty.screen.Screen;
 6 import de.lessvoid.nifty.screen.ScreenController;
 7 
 8 /**
 9  * @date 2024年7月17日14点02分
10  * @author JohnKkk
11  */
12 public class NiftyGuiConsole extends SimpleApplication implements ScreenController{
13 
14     private Nifty m_Nifty;
15     
16     public static void main(String[] args) {
17         NiftyGuiConsole niftyGuiLabel = new NiftyGuiConsole();
18         niftyGuiLabel.start();
19     }
20     
21     @Override
22     public void simpleInitApp() {
23         // 设置默认背景色
24         getViewPort().setBackgroundColor(ColorRGBA.DarkGray);
25         
26         // 初始化Nifty
27         NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
28                 assetManager,
29                 inputManager,
30                 audioRenderer,
31                 guiViewPort);
32         m_Nifty = niftyDisplay.getNifty();
33         // 将NiftyGUI显示对象添加到JME3中
34         guiViewPort.addProcessor(niftyDisplay);
35         
36         m_Nifty.fromXml("Interface/NiftyGuiConsole.xml", "GScreen0");
37         
38         // 禁用flyCam并显示鼠标
39         flyCam.setEnabled(false);
40         inputManager.setCursorVisible(true);
41     }
42 
43     @Override
44     public void bind(Nifty arg0, Screen arg1) {
45     }
46 
47     @Override
48     public void onStartScreen() {
49     }
50 
51     @Override
52     public void onEndScreen() {
53     }
54     
55 }

启动后即可看到与设计器一致得结果:

 注意我们在java代码中设置了viewPort的背景色,所以与设计器查看到的背景色不同。

命令监听与执行命令绑定

转到java代码,添加如下订阅:

1 @NiftyEventSubscriber(id="console0")
2     public final void onConsoleCommand(final String id, final ConsoleExecuteCommandEvent consoleExecuteCommandEvent){
3         System.out.println("command:" + consoleExecuteCommandEvent.getCommand() + ";commandLine:" + consoleExecuteCommandEvent.getCommandLine());
4     }

再次启动JME3程序,输入命令并回车,即可在onConsoleCommand中获取相关命令:

 你可以手动解析命令并在onConsoleCommand中执行对应逻辑,然而还有另一个方式是通过ConsoleCommands对象绑定命令,如下:

 1 /**
 2      * 创建一个SimpleCommand.<br/>
 3      */
 4     private class SimpleCommand implements ConsoleCommand {
 5 
 6         @Override
 7         public void execute(String... arg0) {
 8             System.out.println("SimpleCommand执行:" + arg0[0]);
 9         }
10         
11     }
12     /**
13      * StatCommand用于处理与Stat相关的命令.<br/>
14      */
15     private class StatCommand implements ConsoleCommand{
16 
17         @Override
18         public void execute(String... arg0) {
19             if(arg0.length >= 2 && arg0[0].equals("stat")){
20                 if(arg0[1].equals("fps")){
21                     m_DisplayFPS = !m_DisplayFPS;
22                     System.out.println("stat fps:" + m_DisplayFPS);
23                 }
24                 else if(arg0[1].equals("unit")){
25                     m_DisplayStat = !m_DisplayStat;
26                     System.out.println("stat unit:" + m_DisplayStat);
27                 }
28             }
29         }
30         
31     }
32 
33     @Override
34     public void bind(Nifty nfity, Screen screen) {
35         // 获取控制台对象控制器
36         // 等同于screen.findElementById("console0").getNiftyControl(ConsoleControl.class)
37         ConsoleControl consoleControl = screen.findNiftyControl("console0", ConsoleControl.class);
38         
39         // 输出一些内容到控制台中(你可以试试其他output方法,比如outputError)
40         consoleControl.output("begin game...", new Color(255, 0, 0, 255));
41         
42         // 创建ConsoleCommands对象来关联我们想要的命令
43         ConsoleCommands consoleCommands = new ConsoleCommands(nfity, consoleControl);
44         
45         // 添加一些命令绑定
46         SimpleCommand simpleCommand = new SimpleCommand();
47         consoleCommands.registerCommand("testCommand", simpleCommand);
48         StatCommand statFPSCommand = new StatCommand();
49         StatCommand statUnitCommand = new StatCommand();
50         consoleCommands.registerCommand("stat fps", statFPSCommand);
51         consoleCommands.registerCommand("stat unit", statUnitCommand);
52         
53         // 完成命令绑定
54         consoleCommands.enableCommandCompletion(true);
55     }

启动JME3,依次输入show命令回车,testCommand回车,stat fps回车,stat unit回车,结果如下:

 从这里可以看到,未被绑定的命令会进入EventBus订阅执行方法中,而绑定的命令则直接调用对应类方法execute()执行,并且未被绑定且不属于内置命令(内置命令实际上也是被内置API绑定了)的时候,控制台会提示Unknown command:show,然而,当你没有创建并使用ConsoleCommands时,是不会提示Unknown command:show的,而且所有命令都会进入EventBus订阅执行方法中。

posted @ 2024-07-17 15:13  JhonKkk  阅读(57)  评论(0)    收藏  举报