以下是我尝试使用此代码进行的操作。我每隔六帧从服务器接收一个敌人的位置。
客户端敌人作为对象存储在一个阵列(称为敌人)中,这些敌人对象将位置向量作为属性(称为pos),具有x和y。还有另一个位置向量(称为previousPos)存储敌人所处的第二个最近位置。我这样做是因为我可以在这两个位置之间进行调整,这样游戏就可以消耗更少的带宽,同时仍然保持平滑。
data [i] .x包含服务器每隔6帧向客户端发送的x位置,我试图将敌人(使用pos)的位置设置为服务器发出的保持敌人的位置以前的位置(使用previousPos)所以我可以在它们之间进行翻译。
这是我在服务器发送有关敌方统计数据的消息时运行的功能:
for (var i = 0; i <= enemies.length - 1; i++) { //iterates through all enemies
testerino++; //used to ensure what iteration this is on
if (data[i].x != undefined || data[i].y != undefined) {
console.log(enemies[i].pos.x,enemies[i].previousPos.x,data[i].x, testerino);
if (data[i].x != enemies[i].pos.x) enemies[i].previousPos.x = enemies[i].pos.x; //proven they are different
if (data[i].y != enemies[i].pos.y) enemies[i].previousPos.y = enemies[i].pos.y;
console.log(enemies[i].pos.x,enemies[i].previousPos.x,data[i].x, testerino);
}
if (data[i].x != undefined) enemies[i].pos.x = data[i].x;
if (data[i].x != undefined) console.log(enemies[i].pos.x,enemies[i].previousPos.x,data[i].x, testerino);
if (data[i].y != undefined) enemies[i].pos.y = data[i].y;
}
在控制台中它返回: (第一个数字是pos.x,第二个:previousPos.x,第三个:我们在哪个循环)
sketch.js:213 587.8102829077167 587.8102829077167 567.8102829082868 225
sketch.js:216 587.8102829077167 587.8102829077167 567.8102829082868 225
sketch.js:219 567.8102829082868 567.8102829082868 567.8102829082868 225
请注意,在第216行和第219行之间只分配了enemies[i].pos.x
,而以某种方式enemies[i].previousPos.x
也被更改了!即使我从未分配过任何东西!
对可能出错的任何想法?
答案 0 :(得分:0)
我在代码的早期确实做过:
this.previousPos = this.pos;
在敌人函数的构造函数内,不知道javascript有什么叫做引用。这意味着previousPos被用作位置的昵称,所以pos的所有更改也发生在previousPos上,因为它们是同一个变量。我使用的库有一个矢量复制方法(现在我知道为什么它在那里......)我认为我用以下代码替换了代码:
this.previousPos = this.pos.copy()
确保将previousPos变为克隆,而不是通过等号赋值的同一变量的昵称。