簡體   English   中英

如何在Java游戲中進行命令?

[英]How do I make commands in a java game?

基本上,我想這樣做,以便當用戶在textfield / attack動物中鍵入內容時,它會執行Attack方法並以animal為參數。 因此,如果玩家鍵入/ attack 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。

您必須對其進行調整以適合您希望用戶使用的語法,但是您可能需要更改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
    }
}

您仍然必須驗證是否為每個命令獲取了正確的參數,並且我沒有對字符串指針采取任何措施來防止空指針或越界,但是希望這可以幫助您入門。

"/attack arg1 arg2 arg3".split("\\\\s+")將為您提供一個等效於new String[]{"/attack", "arg1", "arg2", "arg3"} ,您可以使用無論您想要什么。

對於調用它,如果確實需要,您可以將其反映到對象中(有關更多詳細信息,請參見Class.getMethod ),但是如果可以的話,最好避免這樣做。

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死亡/離開時將其從Map上移除:

players.remove(deadPlayer.name);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM