在这个CodePen演示中,您可以使用箭头移动“玩家”方块,在空格键上放置灯光,并且应该通过被推到相反方向来防止从任何方向越过蓝线。 “玩家”使用x和y速度变量创建运动,并在检测到碰撞时将它们乘以-1(+一些值)。
问题在于,在被推离墙壁后,“玩家”会卡在一个位置上,只能向后移动,而看起来卡在与之垂直的轴上。(例如-如果墙在玩家上方,则在撞击墙后只能向下移动,而不能向左或向右移动)
理论上,我希望有一个平稳的滑动式碰撞检测,其中卡在墙上的玩家会慢慢沿左侧或右侧滑动,具体取决于按下左箭头键还是右箭头键(通过尝试我能够实现这一点,但总是会“流动”某个方向,使玩家向某个方向滑动)。
我考虑使用光线或其他方法来检测碰撞,但它们似乎需要比普通方法更多的计算时间。如果有任何建议和建立可扩展的碰撞检测的任何建议,我将不胜感激。
以下是在演示中运动和碰撞检测的基本代码:
问题在于,在被推离墙壁后,“玩家”会卡在一个位置上,只能向后移动,而看起来卡在与之垂直的轴上。(例如-如果墙在玩家上方,则在撞击墙后只能向下移动,而不能向左或向右移动)
理论上,我希望有一个平稳的滑动式碰撞检测,其中卡在墙上的玩家会慢慢沿左侧或右侧滑动,具体取决于按下左箭头键还是右箭头键(通过尝试我能够实现这一点,但总是会“流动”某个方向,使玩家向某个方向滑动)。
我考虑使用光线或其他方法来检测碰撞,但它们似乎需要比普通方法更多的计算时间。如果有任何建议和建立可扩展的碰撞检测的任何建议,我将不胜感激。
以下是在演示中运动和碰撞检测的基本代码:
let xVelocity = 0;
let yVelocity = 0;
var blockedMapGrid = [[0,30],[0,50],[0,100],[0,150],[0,200],[0,250],
[50,0],[100,0],[150,0],[200,0],[250,0],[300,0]];
var animate = function() {
if (keyState[37]) {
xVelocity -= 1;
}
if (keyState[38]) {
yVelocity += 1;
}
if (keyState[39]) {
xVelocity += 1;
}
if (keyState[40]) {
yVelocity -= 1;
}
for (var i = 0; i < blockedMapGrid.length; i++) {
if (Math.abs(player.position.x - blockedMapGrid[i][0]) +
Math.abs(player.position.y - blockedMapGrid[i][1]) < 36) {
xVelocity = -xVelocity * 1.2;
yVelocity = -yVelocity * 1.2;
console.log("Blocked by " + blockedMapGrid[i][0])
};
}
player.position.x = player.position.x + xVelocity;
player.position.y = player.position.y + yVelocity;
yVelocity *= 0.80;
xVelocity *= 0.80;
camera.position.x = player.position.x;
camera.position.y = player.position.y;
requestAnimationFrame(animate);
renderer.render(scene, camera);
};