一个为 Minecraft Java 版添加触控支持的 Mod。目前处于早期开发中,如果遇到 Bug 或者其他问题,欢迎积极报告!
你可以在 Modrinth、Github Releases 、Gitee 发行版 和 MC 百科 上下载 TouchController 的最新发布版。
根据不同的 mod 加载器,TouchController 需要如下的前置 mod:
- Fabric:Fabric API、Fabric Language Kotlin
- Forge:无前置
目前 TouchController 支持的 Minecraft 版本和 mod 加载器有:
- 1.20.1 (Forge、Fabric)
- 1.21.1 (Fabric)
- 1.21.3 (Fabric)
- 1.21.4 (Fabric)
更多游戏版本、mod 加载器的支持正在开发中。
目前支持的平台有:
- Windows(v0.0.8 开始支持 x86 和 x86_64 架构,v0.0.11 添加了 ARM64 架构的支持)
- 官方版 Fold Craft Launcher
- 官方版 Zalith Launcher
- 官方版 Pojav Glow·Worm
- 我修改后的 PojavLauncher
在未来可能会添加 Linux 上 X11 和 Wayland 触屏的支持。iOS 和 macOS 由于没有相应环境和设备,不会提供支持,但是接受 iOS 和 macOS 支持的 Pull Request。
- Minecraft 基岩版风格的触屏输入(暂时不支持分离控制)
- 可自定义的控制器布局
- 能够根据游泳、飞行等状态切换不同按键的显示
- 破坏方块时进行震动反馈(目前只支持 Android 平台)
首先你需要 Rust 编译器,可以使用 rustup 安装。
接下来你需要安装以下几个目标的 Rust 工具链:
- armv7-linux-androideabi
- aarch64-linux-android
- i686-linux-android
- x86_64-linux-android
- i686-pc-windows-gnullvm
- x86_64-pc-windows-gnullvm
- aarch64-pc-windows-gnullvm
这些工具链可以用 rustup target add <工具链目标>
添加。
你还需要一份 Android SDK,可以在 Android Studio 内安装,然后在项目根目录创建 local.properties
,其中内容如下:
sdk.dir=<Android SDK 目录>
默认 Android Studio 会帮你做这件事情,如果你用 Android Studio 打开过这个项目,则不需要配置这个选项。
接下来你还需要安装一份 Android NDK,同样也可以在 Android Studio 内安装,安装完后使用 cargo install cargo-ndk
安装
cargo-ndk
工具。
然后你还需要 LLVM MinGW 工具链,在 mstorsjo/llvm-mingw 获取工具链,并将其中的 bin 目录加入 PATH 环境变量即可。
最后运行 ./gradlew build
就可以编译了,编译好的 mod 文件在 mod/build/libs
下。
欢迎添加其他启动器的支持!为其他启动器添加支持的步骤有:
-
添加 TouchController 的 proxy-client 库到启动器内
- Groovy
implementation 'top.fifthlight.touchcontroller:proxy-client-android:0.0.2'
- Kotlin
implementation("top.fifthlight.touchcontroller:proxy-client-android:0.0.2")
- Gradle version catalogs
touchcontroller-proxy-client-android = { group = "top.fifthlight.touchcontroller", name = "proxy-client-android", version = "0.0.2" }
-
创建 MessageTransport
目前版本的 TouchController 使用 Unix 套接字进行游戏和启动器之间的 IPC,因此需要先创建一个 UnixSocketTransport:
private static final String socketName = "YourLauncher"; /* ... */ MessageTransport transport = UnixSocketTransportKt.UnixSocketTransport(socketName);
你还需要在游戏启动时将 Unix Socket 的名称通过
TOUCH_CONTROLLER_PROXY_SOCKET
环境变量传递给 mod。Os.setenv("TOUCH_CONTROLLER_PROXY_SOCKET", socketName, true);
-
创建一个 LauncherProxyClient
有了 MessageTransport 后你就可以创建一个 LauncherProxyClient 了,这是实现启动器和游戏之间交互协议的类:
LauncherProxyClient client = new LauncherProxyClient(transport);
-
创建一个 VibrationHandler(可选)
TouchController 从 v0.0.12 版本开始支持震动反馈。首先你需要实现 VibrationHandler:
interface VibrationHandler { fun viberate(kind: VibrateMessage.Kind) }
在 proxy-client-android 库中的 SimpleVibrationHandler 类实现了一个基本的 VibrationHandler,可以作为参考,但是不建议直接使用这个类,因为这个类缺失震动强度、震动效果的调节:
private val TAG = "SimpleVibrationHandler" class SimpleVibrationHandler(private val service: Vibrator) : LauncherProxyClient.VibrationHandler { override fun viberate(kind: VibrateMessage.Kind) { try { @Suppress("DEPRECATION") service.vibrate(100) } catch (ex: Exception) { Log.w(TAG, "Failed to trigger vibration", ex) } } }
然后设置 VibrationHandler 到 LauncherProxyClient 中:
SimpleVibrationHandler handler = new SimpleVibrationHandler(vibrator); client.setVibrationHandler(handler);
-
启动 LauncherProxyClient,并发送消息:
调用 LauncherProxyClient 的 run() 方法,否则 LauncherProxyClient 不会发送任何消息到游戏:
client.run();
然后调用 LauncherProxyClient 的以下方法更新触点:
- addPointer:添加或者更新一个触点
- removePointer:清除所有的触点
- clearPointer:删除一个触点
如果不想手动做消息处理,库内也提供了一个基于 FrameLayout 的 TouchControllerLayout 类,只要将游戏相关的 View 包含在内,然后将 LauncherProxyClient 设置到 TouchControllerLayout 中即可发送处理触摸消息并发送。
要注意的是消息中的 index 必须是单调递增的(与 Android 中可以复用 ID 的行为相反),并且所有坐标的范围是相对于游戏显示区域的 [0.0, 1.0],而不是屏幕坐标。