Вверх ↑
Ответов: 247
Beta
лидер
#1: 2013-01-06 16:28:03 ЛС | профиль | цитата

Minecraft изнутри - статья 1, вступительная



Ну что же, привет всем. Я уже довольно долго думал, и все же решил начать цикл статей по внутреннему устройству майнкрафта.

Несмотря на внешнюю сложность и запутанность, на самом деле игра не так уж и нелепо устроена. Довольно много времени потребовалось чтоб разобраться и понять основные аспекты. Теперь же будем разбираться вместе


И так, в этой теме мы повторим основы - создадим блок.
Говорю сразу, мы исследуем и работаем с ваниллой - "чистым" MC, без модов типа ModLoader.

Приступим.


Создание блока

Так как с снапшота 12w18a клиент слился с сервером, моддить стало слегка легче - сразу же и MP тебе, и прочие прелести. Мы будем использовать версию 1.4.6.

Процесс настройки окружения описывался уже не раз и разжеван до мелочей. Я думаю, что вы знаете основы Java, скачали MCP, JDK, и выбрали среду разработки - Eclipse/NetBeans/просто блокнот. Для модификации я буду использовать Eclipse без MCP. Как такое реализовать, я расскажу позже (на примере эклипса). Декомпилируем код, и получаем набор исходников. Приступим.

Список блоков у нас хранится в классе Block. Наши действия:

  1. Отнаследоваться от класса Block, создав класс Block***
  2. Создать в классе Block public static final Block - переменную с именем блока и назначить ей значение в виде нового экземпляра нашего Block***
  3. Добавить наш блок в генераторы, создать крафт, etc по вкусу.


Для начала создадим сам наш блок. Рассмотрим, как устроена земля (BlockDirt)

package net.minecraft.src;

public class BlockDirt extends Block
{
protected BlockDirt(int par1, int par2)
{
super(par1, par2, Material.ground);
this.setCreativeTab(CreativeTabs.tabBlock);
}
}


Что делает данный код? Он декларирует класс BlockDirt, в своем конструкторе (public BlockDirt) вызывает конструктор родительского класса (Block) и добавляет наш блок на вкладку в режиме креатива.

Создадим наш блок под названием Test.
Для этого создадим по такому же образу и подобию одноименный класс:

package net.minecraft.src;

public class BlockTest extends Block
{
protected BlockTest(int par1, int par2)
{
super(par1, par2, Material.ground);
this.setCreativeTab(CreativeTabs.tabBlock);
}
}

Теперь добавим переменную в класс Block.

public static final Block test = (new BlockTest(146, 2)).setHardness(0.5F).setStepSound(soundGravelFootstep).setBlockName("test");

А вот здесь остановимся и разберем код поподробнее.
new BlockTest(146, 2)
Создаем новый экземпляр класса BlockTest. Конструктор принимает ID блока и ID текстуры из terrain.png. Я оставил ее как у земли - третью по слету (нумерация идет с нуля).
.setHardness(0.5F)
Только что созданному блоку зададим прочность в 0.5F (*.*F - тип float, число с плавающей запятой.)
.setStepSound(soundGravelFootstep)
Зададим звук шагов по блоку как у гравия. Список всех звуков, доступных для нас, находится "вверху" класса Block:
    public static final StepSound soundPowderFootstep = new StepSound("stone", 1.0F, 1.0F);
public static final StepSound soundWoodFootstep = new StepSound("wood", 1.0F, 1.0F);
public static final StepSound soundGravelFootstep = new StepSound("gravel", 1.0F, 1.0F);
public static final StepSound soundGrassFootstep = new StepSound("grass", 1.0F, 1.0F);
public static final StepSound soundStoneFootstep = new StepSound("stone", 1.0F, 1.0F);
public static final StepSound soundMetalFootstep = new StepSound("stone", 1.0F, 1.5F);
public static final StepSound soundGlassFootstep = new StepSoundStone("stone", 1.0F, 1.0F);
public static final StepSound soundClothFootstep = new StepSound("cloth", 1.0F, 1.0F);
public static final StepSound soundSandFootstep = new StepSound("sand", 1.0F, 1.0F);
public static final StepSound soundSnowFootstep = new StepSound("snow", 1.0F, 1.0F);
public static final StepSound soundLadderFootstep = new StepSoundSand("ladder", 1.0F, 1.0F);
public static final StepSound soundAnvilFootstep = new StepSoundAnvil("anvil", 0.3F, 1.0F);
Потом, не сегодня, мы разберемся, как создавать свои звуки.

.setBlockName("test")
А это - имя блока. Что оно означает - мы увидим чуть позже.

Что ж, давайте скомпилируем и посмотрим на наш новоиспеченный тестовый блок.
Пикчи





Тадам! Мы создали свой блок и назначили ему текстуру, и он не стыкуется с настоящей землей. А теперь настала пора поговорить об имени. У нашего блока его нет. Чтоб его назначить, идем в /lang/**_**.lang. Я добавлю название для английского, для русского добавлять точно так же, только другое имя файла.
Открываю этот файл и вставляю строчку вида
группа.объект.параметр=значение
Я вставлю
tile.test.name=Test
И сохраню. Запустим еще раз:
Результат


Вот и все, мы создали и назвали блок.

На этом я завершу эту статью, а завтра мы поговорим о реализации сетевой подсистемы Minecraft. Скажу вам, что там есть довольно много интересного и ничего сложного.


С вами был 901.

901 специально для MCGL. При копировании указание копирайта обязательно.

карма: 0
0