2016-07-13 19 views
1

我正在開發中LibGDX遊戲一樣,我有一個靜態INT名爲TILE_ID分配給每瓦每次瓦片被創建,像這樣:靜態int是不是不同的進程

{loop in Level.class} 

Tile t = null; 

      switch (material) { 
       case HOME: { 
        t = new Home(x, y); 
        break; 
       } 
       case WALL_IRON: 
       case WALL_BRICK: { 
        t = new Tile(x, y, material, type); 
        break; 
       } 
      } 

      if (t != null) { 
       if (t instanceof Home) { 
        this.home = t; 
       } 
       t.tileID = TILE_ID++; 
       tileArray.add(t); 
      } 

{loop-end in Level.class} 

所以,當我開始新遊戲,首先說:

private final Listener clientListener = new Listener() { 
    @Override 
    public void connected(Connection connection) { 
     PacketEntity p = (PacketEntity) Packet.createPacket(
       PacketEntity.class, Packet.TYPE.CONNECTED); 
     p.name = pTank.getName(); 
     connection.sendTCP(p); 

     System.out.println("MAX TILES: " + Level.TILE_ID); 
     System.out.println("connected to server!"); 
    } 

輸出是:

:desktop:run 
new manager 
disposed main menu! 
Initializing local server... 
Client connected! ID# 1 
MAX TILES: 76 
connected to server! 

然後我運行第二個實例,連接到本地主機服務器和輸出是:

:desktop:run 
new manager 
disposed main menu! 
A server is already running on localhost. Trying to connect.... 
MAX TILES: 152 
connected to server! 

我不明白爲什麼會發生這種情況。如果我連接第三個客戶端等,最大瓷磚總是152.

tileid增加的唯一地方是在每個播放器本地(不通過網絡發送)的Level.class內。

有人可以幫我解決這個問題嗎?

+1

你有沒有試着調試代碼?從給出的(而稀疏的)信息,它看起來像「級別創世迴路」可能被執行兩次('152 = 2 * 76')如果第二個實例啓動。 – dpr

+1

這是一個有點混亂跟隨,因爲全部大寫字段名稱通常僅用於'final'靜態字段。 – Tenfour04

+0

謝謝。正確答案是dpr。我在,如果你連接到另一臺服務器新的服務器實例會甚至創造代碼中的錯誤。 – Jh62

回答

1

你應該在新的流程實例他們增加之前設置Level.TILE_ID = 0 - 問題是,你正在開始新的工藝與TILE_ID已設置爲與76值,因此新工藝提高變量設置

76 + 76 = 152 

它始終是152因爲你是從第一個盯着新客戶,如果你想從第二個開始,那將是

152 + 76 = 228 

等等

+2

如果他重置TILE_ID爲零,那麼爲什麼他需要將其設置爲靜態屬性,我想他可能需要設置這個類在客戶端服務器瓢 –

+0

這取決於他如何使用內部客戶的變量舀不應用程序(也許他需要靜從外部類訪問此) –

+0

感謝。我今晚試試這個。也許是因爲我從IDE運行幾個instantes。我試着運行編譯後的代碼,看看是否會繼續發生。 – Jh62