我正在尝试将一些Javascript代码移植到Java中,并且我已经到达了一个部分,我似乎无法在没有各种错误的情况下移植代码。没有实际的异常抛出它只是不能正常工作。基本上,此代码是网络代码段的一部分,该代码片段在接收到新数据包时尝试与服务器协调,因为即使没有要应用的数据包,它也会使用客户端预测来继续移动播放器。
我理解这个概念,但我似乎无法把它放入代码中。代码部分使用数组上的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++;
}
}
爪哇:
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
待定输入是ArrayList
String
个,代表“左”或“右”等命令。另一个问题是我的网络侦听器在另一个线程上,即使我使用sychronization块来阻止任何ConcurrentModificationException
在重要的地方发生。他的代码难以移植,因为JS对Java来说是我不熟悉的东西。
答案 0 :(得分:0)
未经测试,但看起来很近:
for (Iterator<String> iter = pendingInputs.iterator(); iter.hasNext(); ) {
String cmd = iter.next();
if(pendingInputs.indexOf(cmd) <= lastProcCmd){
iter.remove();
}else{
applyCmd(cmd);
}
}
有些注意事项: