游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4301|回复: 15

请问大家一般是怎么处理键盘输入的?

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2007-2-28 09:48:00 | 显示全部楼层 |阅读模式
请问大家一般是怎么处理键盘输入的呢?是像下面这样,还是做一个ActionMapping呢?我本来是想做ActionMapping的,一开始想得很直接,就是做一个hash表,表里每项对应一种输入事件,然后每项再对应上一个链表,这个链表里就是各个事件响应函数的地址,并且每个链表项里都指明这个项目在游戏的什么状态下有效,但是后来发现有两个问题不太好解决,一是复用,比如有些事件响应在各种状态下都是有效的,比如不管游戏是什么状态,都要求按Esc是退出,如果不实现复用就意味着这些相同的东西需要重复注册到不同的状态里;二是事件相容,比如我要求WSAD是移动,alt是显示地面上道具的名字(像暗黑那样),但是我需要让玩家能够一边移动一边查看地面上道具的名字,但是那时检测到的将是alt+w、alt+s、alt+a、alt+d,如果不能复用并且相容,那么为了这个移动就需要注册很多的按键组合。
所以我现在想,做ActionMapping是否还有必要?



  1.     if( mKeyboard->isKeyDown( KC_A ) ){
  2.         // Move camera left
  3.         mTranslateVector.x= -mMoveScale;
  4.     }
  5.     if( mKeyboard->isKeyDown( KC_D ) ){
  6.         // Move camera RIGHT
  7.         mTranslateVector.x= mMoveScale;
  8.     }
  9.     /* Move camera forward by keypress. */
  10.     if( mKeyboard->isKeyDown( KC_UP ) || mKeyboard->isKeyDown( KC_W ) ){
  11.         mTranslateVector.z= -mMoveScale;
  12.     }
  13.     /* Move camera backward by keypress. */
  14.     if( mKeyboard->isKeyDown( KC_DOWN ) || mKeyboard->isKeyDown( KC_S ) ){
  15.         mTranslateVector.z= mMoveScale;
  16.     }
复制代码

似乎很多Demo里都是这样的……

3

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2007-2-28 11:57:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

这么简单的东西还来问,自己去看direct input

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-2-28 12:13:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

别人都是不耻下问,我现在是不耻上问,简单的当然也可以问。
站里的开发文档我也查了一下,发现大多就是楼顶帖子里的这种做法,我现在的程序里也是这样做的,但是总感觉这样做不是很好。
看到OIS的一个Demo里有一个ActionMapping,不过似乎实现得不是挺简洁,所以我开始考虑实现这种东西是否划算……

DirectInput似乎只是帮助获得设备输入的,和OIS应该是一个层面上的东西,而ActionMapping是建立在这些东西的基础上的。不过既然NudePaladin觉得很简单,不如告诉我一下该怎么做?  ^_^

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-2-28 12:19:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

你对DI的理解是错的。
DI中有ActionMap,根本没必要自己再做一份。

另外我有一点搞不懂,简单的当然可以问,但你上问的时候为什么要不耻?难道上面的人都让你觉得痛苦,难受,抓狂??这句话听起来让人很不爽,希望你收回。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-2-28 12:24:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

哦,我不太了解DI,不过我现在用OIS,一是因为这个是跟OGRE在一起的,二是因为它是开源、跨平台的,所以我也不能用DI。

我说不耻上问,是因为NudePaladin似乎很看不起我这个问题,所以我只好在别人的鄙视之下无耻一回。

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-2-28 12:44:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

……无耻和不耻……似乎不是一个意思。 -_-b

好了不说了,DI虽然不跨平台,但是AM部分的设计比较中肯,不华丽,中规中矩,可以用来参考。

OGRE的图形部分很厉害,但是其他部分只是被OGRE拿来做为卫星系统的,设计强不到哪里去,早期的Input系统更是……,现在好些了,但是感觉还是功能欠缺些。我建议还是参考一下DI的AM设计~
个人建议而已,至于OIS乃至OGRE优劣的问题,恕我不参与讨论了。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-2-28 15:31:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

呵呵,我当时只是针对他的回帖才那样说的。

我不了解DI,不知道它能否解决这两个问题:
一是复用,比如有些事件响应在各种状态下都是有效的,比如不管游戏是什么状态,都要求按Esc是退出,如果不实现复用就意味着这些相同的东西需要重复注册到不同的状态里;
二是事件相容,比如我要求WSAD是移动,alt是显示地面上道具的名字(像暗黑那样),但是我需要让玩家能够一边移动一边查看地面上道具的名字,但是那时检测到的将是alt+w、alt+s、alt+a、alt+d,如果不能复用并且相容,那么为了这个移动就需要注册很多的按键组合。

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-2-28 15:50:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

我的AM是自己做的,做法是AM由多个AMConfig组成,在游戏的不同阶段调入不同的Config。Config是可替代的,一开始调入的Config,只要不刷掉他,后面就一直会保留。ESC从一开始就注册到AM里,只要以后没有新的Config刷掉ESC,ESC就一直具备关游戏的功能。但其实这种从首至尾都通用的键不是很好,不鼓励使用,毕竟在开始菜单的退出和在游戏中的退出,弹出的对话框,进行的处理什么都应该是不一样的……

事件相容是不会出问题的,因为AM的内部实现大凡是用CheckState而不是PickMessage的方式,State就是那样,只要命中相应键的State就不会出问题。就算是Ctrl+Alt+Del都不会出问题,呵呵 ^_^

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-2-28 15:59:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

嗯,我能够理解AMConfig本身,我想你的意思是软件可以同时处于多个不同的状态(即同时存在多个不同的AMConfig),这样就可以复用AMConfig,但是我还是有些疑惑。
我原来想的是,把各个AMConfig组织为一棵树,每个节点(即AMConfig)都会“继承”其父节点,以此达到复用,但是随之而来的就是多重继承,多重继承可能会使得这棵树中出现环状结构,这时需要保证同一个事件不会被同一个节点处理两次,然后我就发现实现起来似乎很难……
而相容问题,如果都是CheckState,那么就是说所有的AMConfig之间都是相同的。那么如果要实现排斥呢?有什么办法吗?因为有时在某些状态下会禁用其他状态的部分操作。

^_^

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2007-2-28 16:01:00 | 显示全部楼层

Re:请问大家一般是怎么处理键盘输入的?

另外还有一个问题:
使用ActionMapping相比于不使用它能获得什么好处吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 15:44

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表