0

我在防止我的玩家在画布上占据与其他对象相同的位置时遇到了一些严重的麻烦。如何防止碰撞? (重置玩家对象的位置)

下面的代码是我的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. 
    } 
} 
+0

Mozilla有一个很好的碰撞文章,它可以帮助你,也可以帮助你 - https://developer.mozilla.org/zh-CN/docs/Games/Techniques/2D_collision_detection – TrojanMorse

+0

@Torean Thanks for该链接,但它不是真正的检测我遇到的问题,它阻止了玩家将它的位置转移到发生碰撞的位置。 –

+0

您并未创建旧位置的副本。 'oldPosition = position'只是将引用(指向对象中的数据)复制到'position',因此当你执行'position = oldPosition'时,不会发生任何事情,因为它们都是同一个对象。您需要将位置的细节复制到新的对象中。 'var oldPos = {x:position.x,y:position.y ... etc',然后当你复制数据时做同样的事情,因为你需要恢复到原来的位置 – Blindman67

回答

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 
} 

希望这有助于。

+0

感谢您花时间解释这一点。真的很棒! –