Skip to content

0x05 炮塔、弹药与 DrawPart

“口径即是正义,射程即是真理。”

没有强大的防御火力,你辛辛苦苦建立的硅钢生产线迟早会被敌人的炮火撕碎。在 Mindustry 中,炮塔(Turret)是保护核心的最重要屏障。

本章,我们将以《饱和火力》中的经典武装为灵感,学习如何制作使用物品作为弹药的物理火炮,以及消耗电力的能量武器,并深入研究 v7 版本赋予炮塔动态灵魂的 DrawPart 系统。

学习本章需要具备的基础:

  • 理解方块共通属性(如 size, health, requirements)。

炮塔分类与基础弹药:ItemTurret

使用物品作为弹药的炮塔称为 ItemTurret。它的精髓在于:填入不同的子弹,打出不同的效果

content/blocks/turrets/ 目录下创建一个 heavy-cannon.hjson(重型火炮):

hjson
{
  type: ItemTurret
  name: 重型火炮
  description: 发射大口径穿甲弹,对单体目标造成毁灭性打击。
  size: 3
  health: 1200
  
  // 射击属性
  reload: 60           // 装填时间(60 Tick = 1 秒)
  range: 240           // 射程(1 像素 = 1/8 方块,240 大约是 30 个方块的距离)
  recoil: 3            // 开火时的整体后坐力(炮管向后退的像素)
  shootCone: 15        // 射击锥角,只有目标进入炮口正前方 15 度范围内才会开火
  inaccuracy: 2        // 精准度误差(度数),数值越大越马枪
  
  // 转速与声音
  rotateSpeed: 2.5
  shootSound: bang     // 原版射击音效
  
  // 核心:弹药类型配置
  ammoTypes: {
    // 放入铜时发射的子弹
    copper: {
      type: BasicBulletType
      damage: 45
      speed: 5
      lifetime: 48     // speed * lifetime = 240,刚好等于炮塔射程
      width: 9
      height: 12
      ammoMultiplier: 2 // 1个铜可以转化为2发子弹
    }
    
    // 放入我们在 0x02 做的硅钢时,发射更强的穿甲弹
    my-first-mod-silicon-steel: {
      type: BasicBulletType
      damage: 120
      pierce: true     // 穿透效果
      pierceCap: 3     // 最多穿透 3 个目标
      speed: 8
      lifetime: 30     // 8 * 30 = 240
      width: 11
      height: 18
      frontColor: ffffff
      backColor: 7595D2
      ammoMultiplier: 1
      shootEffect: shootTitan // 开火时的原版特效
      smokeEffect: shootBigSmoke
    }
  }
  
  requirements: [
    copper/200
    lead/100
    graphite/50
  ]
  category: turret
}

能量武器与动态炮管:PowerTurret 与 DrawPart

除了消耗弹药,你还可以制作直接消耗电力的 PowerTurret。 更重要的是,在 v7 时代,炮塔有了 DrawTurretDrawPart 系统。这就意味着,你可以让你的炮塔拥有独立伸缩的炮管、发光的散热片,甚至是旋转的雷达!

创建一个 laser-blaster.hjson(光束发生器):

hjson
{
  type: PowerTurret
  name: 光束发生器
  size: 2
  health: 600
  reload: 40
  range: 180
  
  // 能量武器无需 ammoTypes,直接定义 shootType
  shootType: {
    type: LaserBulletType
    damage: 90
    length: 180
    colors: [7595D266, 7595D2, ffffff]
  }
  
  // 电力消耗:每Tick消耗 2 点(每秒 120)
  consumes: {
    power: 2.0
  }
  
  // 高级多部件绘制系统
  drawer: {
    type: DrawTurret
    // basePrefix 决定了炮塔底座的贴图,默认是 block-
    basePrefix: reinforced-
    
    // 活动部件列表
    parts: [
      {
        // 声明一个区域图层部件(需要额外画一张 laser-blaster-barrel.png)
        type: RegionPart
        suffix: -barrel     // 寻找以 '-barrel' 结尾的贴图
        mirror: false       // 是否镜像对称(如果炮管在中间就填 false,双管填 true)
        under: false        // 是否绘制在炮塔主体下方
        
        // 动画触发器:recoil 表示跟随开火后坐力动作
        progress: recoil
        
        // 动作表现:触发后坐力时,这个部件在 Y 轴(炮塔朝向)上向后退 2 像素
        moveY: -2.0
      }
    ]
  }
  
  requirements: [
    lead/50
    silicon/30
  ]
  category: turret
}

进阶动作 (progress)

除了 recoil(后坐力),progress 还可以是 warmup(预热,只要有目标就会上升)、charge(蓄力,跟随射击蓄力阶段)、heat(枪管发热)等。通过组合不同的部件和进度,你可以做出如同《饱和火力》中“先驱”炮塔那样机械感十足的动态火炮!

在设计了强大的炮塔之后,接下来我们该让这些子弹打在敌人身上时,产生更加震撼的视听反馈了。请看下一章:0x06 状态效果与特效。