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
是必須的,另外的Size
和Metadata
是可選的。
- ItemType表示物品或方塊的型別,在forge中使用Blocks
和Items
表示。
- 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,謝謝。
----------------華麗麗的分割線---------------------
掃描加微信我微信訂閱號,文章更新第一時間提醒。