如何做碰撞预防? (玩家对象的重置位置)
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
}
希望对您有所帮助。
我在阻止我的播放器占据与 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
}
希望对您有所帮助。