一、程序原理
该程序使用了java下的 robot类来控制键盘输出,运行后,需要切换到原神窗口
二、正文
1.简单的写一个音符类
利用方法重载,最后一个参数为实现该代码后等待的时间,其实就是两个音之间的间隔。
代码如下(示例):
import java.awt.*;
public class Music {
static Robot singer;
static {
try {
singer = new Robot();
} catch (AWTException e) {
throw new RuntimeException(e);
}
}
// 以下代码实现同时按下多个键,最多为同时按下3个
public static void Music (int delay) throws AWTException, InterruptedException {
synchronized (singer){
singer.wait(delay*1000);
}
}
public static void Music (char a ,int delay ) throws AWTException, InterruptedException {
singer.keyPress(a);
singer.keyRelease(a);
synchronized (singer){
singer.wait(delay*10);
}
}
public static void Music (char a , char b ,int delay) throws AWTException, InterruptedException {
singer.keyPress(a);
singer.keyPress(b);
singer.keyRelease(a);
singer.keyRelease(b);
synchronized (singer){
singer.wait(delay*10);
}
}
public static void Music (char a , char b , char c , int delay) throws AWTException, InterruptedException {
singer.keyPress(a);
singer.keyPress(b);
singer.keyPress(c);
singer.keyRelease(a);
singer.keyRelease(b);
singer.keyRelease(c);
synchronized (singer){
singer.wait(delay*10);
}
}
调用这个类的静态方法,把音符传进去
2.通过歌单类调用音符类的方法
这里写了《NormalNoMore》第一段琴谱,原神琴谱可以上百度或者B站搜索。
前面参数写需要按下的键,最后的参数为按下该按键时停顿的时间,单位是0.01秒
代码如下(示例):
import java.awt.*;
public class Menu {
int startDalay;
Menu(){
startDalay = 5;
}
Menu(int startDalay){
this.startDalay = startDalay;
}
public void NormalNoMore () throws InterruptedException, AWTException {
Music.Music(startDalay);
// 第一段
Music.Music('V',25);
Music.Music('E',17);
Music.Music('W',17);
Music.Music('Q',25);
Music.Music('W',15);
Music.Music('W',30);
Music.Music('W',17);
Music.Music('Q',30);
Music.Music('W',17);
Music.Music('E',17);
Music.Music('Q',25);
Music.Music('B','Q',17);
Music.Music('W',17);
Music.Music('H',30);
Music.Music('H',25);
Music.Music('E',17);
Music.Music('T',17);
Music.Music('W',17);
Music.Music('W',17);
Music.Music('W',30);
Music.Music('W',33);
Music.Music('W',30);
Music.Music('C',17);
Music.Music('Q',17);
Music.Music('E',17);
Music.Music('W',17);
Music.Music('Q',30);
Music.Music('W',15);
Music.Music('W',30);
Music.Music('W',17);
Music.Music('Q',30);
Music.Music('R',17);
Music.Music('T',17);
Music.Music('Q',25);
Music.Music('N','E',30);
Music.Music('W',30);
Music.Music('Q',30);
Music.Music('E',17);
Music.Music('T',35);
}
3.main方法的调用
import java.awt.*;
public class Text {
public static void main(String[] args) throws AWTException, InterruptedException {
Menu menu = new Menu();
menu.NormalNoMore();
}
}
三、其他工具类,便于写琴谱(非必需)
代码如下:
public class Util {
/**
* 分割字符串成多个字符串存入数组
* @param str
* @param split
*/
public static void split(String str,String split) {
String[] arr = str.split(split);
for(String s : arr) {
System.out.println("Music.Music" + "('" + s + "',);");
}
}
/**
* String类型转char类型数组
* @param str
*/
public static void castChar (String str){
char [] chars = str.toCharArray();
for (char c : chars){
System.out.println("Music.Music('" + c + "',);");
}
}
/**
* 替换字符串中指定的字符成目标字符
* @param str
* @param regex
* @param replacement
*/
public static void replaceString (String str,String regex,String replacement){
System.out.println(str.replaceAll(regex,replacement));
}
}
代码也很简单,看看就能理解
四、琴谱
目前完整的琴谱有:
《OneLastKiss》
《HisTheme》
《大梦的曲调》
以后还会写一些自己喜欢的谱更新在这
链接:https://pan.baidu.com/s/1nDLpAf9E3c1I-VzZwlunqQ?pwd=w4j5
或者点下方蓝字
琴谱
提取码:w4j5
可能出现的问题
原神没有反应的话,用管理员打开idea试试。