Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Вклады
                Кубы - Структура Блочного Мира
                    Инструменты
                        Собирание(Picking)

Собирание(Picking)

Опубликованно: 25.06.2017, 21:46
Последняя редакция, Andry: 25.06.2017 23:42

Вы уже узнали, как создать блочный мир и изменять его из своего кода. Но было бы хорошо иметь еще и «функцию сборки с помощью щелчка мыши»? (Minecraft приветствует)

Фреймворк помогает вам получить местоположение блока, например, с помощью указателя мыши — При получении координат вы можете использовать их для добавления или удаления блока.

BlockNavigator

Класс BlockNavigator содержит различные методы, которые помогут вам в перемещении по вашему блочному миру, без проблем с координатами, типами бросков или кусками. Метод, который нам нужен для (мыши), состоит в следующем:

public static Vector3Int getPointedBlockLocation(BlockTerrain blockTerrain, Vector3f collisionContactPoint, boolean getNeighborLocation){
    //Какой-то таинственный код, который возвращает местоположение
    //блока на местности, которое сохраняется
    //в указанное collisionContactPoint (мировые координаты)
    //Если вы установите для getNeighborLocation значение true, вы можете
    //получить пустой блок зазор перед вами
    //(например Если вы хотите добавить блок к блоку, который вы нажали)
}

Получить место указываемое курсором / RayCasting

Таким образом, вышеупомянутому методу требуется collisionContactPoint. Это точка которую вы выбрали в своем мире, в момент клика мышью. К счастью, jMonkeyEngine предлагает raycasting, который позволяет получить именно эту точку.

Я рекомендую сначала прочитать учебник Hello Picking, так как остальная часть этой главы не имеет ничего общего с самим фреймворком Кубов.

Это метод, я создал в качестве тестового примера выбора мышью в блочном мире. Он возвращает CollisionResult указателя мыши и указанный узел: (Как правило, это будет узел BlockTerrain)

private CollisionResults getRayCastingResults(Node node){
    Vector3f origin = cam.getWorldCoordinates(new Vector2f((settings.getWidth() / 2), (settings.getHeight() / 2)), 0.0f);
    Vector3f direction = cam.getWorldCoordinates(new Vector2f((settings.getWidth() / 2), (settings.getHeight() / 2)), 0.3f);
    direction.subtractLocal(origin).normalizeLocal();
    Ray ray = new Ray(origin, direction);
    CollisionResults results = new CollisionResults();
    node.collideWith(ray, results);
    return results;
}

Вы можете использовать ближайший CollisionResult для получения collisionContactPoint с вашим BlockTerrain и, наконец, получить «местоположение выбранного блока:

private Vector3Int getCurrentPointedBlockLocation(boolean getNeighborLocation){
    CollisionResults results = getRayCastingResults(terrainNode);
    if(results.size() > 0){
        Vector3f collisionContactPoint = results.getClosestCollision().getContactPoint();
        return BlockNavigator.getPointedBlockLocation(blockTerrain, collisionContactPoint, getNeighborLocation);
    }
    return null;
}

Время подводить итоги: теперь вы можете получить текущее местоположение блока, на который вы указали мышью, в любое время, когда захотите. :)

Woah — Давайте построим Minecraft!

Один хороший пример зарегистрируйте слушатель мыши (см. Hello Input) и выполнить следующий код, когда пользователь совершит клик:

//Получите свободное от блока пространства, на мете блока на который смотрел пользователь...
Vector3Int blockLocation = getCurrentPointedBlockLocation(true);
//(Расположение блока равно null, если пользователь смотрит в небо или вне карты)
if(blockLocation != null){
    //... и разместите там блок :)
    blockTerrain.setBlock(blockLocation, CubesTestAssets.BLOCK_WOOD);
}

И это все — вы только что создали свой собственный блок-редактор, похожий на minecraft. Брось себе вызов и реализовать другую кнопку мыши, чтобы удалить выбранный блок (обратите внимание на параметр getNeighborLocation).

test_picking

Дальнейшие улучшения

  • Создание различные типы взаимодействий между игроком и блоком (открывайте двери, включайте переключатели, уничтожайте блок и.т.д.) и способы определения собственных взаимодействий

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.