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

感謝您花時間解釋這一點。真的很棒! –