【发布时间】:2018-05-16 15:48:23
【问题描述】:
我正在构建一个无尽的跑步风格游戏,其中 (0,0) 处的角色只能在 X 轴上左右移动(使用箭头键或鼠标)。有两种类型的物体从z = -10000 向角色移动,一旦它们到达z = 10000(即角色后面和屏幕外),它们就会重置为z = -10000 我正在使用以下光线投射代码来检测两者之间的碰撞角色和两种类型的对象。
本质上,光线从渲染循环中的每一帧的每个角色顶点发射。如果光线与对象顶点之一相交并且距离接近角色(不确定它使用的确切距离),则检测到碰撞。
这是我的代码:
这在渲染循环中运行:
detectCollisionRaycaster(character, objectsArray);
这是碰撞检测功能:
let cooldown = false;
let objectMesh;
let collisionResults;
function detectCollisionRaycaster(originObject, collidedObjects) {
let originPoint = originObject.position.clone();
for (var vertexIndex = 0; vertexIndex < objectMesh.geometry.vertices.length; vertexIndex++) {
var localVertex = objectMesh.geometry.vertices[vertexIndex].clone();
var globalVertex = localVertex.applyMatrix4( objectMesh.matrix );
var directionVector = globalVertex.sub( objectMesh.position );
var raycaster = new THREE.Raycaster( originPoint, directionVector.clone().normalize() );
collisionResults = raycaster.intersectObjects( collidedObjects, true );
if ( collisionResults.length > 0 && collisionResults[0].distance < directionVector.length() && !cooldown) {
cooldown = true;
console.info("Object Collided");
setTimeout(function(){
collisionResults.length = 0;
cooldown = false;
}, 500);
}
}
}
问题
碰撞代码多次触发。我很确定这是因为对象正在向角色移动,因此对象的顶点与光线碰撞超过 1 个单帧,因此只要对象是,碰撞代码就会运行敌人的“内部”。
我想要什么:
我希望碰撞检测代码显式触发一次,暂停碰撞检测一段时间直到对象不再与角色碰撞,然后继续检测碰撞
我的尝试
我尝试在碰撞检测代码中设置一个超时函数,我认为这会阻止碰撞检测在渲染循环中运行,直到该时间结束,但是它似乎只运行一次代码,暂停超时,然后在对象位于角色“内部”的所有时间内继续运行检测到碰撞的代码。
【问题讨论】:
标签: javascript three.js