FancyMenu Wiki/自定义按钮行为
关于
你可以使用FancyMenu API来写一个自定义按钮行为的拓展模组。你也可以将其用于自定义按钮元素,也可以在通过点击按钮执行你写的自定义按钮行为。
准备开发环境
请参阅 准备工作区。
添加新的按钮行为
每一个自定义按钮行为都应被封装到 ButtonActionContainer
(按钮行为容器)。
这个 container 需要在模组中初始化注册到 ButtonActionRegistry
。
创建 ButtonActionContainer
给你的按钮行为创建新的 ButtonActionContainer 子类,并为其命名。
在这个样例中,我会给我的演示按钮行为类命名为 ExampleButtonActionContainerWithValue。
在这个类中有一些重要的特殊东西需要解释一下。
构造方法(Constructor)
构造方法(Constructor)用于为你的按钮行为设置标识符。
还是那句话,不管是什么,标识符应该是独一无二的。不能说两个人共用一个sfz号。
确切来说,标识符并不是你的按钮行为名,所以你可以选一个独一无二的字符串捏。
这边推荐使用独一无二的东西当标识符前缀,比如你的用户名一样。否则有别人拓展模组用的标识符和你一样那不就冲突了(
public ExampleButtonActionContainerWithValue() {
//The action identifier needs to be unique, so just use your username or something similar as prefix
//这儿处需要唯一的行为标识符,把你的用户名或者其他的东西当标识符前缀不就得了。
super("super_unique_action_identifier");
}
getAction()
这个方法会返回你的按钮行为的名称。
这个名字会用在编辑器中,炫一个你喜欢的名字。
当然,别你写行为本质是胖子,但你起的名字是瘦子就行。
//The name of your action. Should be lowercase and without any spaces.
//你的行为名都得小写不带空格。
@Override
public String getAction() {
return "customaction";
}
hasValue()
在这里你可以设定你的按钮行为是否需要值。
譬如,打开GUI按钮行为就需要菜单标识符作为值。
相对地,关闭GUI按钮行为就不需要值。
//If the custom action has a value or not
//自定义行为是否需要值
@Override
public boolean hasValue() {
return true;
}
execute(..)
这是这个类里最重要的方法。
这个方法是你用来创建按钮行为最基础的工具。
它会在按下绑定了自定义行为的自定义按钮后被调用。(来点被字地狱:当被绑定了,自定义按钮行为的,自定义按钮,被按下时,它会被调用。)
这里将按钮行为的值作为参数。
参数可以为空,留意一下。
所有你的按钮行为在按钮点击后都应该会被这个方法处理。
//Gets called when a button with this custom action is getting clicked
//当单击具有此自定义行为的按钮时调用。
@Override
public void execute(String value) {
//This will open a new instance of the dirt message screen, when a button with this custom action is getting clicked
//当带有自定义行为的按钮被点击后会打开一个新的泥土信息屏实例。
//and will show the action value as message
//并且会通过信息显示值。
if (value != null) {
Minecraft.getInstance().setScreen(new GenericDirtMessageScreen(new TextComponent(value)));
}
}
getActionDescription()
你可以用这个方法描述你的按钮行为。
它会在布局编辑器显示。
重要: 越短越好,因为描述没那么多地方显示。
//The description of the action
//行为的描述
@Override
public String getActionDescription() {
return "Show custom text in a dirt message screen.";
}
getValueDescription()
你的按钮行为值的描述。
你的按钮行为如果有值,那你得稍微详细地描述你的值是啥。
值描述和类型描述差不多。
如果你的按钮行为没有值,那你返回null
得了。
重要: 越短越好,至于为啥,和上面一样。(暴躁)
//The action has a value, so I return a simple and short value description here.
//如果行为有值,那返回简练的描述就行。
//This is actually more like a value type description.
//和变量类型描述差不多。
@Override
public String getValueDescription() {
return "Display Text";
}
getValueExample()
这个方法会返回一个按钮行为的值应该是什么样子的示例。
没值返回空。(耐心↓)
重要: 越短越好....(你知道我想说什么。(捂面))
//That's an example of how the action value should look like.
//行为值长这样 (指样例)
@Override
public String getValueExample() {
//Well, it's just a simple String, so what should be the example here >.<
//简简单单的字符串,塞一点示例。
return "cool text to display";
}
完整样例
完整的ButtonActionContainer
样例。
package de.keksuccino.fancymenu.api.buttonaction.example;
import de.keksuccino.fancymenu.api.buttonaction.ButtonActionContainer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.GenericDirtMessageScreen;
import net.minecraft.network.chat.TextComponent;
public class ExampleButtonActionContainerWithValue extends ButtonActionContainer {
public ExampleButtonActionContainerWithValue() {
//The action identifier needs to be unique, so just use your username or something similar as prefix
//这儿处需要唯一的行为标识符,把你的用户名或者其他的东西当标识符前缀不就得了。
super("super_unique_action_identifier");
}
//The name of your action. Should be lowercase and without any spaces.
//你的行为名都得小写不带空格。
@Override
public String getAction() {
return "customaction";
}
//If the custom action has a value or not
//自定义行为是否有值
@Override
public boolean hasValue() {
return true;
}
//Gets called when a button with this custom action is getting clicked
//当单击具有此自定义行为的按钮时调用。
@Override
public void execute(String value) {
//This will open a new instance of the dirt message screen, when a button with this custom action is getting clicked
//当带有自定义行为的按钮被点击后会打开一个新的泥土信息屏实例。
//and will show the action value as message
//并且还会以信息方式显示行为值。
if (value != null) {
Minecraft.getInstance().setScreen(new GenericDirtMessageScreen(new TextComponent(value)));
}
}
//The description of the action
//行为的描述
@Override
public String getActionDescription() {
return "Show custom text in a dirt message screen.";
}
//The action has a value, so I return a simple and short value description here.
//行为有值,所以得在这返回一段简练的值的描述。
//This is actually more like a value type description.
//更像是像值类型的描述。
@Override
public String getValueDescription() {
return "Display Text";
}
//That's an example of how the action value should look like.
//行为值长这样 (指样例)
@Override
public String getValueExample() {
//Well, it's just a simple String, so what should be the example here >.<
//简简单单的字符串,就像清清淡淡的人生。
return "cool text to display";
}
}
注册Container
你几乎要完成了,就差一步,(坠入深渊无法生还)很重要的一步。
FancyMenu得认你按钮行为,所以在你的拓展模组初始化时,你得在这个充满了注册的游戏中,注册你的ButtonActionContainer
到ButtonActionRegistry
。
package de.keksuccino.fancymenu;
import net.minecraftforge.fml.common.Mod;
import de.keksuccino.fancymenu.api.buttonaction.ButtonActionRegistry;
@Mod("modid")
public class ExampleModMainClass {
public ExampleModMainClass() {
try {
//Register your ButtonActionContainer to the ButtonActionRegistry at mod init.
//在初始化中注册ButtonActionContainer到ButtonActionRegistry
ButtonActionRegistry.registerButtonAction(new ExampleButtonActionContainerWithValue());
} catch (Exception e) {
e.printStackTrace();
}
}
}
现在你可以通过使用自定义按钮使用自定义按钮行为了。