2015-05-16 84 views
0

我試圖將一些Javascript代碼移植到Java中,並且我已經到了一個部分,我似乎無法移植代碼而沒有發生各種錯誤。沒有實際的例外拋出它只是不工作,因爲它應該。基本上這個代碼是網絡片段的一部分,它在接收到一個新數據包時試圖與服務器協調,因爲它使用客戶端預測來保持移動播放器,即使沒有數據包被應用。Java中JavaScript的拼接等價物

我理解這個概念,但我似乎無法將它放入代碼中。代碼段使用數組上的splice函數來刪除元素,所以我認爲它很容易移植。我將發佈下面的JS代碼段以及Java中的代碼段,這些代碼段給了我一些問題,並告訴我我做錯了什麼。我很確定我也移植了錯誤的循環。

的JavaScript:

var j = 0; 
while (j < this.pending_inputs.length) { 
    var input = this.pending_inputs[j]; 
    if (input.input_sequence_number <= state.last_processed_input) { 
    // Already processed. Its effect is already taken into account 
    // into the world update we just got, so we can drop it. 
    this.pending_inputs.splice(j, 1); 
    } else { 
    // Not processed by the server yet. Re-apply it. 
    this.entity.applyInput(input); 
    j++; 
    } 
} 

的Java:

for (int i = 0; i < pendingInputs.size(); i++) { 
    if (i <= lastProcCmd) { 
     // Already proceesed command, remove it from pendingInputs 
     for (int j = 1; j < pendingInputs.size(); j++) { 
      pendingInputs.remove(j); 
     } 
    } else { 
     applyCmd(pendingInputs.get(i)); 
    } 
} 

編輯 所以我改變了代碼,以這樣的:

// Server reconciliation 
int j =0; 
while (j < pendingInputs.size()) { 
    String cmd = pendingInputs.get(j); 
    if (pendingInputs.indexOf(cmd) <= lastProcCmd) { 
     pendingInputs.remove(j); 
    } else { 
     applyCmd(cmd); 
     j++; 
    } 
} 

,我仍然有一個問題,所以我」我認爲這是代碼中的其他地方。這是多人代碼使用客戶端預測和服務器和解是否有幫助使用這些文章:Articles

待定輸入之一StringArrayList一個s表示,如「左」或,命令「右」。另一個問題是我的網絡監聽程序在另一個線程上,即使我使用同步塊來防止在重要位置出現任何ConcurrentModificationException。他的代碼很難移植,因爲JS到Java是我不熟悉的東西。

+1

是的,你移植它是錯誤的。這兩個片段並不等同。爲什麼有一個嵌套的循環在原始文件中不存在? 'splice(j,1);'相當於'remove(j)',就我所知,這是你唯一需要改變的東西。爲什麼不直接複製代碼?另外,在'pendingInputs'中是什麼? – Radiodef

+0

另外,您需要使用適當的迭代器從列表中移除項目,否則您將收到異常。 – chrylis

+0

@Radiodef我對JS不太熟悉,所以我沒有'刪除(j)'是等價的。 @chrylis你是什麼意思一個適當的迭代器?這是一個StringList的ArrayList。 – Thatoneguy

回答

0

未經檢驗的,但看起來接近:

for (Iterator<String> iter = pendingInputs.iterator(); iter.hasNext();) { 
    String cmd = iter.next(); 
    if(pendingInputs.indexOf(cmd) <= lastProcCmd){ 
    iter.remove(); 
    }else{ 
    applyCmd(cmd); 
    } 
} 

需要注意以下幾點:

  • 可能是明智的,對於你的命令創建類和使用多態運行它們
  • 如果搞清楚命令已經通過它在列表中的位置進行處理很容易出錯。如果命令是pojos,你可以設置一個「已處理」標誌,根據它們刪除它們。