【问题标题】:How to take two inputs one after another and have the second one not output the same as the first one?如何一个接一个地接受两个输入并且第二个输出与第一个不同?
【发布时间】:2020-08-27 15:22:12
【问题描述】:

我正在制作一个迷你游戏插件,我想让玩家通过右键单击两个对角来定义游戏区域。我的想法是让代码告诉您单击一个块,一旦您选择一个块,它会告诉您选择第二个块。之后,它将继续并打开一个 GUI 以完成迷你游戏的创建。我的第一次尝试做到了,所以在您选择第一个块后,它会切换一个变量,表示选择了第一个角,然后有另一个 if 语句等待您选择下一个角。但是当它切换变量时,它会立即运行下一个 if 语句并同时设置两个块。

@EventHandler
public void onRightClick(PlayerInteractEvent event) {
    Player player = event.getPlayer();
    Integer pos = 0;

    if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
        if (event.getHand() == EquipmentSlot.OFF_HAND) {
            return;
        }
        if (player.getItemInHand().equals(MapSelectorTool.MapSelector)) {

            Block block = event.getClickedBlock();
            String world = block.getWorld().getName();
            Integer X = block.getX();
            Integer Y = block.getY();
            Integer Z = block.getZ();

            if (pos.equals(0)) {
                String[] pos1 = {
                    X.toString(),
                    Y.toString(),
                    Z.toString(),
                    world
                };
                player.sendMessage(ChatColor.GOLD + "First position at " + ChatColor.WHITE + ChatColor.BOLD + X + " " + Y + " " + Z + " " + ChatColor.GOLD + "now right click second position");
                pos = 1;


            }
        }
    }
}

【问题讨论】:

  • pos 是用来记住第一个位置已经被点击的变量吗?

标签: java plugins minecraft bukkit


【解决方案1】:

问题是您在onRightClick 方法中使用了一个局部变量,例如Integer pos = 0; 将始终在每次右键单击时重置。您需要将变量存储在方法之外,以便在第二次点击时保持不变,否则您永远无法进行两次单独的点击并链接它们。

//Place the key variables outside of the method/event (They may need to be static depending on how you wrote the code)
Player player;
Integer pos = 0;
String[] pos1;
String[] pos2;

public void onRightClick(PlayerInteractEvent event) {
    player = event.getPlayer();

    if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) {
        if (event.getHand() == EquipmentSlot.OFF_HAND) {
            return;
        }
        if (player.getItemInHand().equals(MapSelectorTool.MapSelector)) {

            Block block = event.getClickedBlock();
            String world = block.getWorld().getName();
            Integer X = block.getX();
            Integer Y = block.getY();
            Integer Z = block.getZ();

            if (pos.equals(0)) {
                pos1 = {X.toString(), Y.toString(), Z.toString(), world};
                player.sendMessage(ChatColor.GOLD + "First position at " + ChatColor.WHITE + ChatColor.BOLD + X + " " + Y + " " + Z + " " + ChatColor.GOLD + "now right click second position");
                pos = 1;
            }
            else if (pos.equals(1)) {
                pos2 = {X.toString(), Y.toString(), Z.toString(), world};
                player.sendMessage(ChatColor.GOLD + "Second position at " + ChatColor.WHITE + ChatColor.BOLD + X + " " + Y + " " + Z);
                pos = 0;

                //Now do your other code to process the positions and create the region?, and/or pass the variables to your game method to get it all setup?
                //-----------------------
                //yourGameMethod(pos1, pos2, player)
                //-----------------------
                player.sendMessage(ChatColor.GOLD + "Region created, have fun");
            }
        }
    }
}

注意:此代码一次可能仅适用于一名玩家,具体取决于您如何设置插件或触发事件。如果两个玩家同时使用它,那么他们的点击可能会混淆。为了解决这个问题,您需要将点击与玩家相关联,并将它们存储在一个列表中,以便在大量玩家使用插件时轻松匹配它们,并且您可以包含一个超时功能以将位置重置为 0,如果没有在几分钟内进行第二次点击。

【讨论】:

    【解决方案2】:
    Integer pos = 0;
    
    ...
    
    if (pos.equals(0)) {...}
    

    你的静态整数对象 pos 永远不会改变?!

    编辑:看看:https://javatutorialhq.com/java/lang/integer-class-tutorial/

    【讨论】:

    • ``` if (pos.equals(0)) { pos1 = {X.toString(), Y.toString(), Z.toString(), world}; player.sendMessage(ChatColor.GOLD + "第一个位置" + ChatColor.WHITE + ChatColor.BOLD + X + " " + Y + " " + Z + " " + ChatColor.GOLD + "现在右击第二个位置");位置 = 1; }``` 在 if 语句的末尾,它变为 pos= 1;这就是第二个 if 语句的要求。
    • 我想通了,我没有使用 if 语句,而是使用 switch 和 break 语句,这样它就不会立即进入下一部分。感谢您的帮助!
    猜你喜欢
    • 2021-08-17
    • 2019-08-11
    • 2022-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多