====== 工厂 ====== 我们写mod,最简单易上手的就是工厂了,作为一个科技类游戏,工厂总是不可缺少的一环。接下来我们就使用Java写工厂,并学习制作自定义渲染和特效。 注:本文一切代码没有经过实验,都是硫缺铅的颅内实验,如果有误,欢迎大家随意修改。 ===== 注册 ===== 首先,在ModBlocks类中,我们新建一个静态字段。为了写一个能出入物品和液体的工厂,这次我们需要将类型设置为 ''GenericCrafter'' ,类似这样: public class ModBlocks implements ContentList { public static Wall ironWall; public static GenericCrafter implosionCompressor; @Override public void load() { ironWall = new Wall("iron-wall"); implosionCompressor = new GenericCrafter("implosion-compressor") } } 接下来,我们需要给他添加一些**必须**的字段,如果你有json/js基础,下面这些东西你会无比的熟悉: implosionCompressor = new GenericCrafter("implosion-compressor") {{ requirements(Category.crafting, new ItemStack[]{ new ItemStack(Items.titanium, 100), new ItemStack(Items.copper, 20), new ItemStack(Items.lead, 200), new ItemStack(Items.silicon, 20) }); outputItem = new ItemStack(ModItems.iron, 5); craftTime = 60f; size = 3; hasItems = true consumes.items( new ItemStack(Items.titanium, 6), new ItemStack(Items.blast-compound, 2) ); hasLiquids = true; consumes.liquid(Liquids.cryofluid, 0.4f); hasPower = true; consumes.power(80f); }}; 大部分变量字段在本站的[[modding:type|类型指南]]中均有提及,但要注意json与java之间两个区别: * requirements现在是一个语句,它有三个参数: - 建筑菜单有十大类别,在游戏内可建造的方块**必须在其中**,和json一样,写错了就会直接报错。//投机取巧:在前面不要忘记''Category.''// - 建筑可视性不是必须的,详见''core/src/mindustry/world/meta/BuildVisible.java'' - 最后一个才是真正的建筑花费,通常来说你不会只用一种物品而且数目为1,所以写一个ItemStack是必不可少的。//投机取巧:先new ItemStack[],后面也是匿名类,但只有一层大括号,在其中new ItemStack(物品名, 数量),可以多来几个,中间用逗号隔开// * comsumes变成了一个类,他有三个方法,分别是items,liquid,power。//投机取巧:items的参数是若干个''new ItemStack(物品名, 数量)'',只有单种物品,也可以只写''(物品名, 数量)''。liquid也有类似items的结构,power直接给float就行。// ===== 加载顺序 ===== **在使用一个东西之前,确保已经注册了它。**在模组里的工厂使用了模组里的物品,就一定要保证ModItems类先于ModBlocks加载。出现了这种使用,就称ModBlocks依赖于ModItems,那个工厂依赖于那个物品。 如果在之后的编程中出现了两个类互相依赖,可以通过拆分类的方法解决。//例如:A类有a和b,B类有c和d,现在a依赖于d,c依赖于b,不拆分势必会无法解决依赖,这个时候我们就可以把B拆分成B1(包含c)和B2(包含d),让加载顺序变为B2-A-B1。// ===== 贴图 ===== 正常来说,游戏内的一格是32*32大小的,但是,这并不意味着不符合这个大小的贴图无法加载,只是会出现错位的现象,下面教学如何通过更换渲染方法来修复错位,并添加一些炫到爆炸的贴图特效。 注:这里**暂时**没有贴图和实例,将来**可能会添加**,可能会出现与客观事实不符的现象,欢迎随意修改。 ==== 狂暴绘制 ==== 在原版中,负责绘制方块的是''DrawBlock''类,如果我们想要更改方块的绘制,就是要把渲染使用的类变成自己写的,在游戏里,只需要修改drawer字段。 首先,我们需要新建一个类,命名为''RotateDraw'',我们把它放在一个该去的地方,为了见名知意,我们把它放在freedomMod.draw包下面去。//在src/下建立一个RotateDraw.java,包名设为freedomMod.draw// 接下来,我们需要从DrawBlock继承过来(为什么不是直接写?),重载draw(GenericCrafter.GenericCrafterBuild)的方法。 public class RotateDraw extends DrawBlock { @Override public void draw(GenericCrafter.GenericCrafterBuild) { //一些具体实现 } } 然后,在方块里添加一个''drawer=new RotateDraw()''就可以使用了。 当然,如果就这么写简直就是编程界的撒旦,理由是你完完全全没有做到**复用**代码,接下来我们来看看如何从这个渲染类中抽出能抽出去的东西。 在旋转渲染类中,我们可以抽出去旋转速度、移动时间、悬停时间,以及悬停xy偏移量,那么我们就可以写成这样: public class RotateDraw extends DrawBlock { public float rotateSpeed,rotateTime,hoverTime,xOffset,yOffset; @Override public void draw(GenericCrafter.GenericCrafterBuild) { //和上面一样,不过需要抽象出去一些东西 } } 这样,我们就成功的抽象出去了一些东西,记得把原来的drawer加点参数: drawer= new RotateDraw(3f,30f,30f,2f,0f) 这样,我们就在创造出了一个可以按需修改的渲染,在之后的编写中,我们可以任意使用这个渲染类,只需要更改参数就可以了。 ==== 逊毙特效 ==== 看Fx类,挑一个做填空题,去做实验,然后把结果告诉大家。 也可以新建freedomMod.Fx类,自己用draw画特效,可以耦合,也可以高度自定义,再用静态字段声明。 //此处没有示例// 至此我们写了一点基本的东西,接下来我们可以写一点更逊的东西。 ===== 此处没有示例 =====