📄 enginekey.java
字号:
* <TD WIDTH="20%">14</TD><TD WIDTH="20%">KEY_NUM6</TD><TD WIDTH="8%">54</TD><TD WIDTH="20%">36</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">15</TD><TD WIDTH="20%">KEY_NUM7</TD><TD WIDTH="8%">55</TD><TD WIDTH="20%">37</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">16</TD><TD WIDTH="20%">KEY_NUM8</TD><TD WIDTH="8%">56</TD><TD WIDTH="20%">38</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">17</TD><TD WIDTH="20%">KEY_NUM9</TD><TD WIDTH="8%">57</TD><TD WIDTH="20%">39</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">18</TD><TD WIDTH="20%">*</TD><TD WIDTH="8%">42</TD><TD WIDTH="20%">2A</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">19</TD><TD WIDTH="20%">#</TD><TD WIDTH="8%">35</TD><TD WIDTH="20%">23</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">20</TD><TD WIDTH="20%">↑</TD><TD WIDTH="8%">-1</TD><TD WIDTH="20%">FF</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">21</TD><TD WIDTH="20%">↓</TD><TD WIDTH="8%">-2</TD><TD WIDTH="20%">FE</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">22</TD><TD WIDTH="20%">←</TD><TD WIDTH="8%">-3</TD><TD WIDTH="20%">FD</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">23</TD><TD WIDTH="20%">→</TD><TD WIDTH="8%">-4</TD><TD WIDTH="20%">FC</TD>
* </TR>
* <TR BGCOLOR="#CCCCFF">
* <TD WIDTH="20%">24</TD><TD WIDTH="20%">SELECT</TD><TD WIDTH="8%">-5</TD><TD WIDTH="20%">FB</TD>
* </TR>
* </TABLE>
*/
static byte[] keyMap;
/**
* 按键按下状态,由单个按键的状态的组合组成,第一位表示当前按键的行为,第二位表示当前按键的映射值。
*/
static StringBuffer pressState;
/**
* 按键保持状态,由n个单个按键的状态的组合组成。
*/
static StringBuffer holdState;
/**
* 按键组合状态,由n个单个按键的状态的组合组成。
*/
static StringBuffer combineState;
/**
* 按键操作的计时是否超过了保持状态的计时,true:超过了计时,false:在计时范围内。
*/
static boolean holdFlag;
/**
* 任意键按下检测。
* @return 是否按下了任意按键,true:有键按下,false:没有键按下。
*/
public final static boolean pressAnyKey(){
if(!holdFlag && pressState.length() == 2){
pressState.delete(0, 2);
return true;
}else{
return false;
}
}
/**
* 按键按下检测。
* @param <b>key</b> 被检测按键映射的按键布局表的索引,可以由开发人员根据keyMap的顺序定义一系列常量,如果key是负数或者超过了或达到了按键布局表的大小,会抛出异常<br>java.lang.ArrayIndexOutOfBoundsException
* @return 是否按下了被检测的按键,true:有按下,false:没有按下。
*/
public final static boolean pressKey(int key){
if(!holdFlag && pressState.length() == 2 && (pressState.charAt(0) == (char)keyMap[key] || pressState.charAt(1) == (char)keyMap[key])){
pressState.delete(0, 2);
return true;
}else{
return false;
}
}
/**
* 任意键持续检测。
* @return 是否持续按下了任意按键,true:有键按下并保持,false:没有键保持。
*/
public final static boolean holdAnyKey(){
int currentholdKeyAmount = holdState.length();
return (holdFlag && currentholdKeyAmount != 0 && (currentholdKeyAmount & 0x1) == 0 && holdState.charAt(1) != (char)keyMap[0]);
}
/**
* 持续按键检测。
* @param <b>key</b> 被检测按键映射的按键布局表的索引,可以由开发人员根据keyMap的顺序定义一系列常量,如果key是负数或者超过了或达到了按键布局表的大小,会抛出异常<br>java.lang.ArrayIndexOutOfBoundsException<br>
* @return 被检测的按键是否处于持续按下状态,true:有按下并且保持,false:没有保持。
*/
public final static boolean holdKey(int key){
int currentholdKeyAmount = holdState.length();
return (holdFlag && currentholdKeyAmount != 0 && (currentholdKeyAmount & 0x1) == 0 && (holdState.charAt(0) == (char)keyMap[key] || holdState.charAt(1) == (char)keyMap[key]));
}
/**
* 组合按键检测。
* @param <b>keys</b> 被检测按键映射的按键布局表的索引的组合,可以由开发人员根据keyMap的顺序定义一系列常量,如果keys的某一元素是负数或者超过了或达到了按键布局表的大小,会抛出异常<br>java.lang.ArrayIndexOutOfBoundsException<br>
* @return 被检测的按键是否按照组合的顺序被先后按下,true:有按照顺序被按下,false:没有按照顺序被按下。
*/
public final static boolean combineKey(int[] keys){
int totalTimes = combineState.length(), times = keys.length;
if(!holdFlag && times > 1 && totalTimes >= (times << 1)){
for(totalTimes--, times--; times >= 0; times--, totalTimes -= 2){
if(combineState.charAt(totalTimes) != (char)keyMap[keys[times]] && combineState.charAt(totalTimes - 1) != (char)keyMap[keys[times]]){
return false;
}
}
combineState.delete(0, combineState.length());
return true;
}else{
return false;
}
}
/**
* 重复按键检测。
* @param <b>key</b> 被检测按键映射的按键布局表的索引,可以由开发人员根据keyMap的顺序定义一系列常量。如果key是负数或者超过了或达到了按键布局表的大小,会抛出异常<br>java.lang.ArrayIndexOutOfBoundsException<br>
* @param <b>times</b> 按键被检测的按下的次数,如果times是0或者负数,不会有任何异常,但没有实际意义。
* @return 是否重复按下了被检测的按键,true:被检测按键被重复按下了制定的次数,false:被检测按键没有被重复按下了制定的次数,如果times是负数或者0,那么不会产生任何异常,但是从实际意义可以看出来这种情况下返回的肯定是false,因为没有任何按键会被重复按下负数次或者0次。
*/
public final static boolean repeatKey(int key, int times){
int totalTimes = combineState.length();
if(!holdFlag && times > 1 && totalTimes >= (times << 1)){
for(char keyCode = combineState.charAt(--totalTimes); times > 0; times--, totalTimes -= 2){
if(combineState.charAt(totalTimes) != keyCode || (combineState.charAt(totalTimes) != (char)keyMap[key] && combineState.charAt(totalTimes - 1) != (char)keyMap[key])){
return false;
}
}
combineState.delete(0, combineState.length());
return true;
}else{
return false;
}
}
/**
* 按键状态清除。
*/
public final static void clrAllKeyState(){
if(pressState != null){
pressState.delete(0, 2);
}
if(holdState != null){
holdState.delete(0, holdState.length());
}
if(combineState != null){
combineState.delete(0, combineState.length());
}
}
/**
* 设置按键保持状态的时延。
* @param <b>tbkh</b> 按键保持状态的时间基数,time base key hold 的缩写。用于控制按键处于持续状态的时间的具体数值,该时间等于该参数与每帧刷新时间的乘积,这里需要注意的是如果tbkh传入的是非正数不会有任何异常出现,但是,在实际应用当中没有任何意义,因为这种情况下,任何按键操作都会被当成是保持状态,都是超时。
* @return 新的按键保持状态的时延。
*/
public final static int setHoldKeyTimeout(int tbkh){
EngineManager.engineThread.timeoutHoldKey = tbkh*EngineManager.engineThread.mspf;
return tbkh;
}
/**
* 查看当前按键布局的方法。<br>该方法仅仅是为了开发人员查看自己定义的按键布局在读入之后的具体数据使用。
* @return 返回当前按键布局。
*/
public final static byte[] browserKeyMap(){
for(int i = keyMap.length - 1; i >= 0; i--){
System.out.println("keyMap[" + i + "]= " + keyMap[i]);
}
return keyMap;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -