差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
javamodding:7_productions [2022/04/12 13:53] – 此处没有示例 硫缺铅javamodding:7_productions [2022/04/12 14:11] (当前版本) – [狂暴绘制] 硫缺铅
行 1: 行 1:
 +====== 工厂 ======
 +我们写mod,最简单易上手的就是工厂了,作为一个科技类游戏,工厂总是不可缺少的一环。接下来我们就使用Java写工厂,并学习制作自定义渲染和特效。
 +
 +注:本文一切代码没有经过实验,都是硫缺铅的颅内实验,如果有误,欢迎大家随意修改。
 +===== 注册 =====
 +首先,在ModBlocks类中,我们新建一个静态字段。为了写一个能出入物品和液体的工厂,这次我们需要将类型设置为 ''GenericCrafter'' ,类似这样:
 +<code>
 +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")
 +    }
 +}
 +</code>
 +接下来,我们需要给他添加一些**必须**的字段,如果你有json/js基础,下面这些东西你会无比的熟悉:
 +<code>
 +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);
 +}};
 +</code>
 +大部分变量字段在本站的[[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)的方法。
 +
 +<code>
 +
 +public class RotateDraw extends DrawBlock {
 +    @Override
 +    public void draw(GenericCrafter.GenericCrafterBuild) {
 +    //一些具体实现
 +    }
 +}
 +
 +</code>
 +
 +然后,在方块里添加一个''drawer=new RotateDraw()''就可以使用了。
 +
 +当然,如果就这么写简直就是编程界的撒旦,理由是你完完全全没有做到**复用**代码,接下来我们来看看如何从这个渲染类中抽出能抽出去的东西。
 +
 +在旋转渲染类中,我们可以抽出去旋转速度、移动时间、悬停时间,以及悬停xy偏移量,那么我们就可以写成这样:
 +<code>
 +
 +public class RotateDraw extends DrawBlock {
 +    public float rotateSpeed,rotateTime,hoverTime,xOffset,yOffset;
 +    @Override
 +    public void draw(GenericCrafter.GenericCrafterBuild) {
 +    //和上面一样,不过需要抽象出去一些东西
 +    }
 +}
 +
 +</code>
 +
 +这样,我们就成功的抽象出去了一些东西,记得把原来的drawer加点参数:
 +
 +    drawer= new RotateDraw(3f,30f,30f,2f,0f)
 +这样,我们就在创造出了一个可以按需修改的渲染,在之后的编写中,我们可以任意使用这个渲染类,只需要更改参数就可以了。
 +
 +==== 逊毙特效 ====
 +
 +看Fx类,挑一个做填空题,去做实验,然后把结果告诉大家。
 +
 +也可以新建freedomMod.Fx类,自己用draw画特效,可以耦合,也可以高度自定义,再用静态字段声明。
 +
 +//此处没有示例//
 +
 +
 +至此我们写了一点基本的东西,接下来我们可以写一点更逊的东西。
 +
 +===== 此处没有示例 =====
 +
 +