В настоящее время Createra проводит конкурс для студентов, участники которого могут соревноваться в создании карт. Я являюсь членом одной из команд, и моя команда, достаточно разобравшись в возможностях, предоставляемых проектом, решила запустить серию коротких, но крайне полезных руководств. Вы можете рассчитывать на информацию, представленную здесь, чтобы сократить время самостоятельного изучения.
Вы можете найти информацию о том, как создавать 3D-модели в VOXA или описать необходимые действия с JavaScript в Createra API.
В этом уроке мы подготовим краткие и более понятная информация для тех, кто не особо силен в программировании.

В этой статье будут рассмотрены способы сбора предметов (моделей VOXA) на карте. Всего их 3.
1. Сбор методом onClick():
2. Сбор методом onInteract()< br /> 3. Сбор через entity.onVoxelContact()

Важно отметить: чтобы понять, как настроить имя каждого элемента (модель VOXA), посмотрите на изображения ниже:

Метод onClick()

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

const lolipopClickable = world.querySelectorAll('#Lolipop'); 
// So, all items with the specified name 'Lolipop' will be selected. The variable lolipopClickable will be an array of our VOXA models. 
//You can also use world.querySelector('#name') to select only one item named 'name'.

Большой! Теперь мы можем написать код для сбора наших предметов:

lolipopClickable.forEach(item => {
    item.onClick(({button,distance}) => { 
        if (button ==='action0' && distance<=10) { // 'ation0' - left mouse button
            item.destroy(); // item removal
        }  
    });
});

Поскольку lolipopClickable — это массив, мы используем метод forEach для проверки его элементов. Параметр item означает каждый элемент нашего массива. Внутри метода onClick() мы можем написать действия, которые будут запускаться при нажатии левой (action0) или правой (action1) кнопки мыши.
Далее, указываем в параметрах button — кнопку, с которой будет собираться предмет, и максимальное расстояние от игрока до предмета расстояние, внутри которого будет производиться сбор. Если вы не укажете расстояние, предмет будет собран в пределах всей карты.

Вы можете увидеть результат ниже:

Подробнее о методе onClick()

Метод onInteract()

Это примерно то же самое, что и onClick, только выбор будет производиться нажатием кнопки «E» на клавиатуре. Этот метод позволяет описать действия для объекта, которые происходят при нажатии клавиши «E». В качестве параметра он принимает сущность игрока, т. е. entity.

Во-первых, давайте объявим и инициализируем наши объекты:

const banana = world.querySelectorAll('#Banana');

Затем мы пишем метод onInteract:

var count = 0; // 
banana.forEach(item => {
    item.enableInteract = true; item.interactRadius = 2; // Allow the player to interact with the object and determine the distance (analog of distance)
    item.onInteract(({entity}) => {
        count++;
        item.destroy(); // item.meshInvisible = true;
        world.say(`${entity.player.name} has collected `+count+' bananas!');
    });
});

В переменной count будет храниться количество собранных элементов.
world.say('text') — метод, используемый для вывода сообщения на экран игрока.
Чтобы использовать ${entity.player.name} необходимо использовать кавычки ``.

Результат ниже:

Подробнее о методе onInteract()

Метод entity.onVoxelContact()

В этом методе предметы собираются, когда игрок наступает на блок (воксель) с определенными координатами.

Объявить и инициализировать объекты:

const football = world.querySelectorAll('#Soccer');

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

world.onPlayerJoin(({ entity }) => {
    football.forEach((item,index,array) => { // array is the third parameter of the forEach method, but to use it, you must also designate the previous two parameters, item and index. 
        entity.onVoxelContact((voxelCoord) => { // a method that determines whether a player has stepped on the block we want or not
            if ((voxelCoord.x === 46 &&  voxelCoord.y === 8 && voxelCoord.z === 17)) {
                array[0].destroy(); // same as football[0]
            }
            
            if ((voxelCoord.x === 44 &&  voxelCoord.y === 8 && voxelCoord.z === 17)) {
                array[1].destroy(); // same as football[1]
            }
            
            if ((voxelCoord.x === 42 &&  voxelCoord.y === 8 && voxelCoord.z === 17)) {
                array[2].destroy(); // same as football[2]
            } 
        });
    });
});
// [0], [1], [2] are the indices of the objects nested in the array. The countdown starts from zero, so the index [0] is assigned to the first object.

Обратите внимание, что нам нужен метод world.onPlayerJoin(({entity}) =› {}) с параметром «entity», чтобы использовать entity.onVoxelContact(voxelCoord) внутри него и любые другие методы, начинающиеся с «entity.*».

Чтобы найти координаты нужного блока, нужно включить Консоль отладки и навести мышку на блок:

После этого при наведении мышки на любой блок будут показаны его координаты:

Результат:

Подробнее о методе onVoxelContact()

Итак, в этой статье мы разобрались с 3 способами сбора предметов (моделей VOXA) при создании карты в Createra. Вы можете использовать приведенные выше примеры в качестве готовых шаблонов.
Это только первая статья, в ближайшее время мы опубликуем подробные руководства по другим интересным темам.
Оставайтесь с нами и станьте частью Createra!

Ссылки на социальные сети Createra: Twitter | Раздор| Веб

Наши ссылки в социальных сетях:

  • Медиа-ссылки XC: Telegram | Дискорд (okllllll#5374)
  • Медийные ссылки SourDiesel: Telegram | Раздор (SourDiesel#8726)