前言

​ 这个启动器的设计灵感来源于曾经的御三家启动器:HMCL,PCL和Nsiso启动器,采用了HMCL相同的JavaFX来设计UI部分,兼顾美观和Java跨平台特性。这源于我本身是Mac用户,就很遗憾无法在Mac上使用PCL这样闭源且仅Win平台的启动器。

​ 在UI上会更加类似于目前暂时停更的Nsiso启动器,算是一种致敬,说实话我很喜欢Nsiso亚克力模糊的风格,但可惜在5.0内测并没有延续下去……

​ 开发这款启动器的根本原因是想通过亲自编写启动器来更加深入了解Java GUI编程这个比较冷门的领域,同时做出一款更加简单纯粹,同时比较极客风格的开源启动器,和各位大佬互相切磋学习,让每位有基础Java知识的朋友都可以定制属于自己的启动器。

​ 鉴于本人才疏学浅和学业繁忙,启动器更新速度极慢,同时技术实现较为简单,如有出错请多多包涵,我会努力学习!

项目介绍

SNGL全名: Snow No Girlfriend Launcher (bushi)

​ SNGL Not a General minecraft Launcher

​ 是一款基于Java开发的,跨平台开源MC启动器。目前正在Alpha早期测试阶段!!!使用Java实现底层启动逻辑,由JMCCC开源库强力驱动,JavaFX实现GUI,目前使用Atlantafx样式表作为默认UI主题,Java开发环境为Java17,使用Maven 3.0+进行项目管理。

​ 目前代码托管于自建代码托管平台Gitea

​ 选择Java17的很大一个因素是因为JavaFX在17上拥有更多的CSS样式资源,支持更多的新特性,毕竟目前MC在1.18+也进入了Java17时代,也算是顺应时代潮流了。

目前在本人的设备上的开发环境是ARM64平台的MacOS14+Zulu JDKFX 17,IDE采用Intellj IDEA

主界面图片展示:

(左侧为Debug模式下启动器日志输出区,接下来会设计开关使其可以自由开关)

SNGL Alpha v0.2

底层设计

​ SNGL整体上采用模块化的设计思路,每个包都实现独立功能互不干扰,有利于后期将JMCCC启动核心更换为自研核心等技术迭代和插件开发工作。

项目文件结构如图:

项目文件结构

​ AppCore包:正如其名,Core代表该包内存放的是本程序的核心底层逻辑代码,目前包含LaunchCore,DownloadCore和SystemState三个部分。LaunchCore即MC游戏启动部分代码,通过调用JMCCC库中的launch部分并传入部分启动参数来启动Minecraft游戏本体,用户登录模块也是包含在JMCCC中直接调用,在JMCCC3.0中已经可以支持微软登陆;DownloadCore则是通过调用JMCCC中download模块来实现下载功能,目前还在熟悉功能,支持非阻塞式和多线程下载,但是需要额外的库支持,同时也可以自定义下载api比如加入bangbang93的下载源来加速官方源速度,这会在日后实现Forge、Fabric的自动安装;最后是SystemState,调用oshi库来获取系统状态信息,这个库目前处于闲置状态,后面的话计划用于设计主界面小控件来当作数据监控面板实时显示系统资源占用率。

​ HelloApplication则是最基本的代码起手式,是整个程序的入口这个没有什么好讲的地方。

​ HelloController是本程序最重要的一部分代码,用于控制UI中各个元素的行为动作,基本上90%的UI逻辑都在这里被定义,与之相对应的则是resources中的。hello-view.fxml。hello-view.fxml在JavaFX中用于定义各UI控件,比如尺寸位置属性等等,而HelloController中的每一个类都绑定了一个控件来定义该控件的行为,比如:

private void InitializeMaxMem(){//初始化最大内存设置
    GlobalMemory memory = OshiUtil.getMemory();
    double memoryTotal = memory.getTotal()/ (1024 * 1024);
    int intMemoryTotal = (int) memoryTotal;
    SetMaxMem.setMax(intMemoryTotal);
    SetMaxMem.setValue(intMemoryTotal/4);
    MaxMemInput.setText(String.valueOf(SetMaxMem.getValue()));
    LaunchCore.Max_Mem = (int) SetMaxMem.getValue();
}

以上代码即定义了InitializeMaxMem类用于定义一个初始化最大内存设置的操作,其中SetMaxMem.setMax(intMemoryTotal);等语句即用于控制SetMaxMem这个Slider类型的控件,而在hello-view.fxml中就有如下定义来描述这个控件

<Slider fx:id="SetMaxMem" blockIncrement="1024.0" layoutX="128.0" layoutY="157.0" majorTickUnit="1024.0" minHeight="-Infinity" minWidth="-Infinity" minorTickCount="1" prefHeight="27.0" prefWidth="305.0" showTickLabels="true" showTickMarks="true" snapToTicks="true" />

这种利用fxml来定义控件的方式在JavaFX中比纯手工用类来设计UI方便得多,因为可以导入SceneBuilder这个JavaFX专用的UI设计软件来进行可视化编辑,也便于统一的管理配置。这种设计也可以通过加入多个fxml文件和Controller类来增加多个不同的窗口,十分强大且现代化

​ 后期的额外功能都会加入AppExtra这个包中作为可选拓展,这样的话一方面保证了代码的可维护性,另一方面保持了拓展性,既可以小而美也可以大而全,变成万物启动器(逐渐变成了PCL)

未来展望

​ 目前的SNGL还是个空壳,只有启动MC这一个功能,连配置保存都还没有实装(Alpha版本嘛)虽然可以修改各种参数但是无法保存,所以在下一个大版本即Alpha v0.3中就会加入配置文件保存和完善下载功能,那样的话就是一个基本可用的启动器了。后续也会添加各种拓展来强化其功能,从而真正达到这个模块化的效果。

最后修改:2024 年 02 月 13 日
可以的话,给一点吧!(可怜巴巴