基本上我想这样做,当用户输入文本字段/攻击动物时,它会执行攻击方法并将动物作为参数。因此,如果玩家键入/攻击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。
答案 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