JMonkeyEngine3——NiftyGui ImageSelect

ImageSelect

ImageSelect 控件允许从图像列表中选择单个图像。可以使用控件提供的左/右箭头来选择图像。要求图像具有相同的大小。更改选择将在 EventBus 上发布一个 Event。可以使用 ImageSelectBuilder 从 Java 动态创建控件,也可以使用<control name="imageSelect"></control> 标记从 XML 动态创建该控件。

常用属性

Name Datatype Default Description
imageWidth SizeValue "0px" 此 ImageSelect 控件应显示的图像的宽度。此属性是必需的!
imageHeight SizeValue "0px" 此 ImageSelect 控件应显示的图像的高度。此属性是必需的!
imageList 以逗号分隔的图像文件名列表 "" 此属性包含一个以逗号分隔的文件名列表,该列表定义了此图像选择控件显示的所有图像。

EventBus Notification

ImageSelect 支持对所选图像的任何更改进行 EventBus 通知。当所选图像发生更改时,将使用 ImageSelect 的 ID 作为事件的主题发布 ImageSelectSelectionChangedEvent。

Java Builder 示例

1 // Using the builder pattern
2 control(new ImageSelectBuilder("someImageSelect") {{
3   imageWidth("100px"); // please note that imageWidth and imageHeight are mandatory!
4   imageHeight("100px");
5   imageList("images/1.png,images/2.png,images/3.png");
6 }});

XML 示例

1 <!-- example imageSelect (right out of the multiplayer example which is part of the nifty-examples project) -->
2 <control id="#imageSelect" name="imageSelect" width="126px" imageWidth="80px" imageHeight="80px" imageList="multiplayer/avatar1.png,multiplayer/avatar2.png,multiplayer/avatar3.png,multiplayer/avatar4.png" />

参考

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

案例

在工程的Textures目录添加两个尺寸大小一样的图片:

 然后创建一个NiftyGuiImageSelect的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://raw.githubusercontent.com/void256/nifty-gui/1.4/nifty-core/src/main/resources/nifty.xsd https://raw.githubusercontent.com/void256/nifty-gui/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="screen0" controller="mygame.NiftyGuiImageSelect" >
 6         <layer id="layer0" childLayout="center">
 7             <!-- imageList使用相对路径以及英文逗号隔开图片列表 -->
 8             <control name="imageSelect" id="imageSelect0" imageList="Textures/yin.png,Textures/yang.png" height="97px" width="140px" y="-1px" x="-1px"/>
 9         </layer>
10     </screen>
11 </nifty>

注意第8行,通过imageList属性,添加了两个相对路径在Textures下的图片,以英文逗号隔开。

然后在mygame包下创建并打开NiftyGuiImageSelect.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.NiftyEventSubscriber;
 6 import de.lessvoid.nifty.controls.ImageSelectSelectionChangedEvent;
 7 import de.lessvoid.nifty.screen.Screen;
 8 import de.lessvoid.nifty.screen.ScreenController;
 9 
10 /**
11  * @date 2024年7月12日17点42分
12  * @author JohnKkk
13  */
14 public class NiftyGuiImageSelect extends SimpleApplication implements ScreenController{
15 
16     private Nifty m_Nifty;
17     
18     public static void main(String[] args) {
19         NiftyGuiImageSelect niftyGuiLabel = new NiftyGuiImageSelect();
20         niftyGuiLabel.start();
21     }
22     
23     @Override
24     public void simpleInitApp() {
25         // 设置默认背景色
26         getViewPort().setBackgroundColor(ColorRGBA.DarkGray);
27         
28         // 初始化Nifty
29         NiftyJmeDisplay niftyDisplay = NiftyJmeDisplay.newNiftyJmeDisplay(
30                 assetManager,
31                 inputManager,
32                 audioRenderer,
33                 guiViewPort);
34         m_Nifty = niftyDisplay.getNifty();
35         // 将NiftyGUI显示对象添加到JME3中
36         guiViewPort.addProcessor(niftyDisplay);
37         
38         m_Nifty.fromXml("Interface/NiftyGuiImageSelect.xml", "screen0");
39         
40         // 禁用flyCam并显示鼠标
41         flyCam.setEnabled(false);
42         inputManager.setCursorVisible(true);
43     }
44     
45     @NiftyEventSubscriber(id="imageSelect0")
46     public final void onImageSelectSelectionChangedEvent(final String id, final ImageSelectSelectionChangedEvent event){
47         System.out.println("当前选择了第:" + event.getSelectedIndex() + "个图片!");
48     }
49     
50     @Override
51     public void bind(Nifty nifty, Screen screen0) {
52     }
53 
54     @Override
55     public void onStartScreen() {
56     }
57 
58     @Override
59     public void onEndScreen() {
60     }
61     
62 }

注意第45~48行,通过EventBus订阅了id为imageSelect0的事件执行方法,启动JME3程序,结果如下:

 值得注意的是,默认显示第一张图片,而且EventBus事件执行方法没有执行,只有当我们点击切换时才会执行:

 如果希望初始化显示的图片是索引为1(也就是第二个图片)的图片,那么无法通过xml属性配置,只能在java代码中实现,与之前的文章一样,在onScreenStar之前初始化(注意我们现在只有一个screen,当有多个screen时则根据screen判断当前是否包含ImageSelect元素来执行对应初始化工作):

1 @Override
2     public void bind(Nifty nifty, Screen screen0) {
3         Element imageSelect0 = screen0.findElementById("imageSelect0");
4         // 获取ImageSelect控制器
5         ImageSelectControl imageSelectControl = imageSelect0.getNiftyControl(ImageSelectControl.class);
6         imageSelectControl.setSelectedImageIndex(1);
7     }

从第5行可知,NiftyGui的组件(control),都是有对应配套的xxxControl类存在,查看源码包:

 其规则基本就是组件名拼接Control.java。

回到我们的ImageSelectControl,我们通过调用setSelectedImageIndex(1)设置了初始化要显示的图片,根据前面的文章可知,在初始化阶段设置时不会触发EventBus事件执行方法的调用。

启动JME3程序,结果如下:

 此时启动默认就显示第二张图片了。

posted @ 2024-07-12 19:05  JhonKkk  阅读(36)  评论(0)    收藏  举报