如何在java游戏中创建命令?

时间:2011-09-16 05:18:24

标签: java

基本上我想这样做,当用户输入文本字段/攻击动物时,它会执行攻击方法并将动物作为参数。因此,如果玩家键入/攻击foo,则执行player.attack(foo)。我已经有了执行聊天的方法,所以我知道哪个玩家正在进行聊天。我只需要知道如何重新调整/ attack之后的内容并将其作为player.attack()的参数,它将Player对象作为参数。这些是我接收输入的方法:

public void actionPerformed(ActionEvent textBox) {
        String text = textField.getText();
        player.chat(text);
}

哪个在我的Gui课程中,并且:

public void chat(String chat){
    playerGui.printText(this.getName() + ": " + chat);
    playerGui.textField.selectAll();
}

哪个是播放器类。 gui实例传递给Player(),它创建变量playerGui。

3 个答案:

答案 0 :(得分:4)

您必须调整它以适合您希望用户使用的语法,但您可能希望更改actionPerformed方法以检查用户可以执行的不同操作,而不仅仅是聊天。

public void actionPerformed(ActionEvent textBox) { 
    String text = textField.getText();
    String command = text.substring(0, text.indexOf(" "));
    String args = text.substring(text.indexOf(" ") + 1);
    switch (command) {
        case "chat":
            // Pass everything but the command
            player.chat(args);
            break;
        case "/attack":
            player.attack(args);
            break;
        default:
            // Handle bad user input
    }
}

你仍然需要验证你是否为每个命令获得了正确的参数,并且我没有为字符串函数提供任何防止空指针或越界的保护,但希望这会得到你开始了。

答案 1 :(得分:3)

"/attack arg1 arg2 arg3".split("\\s+")将为您提供相当于new String[]{"/attack", "arg1", "arg2", "arg3"}的数组,然后您可以将其用于任何您想要的内容。

对于调用它,你可以反映到对象中(如果你真的需要,请参阅Class.getMethod了解更多细节),但如果可以的话,你可能最好避免这种情况。

答案 2 :(得分:1)

Player对象的每个实例都应该有自己的名称,String唯一标识它。将每个敌人Player存储在Map<String, Player>中,然后在从输入中解析其名称(@mange解释如何操作)后使用此目标查找目标目标。

Player类:

public class Player {

   public final String name;

   public Player(String uniqueName) {
      name = uniqueName;
   }

   //additional code
}

在一个有意义的课程中,声明并初始化Map以查找Player

private static Map<String, Player> players = new HashMap<String, Player>();

在整个游戏中,当引入Player时,请将其添加到Map

Player newPlayer = new Player(someUniqueName);
players.put(someUniqueName, newPlayer);

当发出攻击命令时,解析名称并使用它们查找每个受攻击的Player

public void attackNamedPlayers(String[] names) {
   for (String name : names) {
      Player attackedPlayer = players.get(name); //look up enemy Player by name
      myPlayer.attack(attackedPlayer);           //attack enemy Player
   }
}

请勿忘记Player在{/ 1}}死亡时离开:

Map