1. 程式人生 > >Minecraft Forge程式設計入門二 “工藝和食譜”

Minecraft Forge程式設計入門二 “工藝和食譜”

從現在開始我們就要開始真正寫程式碼了,還沒有來得及配置環境的同學可以參考Minecraft Forge程式設計入門一 “環境搭建”這篇文章來進行環境搭建。

工藝(Craft)和食譜(Recepe)

所謂的工藝和食譜是指在Minecraft中物品的合成和合成表。
- 工藝:指由一種或幾種物品合成出另外一種物品,
如常見的火把的合成:

  • 食譜:泛指物品合成的擺放順序。有有形和無形兩種,其中有形要求合成時物品間的相對位置不能變即形狀不變,無形則只要求物品滿足條件即可對形狀沒要求。
    如指南針的合成是有形的:

    稍微改變一下任何一個物品的順序就無法合成了:

無形的食譜較少,當合成材料是一個的時候,可以說他是有形也可以說是無形。


或者

合成前的基礎知識

ItemStack

在Minecraft中每種型別的方塊和物品都不是多例項的,可以理解為你看到的土塊在遊戲記憶體中只是一個例項而已。這樣做的目的顯而易見,就是為了減少記憶體佔用。
那如果我要表示一塊土塊要怎麼做呢?

ItemStack dirtStack = new ItemStack(Blocks.dirt);

n塊土塊呢?

ItemStack dirtStack = new ItemStack(Blocks.dirt,n);

那如果不是土塊而是羊毛呢?大家都知道羊毛是有顏色之分的?

ItemStack woolStack = new
ItemStack(Blocks.wool, 2, 15);

ItemStack的構造方法大隻就這三種,總結一下起語法:

ItemStack stack = new ItemStack((Object)ItemType,[(int)Stack Size],[(Object) Metadata]);

其中ItemType是必須的,另外的SizeMetadata是可選的。
- ItemType表示物品或方塊的型別,在forge中使用BlocksItems表示。
- Size表示物品或方塊的數量。
- Metadata表示ItemType對應物品或方塊的附加屬性。

如果ItemType是羊毛Blocks.wool的話,Metadata就表示羊毛的顏色,Metadata取十進位制Dec行的值。羊毛顏色如下:

由於在後面可能大量用到不同種類的ItemStack,這裡我們定義一個java類,專門用來提供一些常用的ItemStack。

package com.zql.mc.zmod.itemstack;

import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;

/**
 *
 * @author scott 定義一些常用的物品組
 */
public class ArticleStacks {

    /**
     * 鑽石 * 1
     */
    public final static ItemStack DIAMOND_STACK_1 = getItemStack(Items.diamond, 1);
    /**
     * 土塊 * 1
     */
    public final static ItemStack DIRT_STACK_1 = getItemStack(Blocks.dirt, 1);

    /**
     * 沙子 * 1
     */
    public final static ItemStack SAND_STACK_1 = getItemStack(Blocks.sand, 1);

    /**
     * 羊毛 * 1 橙色
     */
    public final static ItemStack WOOL_ORANGE_1 = getItemStack(Blocks.wool, 1, 1);

    /**
     * 羊毛 * 1 黃色
     */
    public final static ItemStack WOOL_YELLOW_1 = getItemStack(Blocks.wool, 1, 4);

    /**
     * 羊毛 * 1 黑色
     */
    public final static ItemStack WOOL_BLACK_1 = getItemStack(Blocks.wool, 1, 15);

    /**
     *
     * @param item
     *            物品
     * @param count
     *            物品數量
     * @return
     */
    public static ItemStack getItemStack(Item item, int count) {
        return new ItemStack(item, count);
    }

    /**
     *
     * @param block
     *            方塊
     * @param count
     *            方塊數量
     * @return
     */
    public static ItemStack getItemStack(Block block, int count) {
        return new ItemStack(block, count);
    }

    /**
     *
     * @param block
     *            方塊
     * @param count
     *            方塊數量
     * @param metaData
     *            元資料,如方塊是羊毛Wool的話,metaData的值是0~15,表示不同的顏色。
     * @return
     */
    public static ItemStack getItemStack(Block block, int count, int metaData) {
        return new ItemStack(block, count, metaData);
    }
}

讀者也可以根據自己的需求往裡面加不同的ItemStack。

無形合成配方

無形合成配方對物品或方塊的順序位置沒有要求。
首先看一下新增無形合成配方的語法:

GameRegistry.addShapelessRecipe(ItemStack result, Object... recipe);

其中result表示合成結果,... recipe表示配方陣列。

下面我們看一個簡單的例子,用一個土塊和一個沙塊來合成一個鑽石,��是不是不符合邏輯,沒關係,我們要的就是這種效果。

@Mod(modid = ZMod.MODID, version = ZMod.VERSION, name = ZMod.MOD_NAME)
public class ZMod
{
    public static final String MODID = "ZMod";
    public static final String VERSION = "1.0";
    public static final String MOD_NAME = "Z Mod";

    @Instance(value = ZMod.MODID) //Tell Forge what instance to use.
    public static ZMod instance;

    @EventHandler
    public void init(FMLInitializationEvent event)
    {
        //這句是關鍵,ArticleStacks是我們在上面定義的工具類,用於提供ItemStack,這句程式碼的意思是使用一塊土塊和一塊沙塊合成一顆鑽石,並且是無需的合成配方。
        GameRegistry.addShapelessRecipe(ArticleStacks.DIAMOND_STACK_1, ArticleStacks.DIRT_STACK_1,ArticleStacks.SAND_STACK_1);
    }
}

執行結果:


這就是無形合成配方,你看懂了嗎?

有形合成配方

與無形合成配方比較,有形的合成配方在程式碼書寫上稍微有些複雜,我們來看有形合成配方的語法:

GameRegistry.addRecipe(ItemStack result,String row1, [String row2[,String row3]],char itemType1, ItemStack itemStackType1[, ... char itemTypeN, ItemStack itemStackTypeN]);

語法看著比較晦澀,還是看幾個實際的例子吧。
- 還是土和沙合成鑽石,只不過這次的合成配方類似:
| |A|B|
|A| |B|
其中A表示土塊,B表示沙塊,程式碼如下:

@EventHandler
public void init(FMLInitializationEvent event)
{
    GameRegistry.addShapedRecipe(ArticleStacks.DIAMOND_STACK_1,
            " AB",
            "A B",
            'A',ArticleStacks.DIRT_STACK_1,
            'B',ArticleStacks.SAND_STACK_1);
}

執行結果如下:


結合圖片,這段程式碼應該不難理解了,在配方只有兩行的情況下,兩行的位置可以是1,2兩行或者2,3兩行,但不能是2,3兩行。即他們之間的相對位置不能變。當然字母可以是其它任何你喜歡的字母。
配方中如有空格子,用英文狀態下的空格表示。

  • 再看一個三行配方的例子,這次是土塊和羊毛合成鑽石,配方形狀如下:
    |A| | |
    | | | |
    | | |B|
    A是土塊,B是羊毛
    程式碼如下:
@EventHandler
public void init(FMLInitializationEvent event)
{
    GameRegistry.addShapedRecipe(ArticleStacks.DIAMOND_STACK_1,
            "A  ",
            "   ",
            "  B",
            'A',ArticleStacks.DIRT_STACK_1,
            'B',ArticleStacks.WOOL_BLACK_1);
}

執行結果如下:

有形的合成配方是不是也是比較簡單的?期待你們能想出更多好玩的配方��。

熔鍊

在Minecraft中有這麼一個叫做熔鍊的概念,那何謂熔鍊呢?

熔鍊指的就是提煉物質,在Minecraft中熔鍊包括:melting, baking, cooking, burning, drying, or producing。其實就是常見的烤麵包,烤土豆,製作蛋糕等操作。

其語法是:

GameRegistry.addSmelting(Object inputItem, ItemStack result, float experience);

inputItem表示熔鍊前的物品,可以是Item也可以是Block更可以是ItemStack,result表示熔鍊後的物品。experience表示熔鍊獲得的經驗值。

這部分我嘗試了將土塊熔鍊成鑽石的操作,結果不起作用。可能這裡的熔鍊需要物品間有一定的聯絡。
這裡等後面具體講Blocks和Items的時候在做分析。

總結

那麼Minecraft的合成部分就講這麼多,後面開始教大家怎麼自定義Blocks和Items,謝謝。

----------------華麗麗的分割線---------------------
掃描加微信我微信訂閱號,文章更新第一時間提醒。

參考資料