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

Зарегистрируйте свои блоки

Опубликованно: 25.06.2017, 14:17
Последняя редакция, Andry: 25.06.2017 22:24

Чтобы добавить блоки в фреймворк, вам просто нужно добавить их в BlockManager. Это делается, указанием объекта блока (необходимо расширить cubes.Block, переопределив методы, которыми вы можете указать собственное поведение). Каждому блоку нужен хотя бы один «скин(шкура)», который вы должны передать в конструкторе класса cubes.Block). «Скин» содержит всю информацию для отображения блока — Texture-Index в атласе, прозрачности и.т.д.

После инициализации вашего объекта вы должны зарегистрировать его в BlockManager:

BlockManager.register(myBlockObject);
Использование собственных блоков на данный момент должно работать. Если вы столкнулись с проблемами, вы можете протестировать свой код с использованием блоков по умолчанию (например, CubesTestAssets.BLOCK_GRASS).

Вы можете зарегистрировать их, вызвав CubesTestAssets.registerBlocks();.

Блок с одной текстурой

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

//Каменная текстура находится в 10-й колонке и 1-й строке в текстурном атласе
Block blockStone = new Block(new BlockSkin(new BlockSkin_TextureLocation(9, 0), false));
BlockManager.register(blockStone);

Блоки с разными текстурами на гранях

Теперь пришло время получить более красивые блоки. Деревянный блок, известный в Minecraft, имеет две текстуры: верх/низ (поперечный разрез) и левый/правый/передний/задний (кора). Простой способ задать текстуру для каждой грани — просто нанести 6 текстур на скин (в правильном порядке:P):

Block blockWood = new Block(new BlockSkin[]{
    new BlockSkin(new BlockSkin_TextureLocation(4, 0), false),
    new BlockSkin(new BlockSkin_TextureLocation(4, 0), false),
    new BlockSkin(new BlockSkin_TextureLocation(3, 0), false),
    new BlockSkin(new BlockSkin_TextureLocation(3, 0), false),
    new BlockSkin(new BlockSkin_TextureLocation(3, 0), false),
    new BlockSkin(new BlockSkin_TextureLocation(3, 0), false)
});
BlockManager.register(blockWood);

Блоки с изменяемой текстурой

И последнее, но не менее важное: что, если блок хочет изменить свою текстуру в соответствии со своей средой?

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

Block blockGrass = new Block(new BlockSkin[]{
        //Мы указываем 3 скина, которые нам нужны:
        //Трава, Земля-Трава-Переход и Земля
        new BlockSkin(new BlockSkin_TextureLocation(0, 0), false),
        new BlockSkin(new BlockSkin_TextureLocation(1, 0), false),
        new BlockSkin(new BlockSkin_TextureLocation(2, 0), false)
    }){

    @Override
    //Возвращаемое число указывает индекс
    //скина в предыдущем объявленном блоке BlockSkin
    protected int getSkinIndex(BlockChunkControl chunk, Vector3Int location, Block.Face face){
        if(chunk.isBlockOnSurface(location)){
            switch(face){
                case Top:
                    return 0;

                case Bottom:
                    return 2;
            }
            return 1;
        }
        return 2;
    }
};
BlockManager.register(blockGrass);

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

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

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