方向键长按延迟的解决(游戏开发)
来源:互联网 发布:电视直播软件安装包 编辑:程序博客网 时间:2024/06/11 01:58
0.前言
在游戏开发的精灵动画中,在长按方向键时候,往往在按下方向键的时候,第一次消息回调会来的特别快,在第一次方向键与第二次方向键之间往往会相隔一点时间,虽然时间只有一点点,但是在游戏开发中是不能够忍受的。
1.解决思路
这个解决思路在一个大神的GitHub上面找到的,具体的地址我找不到了,等我找到了再贴上去。
原文如下:
/** * <ul> * 判断方向的基本原则:每当用户按下一个方向键,就把它的keyCode存进数组(数组里不可以有重复);每当一个方向键弹起,则把keyCode从数组里清除。 * <li>若数组里只有一个键,那就是轴方向运动;</li> * <li>两个键,两种情况:如果是复合键,就是斜方向运动;如果是一个A一个D这样一组相反键,则只响应先按的那个,物体只做轴方向运动;</li> * <li>三个或四个键只响应数组里最先按的那一组复合键,做斜方向运动.</li> * </ul> * <p> * 使用数组的好处在于可以处理复杂的多按键情况(无论是玩家有意乱按还是无意多按的),大大提高手感。 * </p> * <p> * 例如这样一组输入:先后按下A、W、D再释放A,之后按下S并释放W、D。玩家最可能的意图是,先左上走,然后改为右上,最后改为下。 * 这样的按键手感方便但是就造成一般的if ...else判断方法很难响应。 * </p> * <p> * 因为Javafx里始终只不断给出最后一个键按下的消息. * 新的按键消息会不断把以前的按键消息“冲”掉。而且同时按3个或4个键在if...else里判断很麻烦, * 即使建立了类似Ctrl+Shift这样的变量来追踪以前的按键。 而使用有序且不重复的数组则可以完美解决这些问题。 * </p> */
2.具体实现
根据上文的解决思路,一般足以解决这个问题了。
我下面给出在我实际的项目中的具体的实现:
用的是JavaFX实现的
import javafx.scene.input.KeyCode;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;/** * 精灵控制类 */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() { @Override 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; // schedules the task to be run in an interval timer.scheduleAtFixedRate(timerTask, delay, intevalPeriod); } /** * 加入到方向键的缓冲区的最后,如果之前存在一样的key先清除 * */ public void addKeyCode(KeyCode keyCode){ directions.remove(keyCode); directions.add(keyCode); } /** * 从方向键的缓冲区删除,一般在得到这个键的长按已经被松开时被调用,因为对于一个键,按下时与松开时都会产生系统调用,都能被捕捉到 * */ public void removeKeyCode(KeyCode keyCode){ try{ directions.remove(keyCode); }catch (Exception e){ } } public Sprite getMySprite(){ return mySprite; } public Sprite getBombSprite(){ return bombSprite; }}
3.总结
总结起来说,就是在某一个键被按下时,把这个键的值加入到数组中,当这个键被放开时,从数组中去掉,设置一个定时任务,每隔一段时间就从数组里面取值,做出相应的响应。
对于这个问题,大家有什么问题可以在下方留言。
1 0
- 方向键长按延迟的解决(游戏开发)
- android游戏开发虚拟方向键
- ijkplayer 解决rtmp 延迟长的问题,达到秒开的结果
- ijkplayer 解决rtmp 延迟长的问题,达到秒开的结果
- 开发网路游戏的延迟处理方法,广播
- 解决sqlplus下方向键的问题
- 解决sqlplus下方向键的问题
- 解决sqlplus下方向键的问题
- 解决sqlplus下方向键的问题
- Android游戏开发一 长按Button原理
- 自定义游戏手柄方向键
- 解决Android AVD的方向键DPAD不能用的问题
- 解决Android AVD的方向键DPAD不能用的问题
- 解决Android AVD的方向键DPAD不能用的问题
- 长牌游戏开发--搭建系统环境
- ubuntu9.10中vim方向键异常问题的解决
- ctrl+alt+方向键 与win7的旋转屏幕冲突解决
- ubuntu中vim方向键异常问题的解决
- JavaScript 浏览器对象模型BOM1
- java中的点点滴滴!!
- 报表逐层累计功能
- Android studio 界面介绍
- 【并行计算-CUDA开发】OpenCL、OpenGL和DirectX三者的区别
- 方向键长按延迟的解决(游戏开发)
- 第5周 项目2 - 建立链栈算法库
- JDOM操作XML
- Unix网络编程之poll函数实现服务器反射客户端-server.c
- codeforces 720 A. Closing ceremony
- Mybatis简介与原理
- 关于重绘(repaint)和回流(reflow)的理解
- c++中vector的用法详解
- Android布局管理器 - 详细解析布局实现