工厂
我们写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); }};
大部分变量字段在本站的类型指南中均有提及,但要注意json与java之间两个区别:
- requirements现在是一个语句,它有三个参数:
- 建筑菜单有十大类别,在游戏内可建造的方块必须在其中,和json一样,写错了就会直接报错。投机取巧:在前面不要忘记
Category.
- 建筑可视性不是必须的,详见
core/src/mindustry/world/meta/BuildVisible.java
- 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画特效,可以耦合,也可以高度自定义,再用静态字段声明。
此处没有示例
至此我们写了一点基本的东西,接下来我们可以写一点更逊的东西。