为什么在我的 JavaScript 浏览器游戏中弹跳 Actors 不起作用?
Why do bouncing Actors in my JavaScript browser game not work?
我想实现一个飞过 space 的火箭,它会从传入的流星体反弹。目前我已经通过比较两个演员的 x 和 y 位置并在碰撞时交换他们的速度来实现它。碰撞检测和速度交换确实有效(由 console.log 证明),但在屏幕上它们只是有时反弹。
我试图确保所比较的演员的速度对象不引用相同的 JavaScript 对象(cSpeedX
等)。
游戏使用 Pixi JS 构建。
碰撞检测功能,为每个演员(所有流星体和火箭)执行
export const checkCollision = (current, objects) => {
objects.forEach((o) => {
if (current !== o) {
const dx =
current.x < o.x
? o.x - o.width / 2 - (current.x + current.width / 2)
: current.x - current.width / 2 - (o.x + o.width / 2);
const dy =
current.y < o.y
? o.y - o.height / 2 - (current.y + current.height / 2)
: current.y - current.height / 2 - (o.y + o.height / 2);
if (dx < 0 && dy < 0) {
const cSpeedX = current.speed.x;
const cSpeedY = current.speed.y;
const oSpeedX = o.speed.x;
const oSpeedY = o.speed.y;
current.speed.x = oSpeedX;
current.speed.y = oSpeedY;
o.speed.x = cSpeedX;
o.speed.y = cSpeedY;
}
}
});
火箭和流星体都实现了移动功能
this.move = (delta) => {
this.x += this.speed.x * delta;
this.y += this.speed.y * delta;
};
export const checkCollision = (current, objects) => {
objects.forEach((o) => {
if (current !== o) {
您还写道:The collision detection function, executed for each actor (all meteroids and the rocket)
所以我想某处也有这样的循环:
objects.forEach((o) => {
checkCollision(o, objects);
});
这意味着对于每对对象都会检查两次碰撞。
让我们假设 o1
和 o2
是一些不同的对象,并且它们发生碰撞。那么会发生什么? :
checkCollision(o1, objects); <-- swap speed between o1 and o2
...
checkCollision(o2, objects); <-- swap speed between o2 and o1
因此它们之间的速度将交换 2 次 - 换句话说:两个对象的速度将保持不变。
要调查是否确实如此,您可以像这样输入 console.log
(或打印对象 ID 的内容):
if (dx < 0 && dy < 0) {
console.log('swapping speed of of objects:');
console.log(current);
console.log(o);
const cSpeedX = current.speed.x;
然后准备两个物体碰撞时的情况并检查控制台日志。
我想实现一个飞过 space 的火箭,它会从传入的流星体反弹。目前我已经通过比较两个演员的 x 和 y 位置并在碰撞时交换他们的速度来实现它。碰撞检测和速度交换确实有效(由 console.log 证明),但在屏幕上它们只是有时反弹。
我试图确保所比较的演员的速度对象不引用相同的 JavaScript 对象(cSpeedX
等)。
游戏使用 Pixi JS 构建。
碰撞检测功能,为每个演员(所有流星体和火箭)执行
export const checkCollision = (current, objects) => {
objects.forEach((o) => {
if (current !== o) {
const dx =
current.x < o.x
? o.x - o.width / 2 - (current.x + current.width / 2)
: current.x - current.width / 2 - (o.x + o.width / 2);
const dy =
current.y < o.y
? o.y - o.height / 2 - (current.y + current.height / 2)
: current.y - current.height / 2 - (o.y + o.height / 2);
if (dx < 0 && dy < 0) {
const cSpeedX = current.speed.x;
const cSpeedY = current.speed.y;
const oSpeedX = o.speed.x;
const oSpeedY = o.speed.y;
current.speed.x = oSpeedX;
current.speed.y = oSpeedY;
o.speed.x = cSpeedX;
o.speed.y = cSpeedY;
}
}
});
火箭和流星体都实现了移动功能
this.move = (delta) => {
this.x += this.speed.x * delta;
this.y += this.speed.y * delta;
};
export const checkCollision = (current, objects) => {
objects.forEach((o) => {
if (current !== o) {
您还写道:The collision detection function, executed for each actor (all meteroids and the rocket)
所以我想某处也有这样的循环:
objects.forEach((o) => {
checkCollision(o, objects);
});
这意味着对于每对对象都会检查两次碰撞。
让我们假设 o1
和 o2
是一些不同的对象,并且它们发生碰撞。那么会发生什么? :
checkCollision(o1, objects); <-- swap speed between o1 and o2
...
checkCollision(o2, objects); <-- swap speed between o2 and o1
因此它们之间的速度将交换 2 次 - 换句话说:两个对象的速度将保持不变。
要调查是否确实如此,您可以像这样输入 console.log
(或打印对象 ID 的内容):
if (dx < 0 && dy < 0) {
console.log('swapping speed of of objects:');
console.log(current);
console.log(o);
const cSpeedX = current.speed.x;
然后准备两个物体碰撞时的情况并检查控制台日志。