如何做碰撞预防? (玩家对象的重置位置)

How to do collision prevention? (Resetting position of player object)

我在阻止我的播放器占据与 canvas 上其他对象相同的位置时遇到了一些严重的问题。

下面的代码是我的 player.update 方法,根据我的逻辑,应该可以防止它发生,尽管在玩家和障碍物之间可能会留下缝隙,但这不是我现在关心的问题。

我已经测试过检测到碰撞,那么我做错了什么?

update() {
    var oldPosition = this.position;                                                  //Save the old player position.
    this.accelerate();                                                                //Accelerate the player through playerinput.
    this.decelerate();                                                                //Modify velocity to friction and gravity
    this.position.addTo(this.velocity);                                               //Move the player according to velocity.
    for (var i = 0; i < this.cElements.length; i++) {                                 //Run through all the elements on the canvas.
        if (this.cElements[i] != this) {                                              //Exclude the player itself.
            if (this.collisionDetector.cElementsIntersect(this, this.cElements[i])) { //If there is collision
                collision = true;
            }
        }
    }
    if (collision) {
        this.position = oldPosition;                                                  //Reset the position.
    }
}

问题是您没有复制位置数据。您只是在创建对象位置的新引用。

在 javascript 中,对象和数组是通过它们的 reference.Think 作为指向内存位置的指针来访问的。

如果你有对象

var myObject = {
      str: "aaaa",
      num: 100,
}

然后复制

var myObject2 = myObject;

它们都指向相同的结构。因此,如果我更改一个中的值,它将同时显示在两个中。

myObject.num = 200;
console.log(myObject.num); // 200 is displayed
console.log(myObject2.num); // 200 is displayed

数组也是如此

var myArr = [0,1,2,3,4,5];
var myArrRef = mayArr;
myArr[1] = 10;
console.log(myArrRef[1]); // as they are the same array the output is 10;

只有基本类型在您将它们分配给另一个变量时才会创建副本。

var str = "Blah blah"
var str1 = str;   // there are now two copies of "blah blah"
str1 += " blah";
console.log(str);  "Blah blah"
console.log(str1);  "Blah blah blah"

数字、布尔值、正则表达式也是如此。

所以如果你想复制一个对象,你必须显式地复制所有的基本类型。

var position = {
    x: 0,
    y: 0,
}

var oldPos = {
     x:position.x,
     y:position.y,
    // and any other relevant info
}

进行碰撞测试

if(collision){
     position.x = oldPos.x;
     position.y = oldPos.y;
    // and any other relevant info
}

希望对您有所帮助。