Как убрать указанный c объект при столкновении с ним? - PullRequest
0 голосов
/ 19 января 2020

Я делаю игру 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. Есть ли лучший способ сделать это?

...