设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 8938|回复: 12
打印 上一主题 下一主题

[RMVX发布] 动态输入映射表和全键盘,唔,VX的Input被我完完全全的废了

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
178 小时
注册时间
2011-1-14
帖子
33
跳转到指定楼层
1
发表于 2011-3-20 23:23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 micmoc 于 2011-3-21 23:30 编辑

VX刚玩两天,被其输入控制恶心到不行,一生气直接把原版的Input给废了,重新写了一套用起来能很灵活的按键 - 逻辑输入映射系统。
欢迎各位点评指正,若能提供各类BUG,在下感激不尽。

更新:
[3/21/2011]
发布页 - 更新了与“全键盘”脚本的对比说明
[3/20/2011]
项目 - 发布了动态输入映射表的工程文件和源码v1.0

首先感谢:
6R和6R的各位 - 给我提供软件和各种支持
Woratana - Simple Mouse System 1.5作者,提供关于模块方面的语法支持(我是语法白痴,以前没玩过Ruby……)
DerVVulfman - DerVVulf's Mouse作者,提供关于API使用语法和WIN消息结构读取方法(依然语法白痴,虽然这个没用上)
九夜神尊 - SOU v1.03作者,提供了以上文件的整合包以及极富喜剧效果的ARPG系统,让我在没有{}和;的脚本语言堆里有继续奋斗的动力。
紫苏 - XX33.dll作者,提供hwnd获取方法及API hook基本教程,让我居然也搞了个VX的扩展dll,虽然不很好用。
熊的选民,Tabris_Air,舒逸萝莉女皇 等等 - 优秀的游戏作者们!你们给这个世界带来了快乐与基情!

工程文件下载:
InputRebuild.rar (248.19 KB, 下载次数: 946)


关于动态输入映射表和全键盘:
因为有人问起我这个“全键盘”和八云紫的全键盘脚本(dll)有什么区别,在此解释一下。
我做的工作是使用动态输入映射表替换了RMVX默认的输入映射(Input以及游戏中F1的键位设置)功能,包含但不止于全键盘的功能。

概念说明
按键状态,即输入设备按键的各种状态。比如回车键被按下,空格键没被按下。
逻辑输入状态,即在游戏中具有特定意义的用户输入的状态。比如决定、取消、向某方向移动、开火、打开物品菜单。
输入映射,即将按键与逻辑输入进行连接,使逻辑输入的状态与映射的按键状态产生关联。比如将键盘W、小键盘8和上方向键映射给逻辑输入“向上移动”,则按下这三个键中任意一个或几个,逻辑输入“向上移动”都是有效的,只有三个键都没按下的时候,“向上移动”才是无效的。


功能上的对比:
全键盘的功能,即是直接查询输入设备的按键状态。八云紫的“全键盘脚本”、Cybersam的“input全键盘”(包含在九夜神尊的ARPG Soul 系统1.03修正版中)以及类似各种全键盘均属于此。

输入映射原版的功能,即Input.press?等函数查询的并不是键盘的按键状态,而是游戏的逻辑输入状态,RMVX指定这两者的映射并允许玩家通过游戏F1菜单的“键盘”和“手柄”选项卡进行修,但只提供极其有限的逻辑输入状态和键盘按键以供选择。

我做的这个动态输入映射表废除了原本的Input模块和F1菜单这两个选项卡的功能,允许游戏开发者通过代码对无限多的、自定义的逻辑输入状态进行无限多的、全部按键范围的输入映射(F1功能扩展),并进行逻辑输入的状态查询(原Input模块功能)与映射更改(新功能!)。同时为方便起见,也支持对按键状态的直接查询,此功能即所谓的全键盘。动态输入映射表实质上是对全键盘功能在游戏输入控制方面进行的进一步封装。

使用上的对比:
全键盘不支持逻辑输入的映射,也与RMVX默认工程的代码接口不符。在项目中使用全键盘需要替换绝大部分的Input模块接口,或与Input模块功能同时使用——无论哪种方法都会增加代码的阅读、管理、调试以及维护难度。或者通过重定义的形式用全键盘功能覆盖Input模块相关功能,不过也会因此丢失原有的输入映射功能。

动态输入映射表在使用接口上完全兼容原版VX代码,无需变动任何先前代码即可使用新功能,同时提供更精确的逻辑输入状态查询接口。在后续开发的版本中,用户既可以延续习惯使用原版Input的接口,也可以使用新的更精确的接口,或者根据自己需要进一步封装接口,而无需担心混用造成的代码维护困难——这些接口都是同一功能的不同形式表现,而其代码管理是统一的。比起RMVX的输入映射,提供了更为灵活和可控的开发模式——无限制的逻辑输入与映射按键,加上简单灵活的控制接口,使得开发人员可以轻易为游戏提供类似:
  为游戏玩家提供精心设计的键位并防止玩家破坏键位布局;
  让玩家在游戏的任意时段自定义键位并提供与游戏风格统一的键位设置界面;
  在不同的场景自动切换操作模式;
  让玩家设置数套键位以便应付游戏中的各种情况
等等的功能。

特点:
支持无数量限制的输入状态,以及每个输入状态无数量限制的输入映射。你可以为你角色的80个技能每个都指定12个快捷键!
允许用户自行设计输入映射表,并可以在任意位置对映射表进行静态或动态的添加、更改和删除操作!
用户接口直观、简单,几行代码搞定复杂工作!
更丰富、精确的输入状态响应!支持状态的按下、弹起、当前帧被按下、当前帧正弹起和开关模式!
高效处理模式,非循环扫描,只响应你需要的!
支持255 virtual key全键盘!
完全兼容原版代码,导入新代码后无需更改以往代码就可直接运行!
原版Input功能扩展!加入新的输入判定类型、8方向键配置以及扩展的默认键盘表。
整合简单,导入三个文件,main函数加入一行,便可直接使用!
学习容易,代码逻辑分明,注释详尽。(满屏绿色养眼)
(好像推销员啊……)

用户接口一览:
  1. #~  InputMap用户接口:
  2. #~  1. InputMap::get_input_state(input_key)
  3. #~     更新并获取逻辑输入状态,详见逻辑输入状态一览表
  4. #~  2. InputMap::get_toggle_state(input_key)
  5. #~     更新并获取逻辑输入的开关状态,即每次逻辑输入状态处于切换到有效时,
  6. #~     循环设置开关状态为开、关、开、关...
  7. #~  3. InputMap::create_input(input_key)
  8. #~     创建一个逻辑输入,需要指定逻辑输入的代码
  9. #~  4. InputMap::create_input_mapping(input_key, vkey, alternative)
  10. #~     在指定位置为逻辑输入映射虚拟键
  11. #~  5. InputMap::delete_input
  12. #~     从表中删除一个逻辑输入,同时删除所有与之关联的映射
  13. #~  6. InputMap::clear_input_map
  14. #~     清空输入映射表
  15. #~  7. InputMap::create
  16. #~     创建输入映射表实例,需要在启动映射表功能之前调用。此函数即使调用
  17. #~     多次,也只会创建一个实例。
复制代码
  1. #~   Input用户接口:
  2. #~     旧用户接口:
  3. #~       1.Input.press?
  4. #~         判断指定的逻辑输入状态是否有效
  5. #~       2.Input.trigger?
  6. #~         判断指定的逻辑输入状态是否处于切换到有效状态
  7. #~       3.Input.repeat?
  8. #~         判断指定的逻辑输入状态是否有效,如果有效,每隔一定时间返回一次有效,
  9. #~         但在间隔时间内即使有效也会返回无效。
  10. #~         以上功能与原模块同名方法功能相同,输入的逻辑输入代码与原版常数兼容,
  11. #~         同时支持使用InputMap定义的输入映射表中的自定义逻辑输入。
  12. #~       4.Input.dir4
  13. #~       5.Input.dir8
  14. #~         返回4方向和8方向的方向代码,此两种方法与原方法功能相同。
  15. #~         此dir8是根据4方向键的状态组合返回8方向代码,而dir8keys则是根据8方向
  16. #~         键返回8方向代码。
  17. #~         注意:dir4和dir8需要创建名为LEFT、RIGHT、UP、DOWN的逻辑输入,
  18. #~         dir8keys还需要追加NE、NS、SE、SS4个逻辑输入,这些对象在默认的输入映
  19. #~         射表中已提供
  20. #~       6.Input.update
  21. #~         同老方法每帧需要调用一次,注意此方法与InputMap类无关。
  22. #~     新用户接口:
  23. #~       7.Input.set_repeat_time
  24. #~         repeat_time即在RMVX默认游戏启动画面按下“上下”方向键时,光标连续移动
  25. #~         时在每个选项上停留的时间。间隔的时间单位是帧,默认每帧为1/60秒。
  26. #~       8.Input.toggle?
  27. #~         判断指定的逻辑输入的开关状态是否开启
  28. #~       9.Input.dir8keys
  29. #~         根据小键盘的8方向键返回的8方向代码
  30. #~       10.Input.use_default_key_map
  31. #~         清空当前的输入映射表并建立默认表
复制代码
使用样例:
  1. #~     #创建输入映射表实例(带有默认输入映射表)
  2. #~     InputMap::create
  3. #~     
  4. #~     # 创建用户逻辑输入"ATTACK"并将其映射到键盘X、回车和鼠标左键上
  5. #~     # 1、2、3代表当前逻辑输入的映射位置,从1开始,不超过类MappedInput的
  6. #~     # 常量MAPPING_KEY_COUNT_MAX限制(默认为4个)
  7. #~     InputMap::create_input("ATTACK")
  8. #~     InputMap::create_input_mapping("ATTACK", VK_X, 1)
  9. #~     InputMap::create_input_mapping("ATTACK", VK_ENTER, 2)
  10. #~     InputMap::create_input_mapping("ATTACK", VK_LBUTTON, 3)
  11. #~   
  12. #~     # 或者使用
  13. #~     InputMap::create_input_ex("ATTACK", [VK_X, VK_ENTER, VK_LBUTTON])
  14. #~     
  15. #~     # 将用户逻辑输入"ATTACK"的2号位置映射键改为CTRL,现在"ATTACK"的有效
  16. #~     # 映射键为X,CTRL和鼠标左键
  17. #~     InputMap::create_input_mapping("ATTACK", VK_CTRL, 2)
  18. #~     
  19. #~     # 将用户逻辑输入"ATTACK"的3号位置映射键删除,现在"ATTACK"的有效映射
  20. #~     # 键为X和CTRL
  21. #~     InputMap::create_input_mapping("ATTACK", VK_NULL, 3)
  22. #~     
  23. #~     # 删除默认输入映射表的逻辑输入Input::C,现在开始对逻辑输入Input::C的
  24. #~     # 状态查询都是无效的
  25. #~     InputMap::delete_input(Input::C)
  26. #~     
  27. #~     
  28. #~     while is_game_running?
  29. #~       # 在游戏循环中获取逻辑输入状态
  30. #~       if Input::press?("ATTACK")
  31. #~         # ...在这里添加攻击代码
  32. #~       end
  33. #~       if Input::trigger?(Input::C)
  34. #~         # ...在这里添加确定代码
  35. #~       end
  36. #~      
  37. #~       # 以上为兼容原版代码模式,其效果与下面的代码相同
  38. #~       if IState::ON == InputMap::get_input_state("ATTACK")
  39. #~         # ...在这里添加攻击代码
  40. #~       end
  41. #~       if IState::TURN_ON == InputMap::get_input_state(Input::C)
  42. #~         # ...在这里添加确定代码
  43. #~       end
  44. #~      
  45. #~       # repeat?功能为Input模块独有,其判断逻辑与press?相同,只
  46. #~       # 不过返回状态有效的间隔较长以实现慢速检定
  47. #~       if Input::repeat?(Input::C)
  48. #~         # ...在这里添加确定代码
  49. #~       end
  50. #~      
  51. #~       # 下面一段代码实现按下按键后进入跑动状态,再次按键后取消
  52. #~       # 跑动状态
  53. #~       if InputMap::get_toggle_state("RUN_MODE")
  54. #~         # ...在这里添加跑动模式代码
  55. #~       end
  56. #~     end   # END while is_game_running?
  57. #~     
  58. #~     
  59. #~     # 清空输入映射表,从现在开始不会有任何的输入响应。此功能可以在需要
  60. #~     # 重置输入映射表时使用,以实现类似进入不同模式使用不同键盘布局的功能。
  61. #~     InputMap::clear_input_map
  62. #~   
复制代码
更详细的说明请参考源文件中的注释介绍。


整合说明:
1:将三个源文件依次插入项目工程
   源文件位置:
     F11脚本编辑器
       ▼ 外来RGSS插件脚本
         VKeyMap - 所有虚拟键码和相关状态码的定义文件
         InputMap - 输入映射表核心代码
         Input ++ - 原版代码无缝接口以及相关扩展功能

2:将下列语句插入到Main文件的begin语句后
   InputMap::create

    插入位置的代码示例:
# ======这里是main文件的main函数================
# 一些常用的字体
Font.default_name = ["SimHei", "黑体", "DFKai-SB", "標楷體", "Verdana", "Arial Unicode MS"]
begin
  
  # 在这个位置插入面的语句
  InputMap::create

  
  Graphics.freeze
  $scene = Scene_Title.new
  # ...
#======插入位置的代码示例结束了=================


附录:
默认的键盘映射表(含创建过程):

  1. # 这里定义了默认的输入映射表,比起VX默认的键盘设置,新增了鼠标确认取消、
  2. # WSAD和小键盘2468对应行走,加入小键盘1379斜方向行走键。
  3. def Input.use_default_key_map
  4.   InputMap::clear_input_map
  5.   
  6.   InputMap::create_input_ex(Input::C, [VK_SPACE, VK_ENTER, VK_X, VK_LBUTTON])
  7.   InputMap::create_input_ex(Input::B, [VK_NUMPAD0, VK_ESCAPE, VK_Z, VK_RBUTTON])
  8.   InputMap::create_input_ex(Input::A, [VK_C])
  9.   
  10.   InputMap::create_input_ex(Input::DOWN, [VK_DOWN, VK_S, VK_NUMPAD2])
  11.   InputMap::create_input_ex(Input::UP, [VK_UP, VK_W, VK_NUMPAD8])
  12.   InputMap::create_input_ex(Input::LEFT, [VK_LEFT, VK_A, VK_NUMPAD4])
  13.   InputMap::create_input_ex(Input::RIGHT, [VK_RIGHT, VK_D, VK_NUMPAD6])

  14.   InputMap::create_input_ex(Input::NE, [VK_NUMPAD9])
  15.   InputMap::create_input_ex(Input::NS, [VK_NUMPAD7])
  16.   InputMap::create_input_ex(Input::SE, [VK_NUMPAD3])
  17.   InputMap::create_input_ex(Input::SS, [VK_NUMPAD1])

  18.   InputMap::create_input_ex(Input::SHIFT, [VK_SHIFT])
  19.   InputMap::create_input_ex(Input::ALT, [VK_ALT])
  20.   InputMap::create_input_ex(Input::CTRL, [VK_CONTROL])
  21.    
  22.   InputMap::create_input_ex(Input::F5, [VK_F5])
  23.   InputMap::create_input_ex(Input::F6, [VK_F6])
  24.   InputMap::create_input_ex(Input::F7, [VK_F7])
  25.   InputMap::create_input_ex(Input::F8, [VK_F8])
  26.   InputMap::create_input_ex(Input::F9, [VK_F9])
  27.   
  28.   InputMap::create_input_ex(Input::X, [VK_J])
  29.   InputMap::create_input_ex(Input::Y, [VK_K])
  30.   InputMap::create_input_ex(Input::Z, [VK_L])
  31.    
  32.   InputMap::create_input_ex(Input::L, [VK_Q, VK_PRIOR])
  33.   InputMap::create_input_ex(Input::R, [VK_E, VK_NEXT])
  34. end
复制代码

评分

参与人数 3星屑 +2236 收起 理由
enghao_lim + 60 的确是好物。
DeathKing + 1776 D计划奖励
亿万星辰 + 400 好物……

查看全部评分

Lv1.梦旅人

梦石
0
星屑
50
在线时间
115 小时
注册时间
2010-5-3
帖子
346
2
发表于 2011-3-20 23:29:36 | 只看该作者
这个与全键盘操作好像没什么太大的区别啊
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
178 小时
注册时间
2011-1-14
帖子
33
3
 楼主| 发表于 2011-3-20 23:35:31 | 只看该作者
本帖最后由 micmoc 于 2011-3-20 23:40 编辑

回复 反斗奇彬 的帖子

嗯 操作是没太大区别 就是为了兼容和使用简便
只不过看一般的全键盘支持一个按键的状态查询
我这个是支持逻辑输入所映射的所有按键的状态查询并给出一个确切的状态
如果不用扩展功能的话 跟VX的默认用法都是一样的

点评

与全键盘还是有不少区别的,为此我在发布页更新了动态输入映射表和全键盘的对比说明,参见“关于动态输入映射表和全键盘”。  发表于 2011-3-21 23:34
和这个是一样的么?? http://bbs.66rpg.com/thread-161331-1-1.html  发表于 2011-3-21 19:33
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
239
在线时间
2399 小时
注册时间
2008-4-11
帖子
12326

贵宾第6届短篇游戏比赛季军

4
发表于 2011-3-21 19:01:04 | 只看该作者
能不能上传一个截图,比较容易懂?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
178 小时
注册时间
2011-1-14
帖子
33
5
 楼主| 发表于 2011-3-21 21:25:32 | 只看该作者
回复 一瞬间的幻觉 的帖子

你想看哪种截图?
扩展功能的“截文本”就是使用样例里展示的那样

这个就是低层级的可扩展代码包,直接替换了Input模块,无论功能还是代码接口与新建的VX项目是完全一样的。运行起来唯一与原来有区别的就是WSAD、上下左右和小键盘都支持方向键功能(参见附录默认的键盘映射表)。

回复 支持 反对

使用道具 举报

Lv1.梦旅人

狂気の月兔

梦石
0
星屑
231
在线时间
1245 小时
注册时间
2009-4-7
帖子
879

贵宾

6
发表于 2011-3-22 07:47:37 | 只看该作者
按键和收入情况对应么? 这个是想过. 只是懒得去写就是了.

敢问内部原理~~~
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
131 小时
注册时间
2010-6-24
帖子
623
7
发表于 2011-3-22 10:28:17 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1239
在线时间
668 小时
注册时间
2009-11-11
帖子
2787
8
发表于 2011-3-22 12:31:34 | 只看该作者
再用键盘影射到手柄,谢谢LZ了

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
178 小时
注册时间
2011-1-14
帖子
33
9
 楼主| 发表于 2011-3-22 23:59:34 | 只看该作者
本帖最后由 micmoc 于 2011-3-23 00:06 编辑

回复 铃仙·优昙华院·因幡 的帖子
每一个逻辑输入有一个数组填了映射的虚拟键码
查询逻辑输入状态时候会去检查与之映射的虚拟键状态
之后根据映射键状态返回逻辑输入的状态
就这么简单……

回复 san9 的帖子
就素酱子
其实virtual key也不素1对1滴~

点评

谁说VKEY了~我说机器码~~  发表于 2011-3-23 08:01
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
19 小时
注册时间
2011-7-15
帖子
31
10
发表于 2011-7-20 12:26:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-27 03:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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