相当于JavaScript在Java中的拼接

时间:2015-05-16 00:00:06

标签: java arrays

我正在尝试将一些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来说是我不熟悉的东西。

1 个答案:

答案 0 :(得分:0)

未经测试,但看起来很近:

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

有些注意事项:

  • 可能明智地为您的命令创建类并使用多态来运行它们
  • 确定命令是否已通过其在列表中的位置进行处理是容易出错的。如果命令是pojos,你可以设置一个“已处理”标志,他们将根据它删除。