目录

工厂

我们写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之间两个区别:

  1. 建筑菜单有十大类别,在游戏内可建造的方块必须在其中,和json一样,写错了就会直接报错。投机取巧:在前面不要忘记Category.
  2. 建筑可视性不是必须的,详见core/src/mindustry/world/meta/BuildVisible.java
  3. 最后一个才是真正的建筑花费,通常来说你不会只用一种物品而且数目为1,所以写一个ItemStack是必不可少的。投机取巧:先new ItemStack[],后面也是匿名类,但只有一层大括号,在其中new ItemStack(物品名, 数量),可以多来几个,中间用逗号隔开

加载顺序

在使用一个东西之前,确保已经注册了它。在模组里的工厂使用了模组里的物品,就一定要保证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画特效,可以耦合,也可以高度自定义,再用静态字段声明。

此处没有示例

至此我们写了一点基本的东西,接下来我们可以写一点更逊的东西。

此处没有示例