防撞怎么办? (重置玩家对象的位置)

时间:2015-12-31 11:37:48

标签: javascript canvas typescript collision-detection game-physics

我在防止我的播放器与画布上的其他对象占据相同位置时遇到了一些严重的麻烦。

以下代码是我的player.update方法,就我的逻辑而言,它应该可以防止它,尽管在玩家和障碍物之间留下了可能的瞎扯,但这不是我现在关注的问题。 / p>

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

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.
    }
}

1 个答案:

答案 0 :(得分:1)

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

在javascript中,通过引用访问对象和数组。将其视为指向内存位置的指针。

如果你有一个对象

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
}

希望这有帮助。