游戏中人物技能输出的处理.
遇到一个比较麻烦的问题:
现在有一个动作游戏:W,S,A,D,J 分别表示 上,下,后,前,攻击. 并且人物有一些出招表:前+下+前+攻击,下+前+攻击,前+下+后+前+攻击
要实现人物的出招表.现在已经有一个 int getKeyCode(); 方法,返回当前按键的ASCII码. 和一个 boolean isFacingRight(); 方法, 返回当前人物是否面向右.
我目前的方法是比较笨的:
将技能声明为String[2],0位放面向右的,1位放左的.比如 下+前+攻击:
String[] skill = {"SD","SA"};
将输入的按键转换成String,并且用StringBuffer拼接.当 keyCode==攻击 判断:StringBuffer是否以对应的技能字符结尾.如果true-输出技能,清空StringBuffer. false-清空StringBuffer.
总觉得是不是还有更好的方法? 用int操作.或者用某种结构处理技能匹配?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
我最初的匹配是有问题的,因为 比如有2个技能 后+下+前+技能 下+前+技能. 当前操作列队为"后+下+前".那么用endWith()判断就有问题了.2个都符合
我又想了一个方法,就是在ascii码上操作:
比如技能 下+前(面向右SD,左SA) ascii--> s-115,d-100,a-97. 从右向左减法,所以 下+前技能 可以用-15和-18表示.
将键盘输入ascii放入列队里(除攻击键).匹配算法就变成
if(keyCode == 攻击){
将列队依此取出做减法,最后判断是否为-15或-18
}
这样一来,不用判断方向,也不会出现匹配重复(操作键只有W(119),A(97),S(115),D(100)),效率肯定是快了不少.
想到一起去了,最开始我也考虑过用树的形式表现技能.比如有2个技能 前+下+前, 前+下+后 前 / 下 / 前 后 先照此生成一些技能树,按键的最后一个按钮为根节点.再用前序遍历. 但是2叉树结构肯定是不行的,应该是4叉树,哈哈.. 晚上写个4叉树.... -_-!!!
嗯, 祝你成功
建议设置一个先入先出(FIFO)的队列, 队列大小根据实际技能组合的长短适度调整, 考虑到容错率, 应该是最长组合的一倍左右, 按方向的时候压入, 按攻击的时候取出, 并判断组合.
技能组合应该是一棵树, 取出第一个方向键, 从树的跟开始, 找到第一个子则取第2个键, 继续往下找子节点, 找不到可以容错1到2次, 再取一到两个键在当前节点下找, 找到则继续往下, 直到没有子节点则触发技能, 找不到则退回根节点继续循环.
只是个思路, 希望有帮助
谢谢~key-value.嗯``` 我晚上试下.肯定是可以的,看看效率吧.
写一个Hash函数,然后事先把所有可能的按键招数事先根据按键ASCII Hash(因该不会有重复)进Map中,然后在读取按键状态函数中不断读入按键信息放到队列Buffer中(超过一定毫秒就清空队列,表示无效或超时按键),对于连续有效的这个队列进行Hash然后检索对应的Map中的招数,有就发招,无则是出错招.
这个对于某些招数比如按住键(集气)等需要某些处理,但中心思想不变.
用一个按键队列???可否
我现在求的就是匹配算法.其他的都做好了. 您还是详述下吧? 我上面写的匹配算法太烂了.
这个要求和普通的匹配算法还是不一样的. 我只要判断是否以某个技能字符结尾就可以了.不是包含.不过还是谢谢你. 我的初衷是想能不能用其他的形式表现技能.不用String,因为我们可以得到按键的ASCII.
设置一个按键缓冲区(长度取决于最大出招按键数),按键输入以队列的形式进行入队.然后每次按键触发一个匹配算法来匹配你定义的出招按键表,一旦匹配成功清空缓冲释放大招.至于匹配算法则很简单,不再详述.