ctrl+ctrl alt 方向键键的游戏

在游戏开发的精灵动画中,在长按方向键时候,往往在按下方向键的时候,第一次消息回调会来的特别快,在第一次方向键与第二次方向键之间往往会相隔一点时间,虽然时间只有一点点,但是在游戏开发中是不能够忍受的。
1.解决思路
这个解决思路在一个大神的GitHub上面找到的,具体的地址我找不到了,等我找到了再贴上去。
原文如下:
* 判断方向的基本原则:每当用户按下一个方向键,就把它的keyCode存进数组(数组里不可以有重复);每当一个方向键弹起,则把keyCode从数组里清除。
* &li&若数组里只有一个键,那就是轴方向运动;&/li&
* &li&两个键,两种情况:如果是复合键,就是斜方向运动;如果是一个A一个D这样一组相反键,则只响应先按的那个,物体只做轴方向运动;&/li&
* &li&三个或四个键只响应数组里最先按的那一组复合键,做斜方向运动.&/li&
* 使用数组的好处在于可以处理复杂的多按键情况(无论是玩家有意乱按还是无意多按的),大大提高手感。
* 例如这样一组输入:先后按下A、W、D再释放A,之后按下S并释放W、D。玩家最可能的意图是,先左上走,然后改为右上,最后改为下。
* 这样的按键手感方便但是就造成一般的if ...else判断方法很难响应。
* 因为Javafx里始终只不断给出最后一个键按下的消息.
* 新的按键消息会不断把以前的按键消息“冲”掉。而且同时按3个或4个键在if...else里判断很麻烦,
* 即使建立了类似Ctrl+Shift这样的变量来追踪以前的按键。 而使用有序且不重复的数组则可以完美解决这些问题。
2.具体实现
根据上文的解决思路,一般足以解决这个问题了。
我下面给出在我实际的项目中的具体的实现:
用的是JavaFX实现的
import javafx.scene.input.KeyC
import java.util.ArrayL
import java.util.L
import java.util.T
import java.util.TimerT
* 精灵控制类
public class SpriteController {
private List&KeyCode&directions = new ArrayList&&();
private List&KeyCode&spaces = new ArrayList&&();
private Sprite mySprite = null;
private Sprite bombSprite = null;
public SpriteController(){
mySprite = new Sprite(50, 50, 100, 100, "img/actor.png");
bombSprite = new Sprite(70,35,64,64,"img/bomb_1.png");
addTimer();
private void addTimer(){
TimerTask timerTask = new TimerTask() {
public void run() {
int size = directions.size();
System.out.println(size);
if (size&0){
KeyCode keyCode = directions.get(size-1);
if(keyCode == KeyCode.LEFT){
mySprite.moveLeft();
}else if(keyCode == KeyCode.RIGHT){
mySprite.moveRight();
}else if(keyCode == KeyCode.UP){
mySprite.moveUp();
}else if(keyCode == KeyCode.DOWN){
mySprite.moveDown();
Timer timer = new Timer();
long delay = 0;
long intevalPeriod = 30;
timer.scheduleAtFixedRate(timerTask, delay,
intevalPeriod);
* 加入到方向键的缓冲区的最后,如果之前存在一样的key先清除
public void addKeyCode(KeyCode keyCode){
directions.remove(keyCode);
directions.add(keyCode);
* 从方向键的缓冲区删除,一般在得到这个键的长按已经被松开时被调用,因为对于一个键,按下时与松开时都会产生系统调用,都能被捕捉到
public void removeKeyCode(KeyCode keyCode){
directions.remove(keyCode);
}catch (Exception e){
public Sprite getMySprite(){
return myS
public Sprite getBombSprite(){
return bombS
总结起来说,就是在某一个键被按下时,把这个键的值加入到数组中,当这个键被放开时,从数组中去掉,设置一个定时任务,每隔一段时间就从数组里面取值,做出相应的响应。
对于这个问题,大家有什么问题可以在下方留言。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17674次
排名:千里之外
原创:52篇
(1)(1)(8)(10)(7)(6)(3)(3)(1)(3)(4)(1)(8)

参考资料

 

随机推荐