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订阅执行方法中。
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号