☰
杀戮尖塔MOD制作入门:从零搭建Java环境到首个卡牌Mod
2026/10/23 20:23:04 网站建设 项目流程

简介:这份PDF教程面向《杀戮尖塔》Mod开发零基础玩家,从游戏本体安装、订阅modthespire、stslib、basemod三大支持库,到搭建Java开发环境与Maven配置,完整梳理了入门路径。教程以IntelliJ IDEA为例,详细说明创建Maven项目、编辑pom.xml引入BaseMod等依赖、利用${steam.path}指定Steam路径,并给出可运行的构建步骤。目录从准备工作、支持库订阅、IDE与Maven环境配置,延伸到构建项目、语法基础和监听继承,设置小作业便于边学边练。包内共1个PDF文件,压缩后约1.5MB,篇幅紧凑、章节清晰,适合作为手边查阅的入门手册。目前已有2121人学习下载,尤其适合首次接触Java或Steam创意工坊模组开发的玩家。读者跟随示例完成首个MOD项目后,会接触到控制台输出调试、变量与函数、类作用域、监听函数和继承等Java核心机制,能进一步理解杀戮尖塔的Mod结构,为自制卡牌、角色或新机制打下扎实基础。

1. 杀戮尖塔MOD制作入门:先别急着搜代码,先把这件事想明白

很多新手第一次接触杀戮尖塔MOD制作入门,都是因为同一个冲动:想让游戏里多一张自己设计的卡,或者想把某个角色改得更有趣。于是打开创意工坊,找到一堆看起来很厉害的MOD,订阅之后玩了两天,又开始想“别人能做,我是不是也能做”。可等你真正去搜资料时,看到的全是Java工程、依赖库、编译打包这类词,瞬间就劝退了。这就像你站在餐厅后厨门口,想学做一道菜,结果看到的是整面墙的锅具和调料,不知道从哪个瓶子开始拿。其实MOD这件事没有想象中那么玄学。MOD的本质并不复杂:游戏本体是用Java写成的,MOD就是另外一小段Java代码,通过一个叫ModTheSpire的“加载器”塞进游戏里,让游戏在运行时多出一些行为。你不需要先成为编程高手,只需要弄懂几个基础概念、把环境搭好、跑通一个最简陋的示例,就完成了入门的一大半。这套教程就是给你这条路的,适合完全零基础、从没碰过Java、甚至不知道Maven是什么的玩家。别怕,先把概念理清,我们再一步一步往下走。

2. 动手前先备齐三样东西:游戏本体、三个支持库和Java环境

很多人一想到“开发MOD”,第一反应是直接打开编辑器写代码。但杀戮尖塔的MOD开发和“新建一个文本文件”完全不同:它需要在已有游戏工程的基础上做扩展。所以动手之前,你要先确认三件事都齐了:游戏本体、三个创意工坊支持库、一套能写Java代码的环境。这三样缺一样,后面都会卡住。

2.1 为什么所有MOD都绕不开“三个支持库”

杀戮尖塔的MOD几乎都依赖三个支持库:ModTheSpire、BaseMod、stslib。它们的用处不太一样,但缺一个都不行。你可以把它们想象成装修房子的流程:ModTheSpire是“施工队入场证”,游戏启动时它会先启动一个MOD选择界面,告诉游戏这次要加载哪些外部代码;BaseMod是“物业给的施工规范”,它提供了一批接口,让你能把新卡牌、新遗物、新角色“登记”进游戏里;stslib则是一箱常用工具,很多MOD会调用它封装好的通用机制,避免重复造轮子。

第一次接触这些名词,记不住全称很正常,你只需要记住:这三个库是MOD的根基。它们负责把游戏本体和你的代码连接起来,游戏本体不会主动去读你写的代码,而是靠这三个库在中间牵线。顺带一提,如果你想玩别人做的MOD,同样得先把这三个库装上,它们也是运行一切MOD的先决条件。

2.2 在创意工坊订阅支持库:不到五分钟就能搞定

具体操作很简单。打开Steam客户端,进入杀戮尖塔的商店页面,找到创意工坊入口,然后依次搜索以下三个名字:ModTheSpire、BaseMod、stslib。搜到之后点击订阅即可,订阅后Steam会自动把它们下载到本地的创意工坊目录。

这里有个新手容易忽略的点:订阅完之后请确认它们真的下载完成了。有些玩家进游戏发现MOD没生效,回头一看,三个库根本没下载成功,只是订阅列表里多了三个名字。你可以在Steam的“下载”页面确认一下,或者直接去本地的创意工坊文件夹看看有没有对应的jar文件。下一步搭建开发环境时,我们要在配置文件里引用这些jar的真实路径,如果文件不存在,后面编译会直接报错,这是新手开场最容易翻车的地方。

2.3 IDE:你的Java“写字台”

写Java代码和写记事本完全是两回事,尤其对于零基础的新手,强烈建议从第一分钟就使用IDE(集成开发环境)。IDE可以理解成一张功能齐全的写字台:它帮你自动补全代码、用红波浪线标出写错的地方、一键运行Maven命令,还能让你看到项目里所有文件的树状结构。

目前主流的Java IDE主要是Eclipse和IntelliJ IDEA。这套教程以IntelliJ IDEA为例,你直接去官网下载社区版即可,社区版免费,对学习完全够用。第一次打开IDEA时它会问你选哪个主题、要不要装插件,这些都不重要,一路默认就好。新手不要在这里纠结太久,工具只是工具,重点是后面能把项目跑起来。Eclipse其实也完全可以,但为了避免教程中“在IDEA里点哪里”和你的界面对不上,干脆从开始就统一用同一个。

2.4 Maven:把源码“打包成成品”的流水线

如果你从没接触过Java,听到Maven这个词多半是一头雾水。简单说,Maven是一个项目管理和构建工具。它负责三件事:第一,管理你的代码依赖了哪些外部库;第二,按照固定的流程编译代码;第三,把编译好的内容打包成一个jar文件——也就是MOD最终的发布格式。

可以把它想象成一条食品加工流水线:你准备好原料(Java源码),Maven负责清洗(编译)、装盒(打包)、贴标签(复制到游戏MOD目录),最后产出一个可以直接吃的成品。杀戮尖塔的MOD本质上就是一个jar包,游戏加载时把它读进去,所以Maven是整套流程里少不了的环节。

2.5 Windows下配置Maven环境变量

这里我们只讲Windows的配置方法,其他操作系统可以类比操作。首先去Maven官网下载二进制压缩包,解压到一个你记得住的位置,比如E:\Maven\apache-maven-3.3.9。接下来要告诉系统“mvn命令住在哪里”,这就需要设置环境变量。

按下快捷键Win + Pause打开系统属性,点击“高级系统设置”,再点“环境变量”。然后在系统变量里新建一个变量,变量名填MAVEN_HOME,变量值填你刚才解压的路径。接着在系统变量里找到Path,选中它,点“编辑”,新建一行,写入;%MAVEN_HOME%\bin。保存之后打开一个新的命令行窗口,输入mvn -v,如果能看到版本信息,说明配置成功。

mvn -v

这里有一点要注意:环境变量设置完后,必须重新打开一个新的终端窗口才生效,在你已经开着的窗口里输入命令是没反应的。我第一次学的时候就卡在这一步,以为配置写错了,后来才发现只是窗口没刷新。这个坑很典型,先记下来,后面避坑章节还会再提。

3. 迈出第一步:从新建工程到跑出一个能被加载的MOD

环境搭好之后,信心最重要的一步来了:把第一个MOD工程建起来,哪怕它还没有任何功能,只要能出现在游戏的MOD列表里,你就已经击败了绝大多数“只下载不制作”的围观群众。这一章我们一步一步走,不要跳。

3.1 在IntelliJ IDEA里新建Maven项目

打开IDEA,选择“New Project”。在左侧找到Maven选项,直接点下一步,不需要勾选任何模板。填项目名的时候,可以起一个你喜欢的名字,比如tutorial,然后选择项目存放位置。IDEA会帮你生成一个标准的Maven工程目录结构,你不需要手动去创建那些文件夹。

创建完成后你会看到左侧的文件树,里面有几个自动生成的目录。其中.idea是IDEA自己的配置文件,跟MOD没有关系,不用碰;src是代码的家,它又分成main和test两部分,test是Maven自动生成的测试目录,暂时不用管;main下面还有java和resources两个文件夹,java里放代码,resources里放图片、JSON配置文件这类素材。记住这个大框架,后面写代码、放卡牌图片都会用到这两个目录。

3.2 编辑pom.xml:告诉Maven“去哪找游戏”

项目里有一个名为pom.xml的文件,它是整个Maven工程的中枢配置。第一次打开它会看到一堆初始内容,不用管,直接把它替换成下面这样:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>tutorial</artifactId> <version>0.1</version> <packaging>jar</packaging> <name>tutorialMod</name> <description>tutorial</description> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <steam.path>E:\SteamLibrary\steamapps</steam.path> </properties> <dependencies> <dependency> <groupId>bin</groupId> <artifactId>BaseMod</artifactId> <scope>system</scope> <version>1.0</version> <systemPath>${steam.path}/workshop/content/646570/1605833019/BaseMod.jar</systemPath> </dependency> <dependency> <groupId>bin</groupId> <artifactId>SlayTheSpire</artifactId> <scope>system</scope> <version>1.0</version> <systemPath>${steam.path}/common/SlayTheSpire/desktop-1.0.jar</systemPath> </dependency> <dependency> <groupId>bin</groupId> <artifactId>ModTheSpire</artifactId> <scope>system</scope> <version>1.0</version> <systemPath>${steam.path}/workshop/content/646570/1605060445/ModTheSpire.jar</systemPath> </dependency> </dependencies> <build> <finalName>tutorialMod</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <phase>package</phase> <configuration> <target> <copy file="target/tutorialMod.jar" tofile="${steam.path}/workshop/content/646570/你的MOD文件夹/tutorialMod.jar"/> </target> </configuration> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>

输入完这段内容后,IDEA右下角会弹出提示,说Maven配置发生了更改,这时选择Import Changes(导入更改),让IDEA重新读取配置。下面把这些关键参数逐一说清楚:

  • <steam.path>:这一项填的是你的Steam库路径,每个电脑可能不一样。如果你不知道自己的Steam库在哪,打开Steam设置,找到“下载”里的“Steam库文件夹”,照抄路径即可。后面所有依赖路径都以这里的值为基础。
  • <dependency>:声明了三个依赖,分别是游戏本体desktop-1.0.jar、BaseMod.jar和ModTheSpire.jar,它们都是支持库章节里提到的关键文件。注意这里的scope是system,表示直接从本地路径读取jar文件,这也是为什么必须先把支持库下载好。
  • <finalName>:决定最终打出的jar包叫什么名字。这里叫tutorialMod,你可以换成自己的MOD名。
  • 最后一个插件的作用是:每次打包完成后,自动把生成的jar文件复制到创意工坊对应的MOD目录里,省得你手动拷贝。

3.3 添加ModTheSpire.json:给MOD办一张“身份证”

光有jar包还不够,ModTheSpire在加载MOD时需要一个JSON文件来识别它的身份信息。这个文件必须放在src/main/resources目录下。右键点击resources目录,选择新建文件,文件名输入ModTheSpire.json,然后写入以下内容:

{ "modid": "tutorial", "name": "tutorialMod", "author_list": ["A", "B"], "description": "新手教程mod", "version": "0.0.1", "sts_version": "03-29-2018", "mts_version": "2.6.0", "dependencies": ["basemod"] }

逐个字段说一下:modid是MOD的唯一标识,建议用全小写;name是显示在MOD列表里的名字;author_list是作者列表,可以写多个;description是描述,会显示给玩家看;version是版本号,随便写;sts_version和mts_version分别表示这个MOD对应哪个游戏版本和ModTheSpire版本;dependencies声明这个MOD依赖哪些库,这里写了basemod。

写JSON时最容易犯的错就是括号不配对。JSON里{}表示一个对象块,[]表示一个数组,两者都必须成对出现。建议写完以后看一眼结构:每个左花括号都有对应的右花括号,每个字段后面用英文逗号分隔,最后一个字段后面不要加逗号。这一步出错,游戏里就会看不到这个MOD。

3.4 执行package:见证第一个jar诞生

所有配置文件就位后,开始测试构建效果。在IDEA右侧找到Maven面板,展开Lifecycle,双击package。Maven会按照生命周期依次执行编译、测试、打包,最后在target目录下生成tutorialMod.jar,同时自动复制到创意工坊MOD目录。

如果你更习惯命令行,也可以打开终端,进入项目目录,直接执行:

mvn package

看到BUILD SUCCESS就说明打包成功了。这时候去Steam启动杀戮尖塔,注意不是直接点“开始游戏”,而是要选择使用ModTheSpire的启动方式。打开后会先进入一个MOD选择界面,勾选BaseMod、ModTheSpire,以及你刚打出来的tutorialMod,然后点运行。进游戏后,在MOD菜单里就能看到你自己写的名字。这时的MOD还没写任何功能,但它已经是一条合法的MOD了。天天玩的游戏里突然出现“自己做的MOD”,这种成就感就是继续学下去最好的燃料。

4. 第一段代码:变量、函数、类和作用域,练熟这四样就能起步

项目框架已经搭好,接下来要往里面填真正的代码。这一章内容稍多一些,但每一样都是后续开发随时要用到的地基。不懂Java也没关系,跟着读一遍,再亲手敲一遍,感觉立刻就不一样了。

4.1 第一个Java类:让ModTheSpire知道“新MOD来了”

在src/main/java目录下,先新建一个包,包名建议用你的MOD小写名称,比如tutorial。包可以理解成文件夹,用来把同类代码放在一起。然后在包里新建一个类文件,命名为Tutorial。Java的类名有个不成文的规矩:首字母大写,多个单词之间大小写交错,比如TutorialHook、MyCharacter。

在这个类里,写入以下代码:

package tutorial; import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; @SpireInitializer public class Tutorial { public Tutorial() { } public static void initialize() { new Tutorial(); } }

一行一行解释。package tutorial;表示这个文件属于tutorial这个包;import ...表示引用ModTheSpire里的类,也就是要用到别人写好的代码;@SpireInitializer是Java里的一种注解,它告诉ModTheSpire:“这个类里有初始化内容,加载MOD时请务必执行它”;public class Tutorial定义了一个名为Tutorial的类;下面的Tutorial()是构造函数,负责创建一个类的对象;initialize()方法就是ModTheSpire会调用的初始化入口。这段代码的作用就一句话:让ModTheSpire知道,你创建了一个新的MOD。每一行都有自己的职责,先混个眼熟,后面几节会让这些概念活起来。

4.2 控制台输出:让log里出现你的第一句话

在开发过程中,你会经常看到ModTheSpire的log框不断滚动信息。那些内容就是游戏和MOD运行时输出的日志。现在你也可以让log主动说出你想说的话。在initialize()方法里加上一行:

System.out.print("hello world!");

Java里每个语句用英文分号结尾,分号表示“这句话说完了”。System.out.print的意思是往控制台输出一段文字,括号里可以是字符串,也可以是数字,甚至是表达式:

System.out.print("hello world! 5*6+30="); System.out.print(5 * 6 + 30); System.out.print("end of line!\n2+2=" + 4);

这里的+在字符串和数字之间表示拼接,比如"2+2=" + 4会输出“2+2=4”;\n是一个特殊字符,表示换行。修改完成后重新打包,启动游戏,在控制台就能看到这行输出。别小看这一招,以后写代码发现某功能没生效,第一件事就是在这里加输出语句,看它有没有被执行的痕迹。LOG是你和游戏之间唯一的沟通窗口,学会看它,等于给游戏装了对讲机。

4.3 变量:四种常用类型够你开局了

变量就好比附了名字的箱子,用来存放值。箱子类型不同,能装的东西也不一样。杀戮尖塔MOD开发中最常打交道的变量有以下四类。

整型用int表示,存的是整数,比如卡牌的攻击力、费用数值。浮点型用float或double表示,存的是小数,比如遗物触发的概率;数字后面加f表示float,否则默认是double。布尔型用boolean表示,它只存两个值:true和false,好比电灯开关,不是开就是关,常用于逻辑判断。字符串用String表示,存的是文本,比如卡牌名字、描述文字。

看一下几种典型的声明方式:

public int number; private float dot = 2.4f; public static boolean judge = true; public final String HELLO = "Hello world!";

声明变量时,public表示外部代码能访问,private表示只有类内部能用;static表示这个变量归整个类所有,而不是某个具体对象;final表示值一旦确定就不能改,也就是常量。常量的命名习惯是全大写加下划线,比如MAX_HEALTH。新手常犯的错是声明了变量不赋值就直接用,Java不允许这么做。任何变量都要先初始化再访问,常量更是一开始就必须赋值。

4.4 函数:处理输入、给出输出的小黑盒

函数可以理解成一台小型加工机:你从一头扔进原料,它从另一头吐出成品。函数负责把一系列操作封装起来,以后需要时只用喊一声它的名字,不必每次都重复写一遍逻辑。

private int print(String string, int num) { System.out.print(string); return num; } private void hello() { System.out.print("Hello world!"); return; }

第一个函数接收一个字符串和一个整数,然后把字符串打印出来,再把整数作为结果返回。括号里的string和num叫形式参数,调用时真正传入的值叫实际参数,两个名字互不相干。如果函数不需要返回任何值,就用void声明,return可以省略,等所有语句执行完函数自然结束。函数命名一般和变量一样,小写开头。这一节不用背,后续几乎每个功能都要写函数,写着写着就熟了。

4.5 类与对象:图纸和按图纸造出来的东西

Java是一门面向对象的语言,这句话对新手很不友好,换成“类与对象”就亲切多了。类是一张图纸,对象是按图纸造出来的实物。你玩的每张打击卡,运行时都是一张“图纸”造出来的对象;一个电球、一个敌人,同理。

A a = new A();

这行代码干了三件事:A表示某个类的名字,a是给这个对象起的代号,new是“造新对象”的动作。类里面既有描述状态的变量,比如打击卡的伤害值、玩家的生命值,也有描述行为的函数,比如电球攻击敌人的方法。在之前的入门类里,构造函数负责在最开始时执行一些操作,它没有类型标识符,因为它不能像普通函数那样被直接调用并返回结果。这也是类最朴素的理解方式:把状态和行为绑定在一起。

4.6 作用域:public、private和static到底在管什么

很多新手刚开始写代码时总喜欢全部用public static,图省事,结果到后面就分不清谁是谁了。其实这几个关键字并不难。

public表示任何人都能访问,private表示只有类内部能碰。IDE为了项目结构整齐,会把公开类单独放在一个文件里,其他类可以通过import语句引入这个类。import的完整路径读起来像文件路径:最后一个单词是类名,前面的单词是包名。

static则换了一种归属逻辑。普通成员归对象所有,一张打击卡的费用被改,不影响另一张打击卡;但静态成员归整个类所有,所有对象共享同一个值。比如记录“游戏里一共生成过多少张打击卡”的计数器,就应该用static。访问时也不需要通过对象,直接用类名即可:

strike a = new strike(); int dam = a.damage; int summary = strike.sum;

这段代码里,a.damage拿到的是某张打击卡的伤害,strike.sum拿到的是所有打击卡共享的统计值。区分对象与类是初学Java最容易绕晕的坎,但只要脑子里始终记着“图纸与实物”这对比喻,遇到问题就不容易慌。

5. 新手避坑手册:配置、路径、依赖与打包的常见问题

走完前四章的路,你基本已经把开发流程从头到尾跑了一遍。但第一次跑通这件事,几乎不可能不踩坑。这一章我把新手最常见的五个坑集中列出来,每个都按“现象→原因→解决”来讲,遇到问题时直接对号入座。

5.1 现象:pom.xml中依赖全部标红,或者提示找不到BaseMod.jar

原因是:steam.path写错了,或者三个支持库根本没下载成功,又或者IDEA还没导入更改。最常见的是玩家把steam.path想当然地写成了安装Steam的目录,而实际上它应该指向Steam库文件夹,也就是包含common和workshop的那一层。解决办法是打开Steam设置,查看“Steam库文件夹”,把路径完全复制过去;确认对应的jar文件真实存在于创意工坊目录下。另外,修改pom.xml后记得点击右下角的Import Changes,不然IDEA一直在用旧配置。

5.2 现象:在命令行输入mvn -v,提示“不是内部或外部命令”

原因是环境变量没配好。常见情况有三:MAVEN_HOME的变量值写错了位置、没有在Path里追加%MAVEN_HOME%\bin、或者环境变量设置完没有重开终端。解决方法是重新检查系统变量,确认两个位置都正确,然后务必新开一个命令行窗口再执行命令。如果还不行,直接在命令行里输入echo %MAVEN_HOME%,看系统认不认这个变量。

5.3 现象:打包成功,但游戏里的MOD选择界面看不到自己的MOD

原因通常是ModTheSpire.json没放对位置,或者文件内容格式有误。有些新手把JSON文件放到了src/main/java目录下,但正确位置是src/main/resources。另外,JSON里的括号配不齐、字段名拼错、编码不是UTF-8,都会导致识别失败。解决方法是先确认文件位置,再用一个JSON校验工具检查格式,并留意IDEA右下角是否提示了编码问题。

5.4 现象:勾选了MOD并运行,但游戏加载时提示版本不匹配

原因是sts_version和mts_version与本地游戏版本、ModTheSpire版本对不上。这两个字段的作用是提前声明兼容性,如果数值写得太旧或太新,加载器都会抛出异常。解决方法是去确认你当前安装的杀戮尖塔版本和ModTheSpire版本。如果你拿不准,先把sts_version写成你游戏的更新日期,mts_version写成ModTheSpire的当前版本,再调整到一致为止。

5.5 现象:游戏可以用,但MOD加载后log里有异常或者界面没变化

原因是代码里可能有运行时错误,或者你忘记在游戏里把MOD勾选上。很多新手改完代码、打包完成、进入游戏,却发现一切照旧,最后发现MOD列表里那些库根本没勾。还有一种情况,代码写完后没有重新打包,运行的都是旧jar。解决方法是养成固定习惯:每次改代码后,先执行package,再进入游戏,并确认勾选了BaseMod、ModTheSpire和你自己的MOD这三项。这个组合拳虽然机械,但能帮你躲开八成的假故障。

6. 让代码真正影响游戏:从监听函数起步,然后照着这条路继续走

到这一步,你已经能创建一个MOD、打包、加载,还能写出简单代码。但说到底,这些功能除了在log里打印文字,还没真正触碰到游戏的玩法。现在就来补上最关键的一环:让MOD“听到”游戏里发生的事情,并对这些事件做出反应。

6.1 监听函数:游戏里每抽一张卡,你的代码都会知道

ModTheSpire和BaseMod提供了一种叫“订阅”的机制。你先把你的MOD注册成某个事件的订阅者,之后游戏里一旦发生这个事件,你的代码就会被自动通知。利用这个机制写一个监听抽卡事件的MOD,代码极短:

package tutorial; import basemod.BaseMod; import basemod.interfaces.PostDrawSubscriber; import com.evacipated.cardcrawl.modthespire.lib.SpireInitializer; import com.megacrit.cardcrawl.cards.AbstractCard; @SpireInitializer public class Tutorial implements PostDrawSubscriber { public Tutorial() { BaseMod.subscribe(this); } public static void initialize() { new Tutorial(); } @Override public void receivePostDraw(AbstractCard abstractCard) { System.out.println(abstractCard.name); abstractCard.name = "NULL"; } }

这十几行代码里藏着两个重要的新知识点。第一个是implements PostDrawSubscriber:它表示“我这个类承诺实现抽卡事件的回调函数”。构造函数里的BaseMod.subscribe(this)就是在向BaseMod注册自己,让它以后每抽一张卡就通知我。第二个知识点藏在最后两行:abstractCard是这次抽到的卡牌对象,System.out.println(abstractCard.name)把卡名打到log里,紧接着把它改成"NULL"。你可能会好奇,为什么改的名字真正生效了?这就要提到Java里一个关键机制:

public static void swap(int a, int b) { int temp = a; a = b; b = temp; }

如果把两个整数传进swap,函数结束后原变量数值不会变,因为基本类型传的是值。但对象不一样,函数拿到的是对象的“引用”,相当于一把钥匙,用钥匙能直接打开门里的东西改掉。修改引用指向的对象本身,修改就会永久生效。所以abstractCard.name = "NULL"能真正把牌改名,这就是引用传递和值传递的区别。新手一开始不需要记术语,只要理解这个现象:基本类型传的是复印件,对象传的是钥匙。

同理,继承也是杀戮尖塔MOD里绕不开的玩法。游戏里的能量球有很多种,它们的行为各不相同,但都有共同的区域、都能被激发、每回合都会做一些操作。把这些共性抽到一个父类里,再由各种能量球去继承父类,就省去了重复写相同代码的麻烦。做卡牌时也是同一个思路:所有卡牌都继承自AbstractCard,你只需在自己类的构造方法里填上卡名、费用、伤害,再实现想要的效果即可。

6.2 下一步的三个台阶

到这里,你已经走完了“环境搭建→项目配置→基础语法→监听函数”这条入门主线。接下来的路,建议不要盲目啃大部头的Java书,而是直接围绕杀戮尖塔本身学。第一阶:打开BaseMod的官方Wiki和示例Mod,逐行阅读别人写的类,不懂的函数去查,查完再回来读。第二阶:自己动手做一张最简单的自定义卡牌,哪怕只是把一张打击改成伤害+1,也要坚持自己写完整个流程,这能把你之前学的所有知识点串起来。第三阶:试着做一个新的遗物或药水,它会逼你去查游戏里事件触发的更多接口,比任何教程都学得快。

我到现在还记得第一次把自己的卡做进游戏时的那个夜晚:看着仓库里那坨粗糙代码打包成功,打开游戏,自己设计的卡静静躺在卡池里,那种感觉不是“我学会了编程”,而是“我真的动了一个游戏”。但从那以后,我每次改完pom.xml都会强制自己复查一遍steam.path,每次打包进游戏前都会重新走一遍勾选MOD的流程。这些看似繁琐的习惯,让我少走了很多弯路。希望这篇杀戮尖塔MOD制作入门能帮你迈过那道最难的坎。希望帮到你,接下来,就等你的第一张卡问世了。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询