Я делаю игру Pacman, используя библиотеку 3. js.
Я использую алгоритм Stemkoski для обнаружения столкновений. Я хочу удалить точку, когда Пакман коснется ее. Вот как я создаю точки. Я также добавляю sh их к collidableDotsList
после добавления их в сцену.
for (var i = 0; i < 19; i++) {
var kulka = new THREE.Mesh(sphereGeometry, wireMaterialsphere);
kulka.position.set(425, 50, 900 - 100 * i);
scene.add(dot);
collidableDotsList.push(dot);
dot.name = i;
}
Также я читал, что должен назвать точки, а затем использовать функцию GetObjectByName
, но она не работает .
for (var vertexIndex = 0; vertexIndex < MovingCube.geometry.vertices.length; vertexIndex++) {
var localVertex = MovingCube.geometry.vertices[vertexIndex].clone();
var globalVertex = localVertex.applyMatrix4(MovingCube.matrix);
var directionVector = globalVertex.sub(MovingCube.position);
var ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize());
var collisionResults = ray.intersectObjects(collidableDotsList);
if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) {
scene.remove(scene.getObjectByName(i));
}
}
Кроме того, я использую ту же функцию для создания столкновения со стенами. Когда Пакман (MovingCube) касается стен, я не хочу, чтобы они проходили сквозь них go. Для этого я также использую алгоритм Стемкоски, например:
if (keyboard.pressed("A"))
//MovingCube.position.x -= moveDistance;
MovingCube.translateX(-3);
if (keyboard.pressed("D"))
//MovingCube.position.x += moveDistance;
MovingCube.translateX(3);
if (keyboard.pressed("W"))
MovingCube.translateZ(-3);
if (keyboard.pressed("S"))
MovingCube.translateZ(3);
var originPoint = MovingCube.position.clone();
for (var vertexIndex = 0; vertexIndex < MovingCube.geometry.vertices.length; vertexIndex++) {
var localVertex = MovingCube.geometry.vertices[vertexIndex].clone();
var globalVertex = localVertex.applyMatrix4(MovingCube.matrix);
var directionVector = globalVertex.sub(MovingCube.position);
var ray = new THREE.Raycaster(originPoint, directionVector.clone().normalize());
var collisionResults = ray.intersectObjects(collidableMeshList);
if (collisionResults.length > 0 && collisionResults[0].distance < directionVector.length()) {
if (keyboard.pressed("A"))
MovingCube.translateX(3);
if (keyboard.pressed("D"))
MovingCube.translateX(-3);
if (keyboard.pressed("W"))
MovingCube.translateZ(3);
if (keyboard.pressed("S"))
MovingCube.translateZ(-3);
}
И он в основном работает, но когда Пакман находится близко к стенам и клавиши клавиатуры go в другом направлении, иногда объект застревает в стенах и т. д. c. Есть ли лучший способ сделать это?