电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
天下第一武道会惊现开挂孙悟空!蛇皮走位秀翻全场,成为最强男人!
分 享
扫描二维码分享
天下第一武道会惊现开挂孙悟空!蛇皮走位秀翻全场,成为最强男人!
arduino
游戏摇杆
组合键
xukejing
关注
发布时间: 2020-03-12
丨
阅读: 2667
## 项目简介 大家好,我是你们的老朋友xukejing。大家是否还记得大约两年前,我给王者峡谷的安吉拉做过一个硬件外挂,实现了一键自动连招,从此在排位赛里所向披靡,甚至把强大的亚瑟打得满地找牙。 ![](https://cf01.ickimg.com/bbsimages/202003/9bad63b43a256bc0546a3bb83cd82d67.gif) 帖子地址在这里: [https://www.icxbk.com/article/detail/139.html](https://www.icxbk.com/article/detail/139.html "https://www.icxbk.com/article/detail/139.html") 今天,我们来玩玩另一个游戏——《龙珠Z真武道会》。我们给它做个物理外挂,让孙悟空成为地球最强男人! ## 项目背景 在另一个平行宇宙,一位不知姓名的有钱人举办了“天下第一武道会”,比赛的参赛者有贝吉塔、克林、比克、沙鲁、魔人布欧等强者,可谓高手如云。 孙悟空为了获得比赛的高额奖金,也去参赛了。 然而,在试炼过程中,孙悟空遭遇了瓶颈,战力已经很久没有提升了。由于出招表实在是太麻烦了,导致经常接不上连招,或者发不出超必杀。 于是,我把那个给安吉拉做的物理外挂给改造了一下,重新给孙悟空量身定制了一套程序代码,可以一键打出一套乾坤大挪移多点暴击,或者一键打出组合键大招。 ![](https://cf01.ickimg.com/bbsimages/202003/d1994f83d44025c34d5c26e99b287c98.jpg) 这东西有多强呢?口说无凭,我先透露一下实际对打效果吧。 当手柄最上一排第三个键被按住时,就会快速同步连击按爆气键+重拳键。下面这个动图中的完整11 HITs连续暴击就是手柄程序控制的。我们可以看到我方孙悟空发出一记击飞后马上接起一连串蛇皮走位的瞬移重击,最后还接个“龟派气功”。而另一边电脑控制的孙悟空在这样的攻击下像个洋娃娃一样被鞭尸,完全没有招架能力。 ![](https://cf01.ickimg.com/bbsimages/202003/a2ddca7d2db63db02473ad0fff908e67.gif) 然后,原本需要组合键的大招“元气弹”也是可以用手柄一键发出来的。当手柄最上一排第二个键被按住时,就会同步按下上键+气功波键,发出必杀技“元气弹”。下面的这个动图中,我们可以看到另一个电脑控制的孙悟空先挨了一记气功波被打翻在地,刚站起来还没来得及防守,马上又遭遇了一记无缝连接的“元气弹”,被碾压得屁滚尿流。 ![](https://cf01.ickimg.com/bbsimages/202003/e18417ed61b81f9050221f4513d07aee.gif) ## 硬件原理图 “物理外挂”作为一个硬件开发项目,总得介绍一下原理图的。后面的程序代码也需要根据原理图来写。 主控板使用了Arduino Micro,它的特点是Mega32U4芯片自带USB硬件,可以编程变成USB键盘、鼠标或者游戏摇杆。Arduino Micro板子很小,并没有太多的IO接口,当需要控制多个按键时就要设计矩阵键盘电路了。作为游戏摇杆,经常会有组合按键,必须全键无冲,因此矩阵键盘里需要设计防止按键冲突的二极管电路。这个线路板完全是用洞洞板和飞线连接的,如下图所示。DIY爱好者们应该会很喜欢这个做法,不需要专门打板,谁都可以复制。 ![](https://cf01.ickimg.com/bbsimages/202003/0d6b416af8f1a072fa7d64f2190086ac.jpg) 矩阵键盘及摇杆的原理图如下。其中矩阵键盘是4列x2行,要用掉6个IO接口;摇杆的X轴和Y轴电位器使用了两个ADC引脚。 ![](https://cf01.ickimg.com/bbsimages/202003/9ceda3979e5a799374e5d7ad79c16aa5.jpg) 上图中,U1就是Arduino Micro。我们需要使用它的D8和D9作为矩阵键盘的行引脚,分别接入到ROW1和ROW2节点。D2到D5作为矩阵键盘的列引脚,分别接入到COL1到COL4节点。A2和A3是ADC,用于摇杆电位器输入。代号U2的摇杆上有两个电位器,分别输入摇杆的X轴和Y轴角度,两个电位器的VCC和GND接到Arduino Micro的电源输出上。 按键使用了机械键盘专业的黑轴,力度和键程的手感是比较好的。 矩阵键盘上的防按键冲突二极管,因为电流不大,用价格便宜速度快的1N4148是比较合适的。如果拆解市场上的很多产品,你也会发现矩阵键盘的二极管都是1N4148。比如前段时间拆开的那台电子琴,那篇文章里有键盘PCB电路的照片,大家自己去看吧。 [https://www.icxbk.com/article/detail/1227.html](https://www.icxbk.com/article/detail/1227.html "https://www.icxbk.com/article/detail/1227.html") ## 第一版代码 第一版代码的开源地址: [https://github.com/xukejing/pspJoystick/tree/master/test1](https://github.com/xukejing/pspJoystick/tree/master/test1 "https://github.com/xukejing/pspJoystick/tree/master/test1") 第一版代码实现了基本的游戏手柄功能。还没有加入自动连招功能。代码如下: ![](https://cf01.ickimg.com/bbsimages/202003/06af323795f4b28dcd79ccbe8a3b9682.png) 把以上代码烧写到板子上就能玩了。下面,我将说一下代码为什么要这么写。 手柄上有个控制人物移动的摇杆。在loop循环里,每隔10毫秒,就会上报一次摇杆xy轴数据。也就是每秒上传100次x和y轴角度。这个上报频率是可以修改的,据我测试,只要每秒超过30次,就已经感觉不出延迟了。摇杆上下左右的模拟量,在游戏中映射到了x和y轴,如下图所示。 ![](https://cf01.ickimg.com/bbsimages/202003/8119abc5aa53f62f3a11715c86e6ff97.jpg) 我们的代码也需要与游戏的接口一致。上下是y轴,左右是x轴。所以,板子向电脑上传摇杆x轴和y轴角度的函数接口要分别用Gamepad.xAxis()和Gamepad.yAxis(),下图演示的是摇杆移动动作与游戏的连接,动作输入正常。 ![](https://cf01.ickimg.com/bbsimages/202003/4fea7c24a510941e37beb349a3416d9b.jpg) 按键事件在loop循环中每循环都会被处理,以获得最好的实时性。控制按键下压的gamepad.press函数的输入变量是要发送给电脑的键值,这个值要对应于游戏中的功能键的键值。这一步要仔细一点,千万别把键值输错位了。举个例子,l和r键,在游戏里的键值是7和8,如下图所示。 ![](https://cf01.ickimg.com/bbsimages/202003/7ac2563deef66104a2dba591686cb1aa.jpg) 所以,为了让游戏识别到l键(集气)被按下,板子就需要执行gamepad.press(7);为了让游戏识别到r键(爆气)被按下,板子就需要执行gamepad.press(8)。 游戏的上下左右方向键(方向按键是开关输入,并不是摇杆的上下左右模拟量),在游戏里的键值如下 ![](https://cf01.ickimg.com/bbsimages/202003/f3b4e0f308b0842cd5f13a8f616f03df.jpg) 分析上图可得方向键的上、下、左、右分别是11、13、12、14。因此,板子发送方向键上需要这么写:gamepad.press(11)。其他方向以此类推。 游戏的4个功能的键值如下 ![](https://cf01.ickimg.com/bbsimages/202003/2d1871858af7274a2e814c102c94c7e9.jpg) 所以,为了让游戏识别到o键(气功波键)被按下,板子就需要执行gamepad.press(3);为了让游戏识别到x键(防御键)被按下,板子就需要执行gamepad.press(2);为了让游戏识别到方块键(轻拳键)被按下,板子就需要执行gamepad.press(4);为了让游戏识别到三角键(重拳键)被按下,板子就需要执行gamepad.press(1)。 继续回到游戏里试验一下,看看键位对不对。 连按摇杆的轻拳键,下图中可以看到方块键被按下。当我方孙悟空连续4个轻拳(出招表:rrrr)打出后,我们一套“咏春拳”把另一侧的电脑孙悟空的肚子给打疼了,只见他痛苦地弯下了腰,表情非常痛苦。 ![](https://cf01.ickimg.com/bbsimages/202003/6d081512dba2d06920c2a36d7e013044.jpg) 连按摇杆的重拳键,下图中可以看到三角键被按下。当我方孙悟空连续4个重拳(出招表:ssss)打出后,我们把另一侧的电脑孙悟空给击飞了 ![](https://cf01.ickimg.com/bbsimages/202003/b6f77d3f62ab4266a2225fa735cc27f6.jpg) 连按摇杆的气功波键,下图中可以看到o键被按下,同时可以看到有气功波小球打向另一侧的电脑孙悟空。 ![](https://cf01.ickimg.com/bbsimages/202003/20eabadcc432aff655c3f14ef70ad014.jpg) ## 第二版代码 第二版代码的开源地址: [https://github.com/xukejing/pspJoystick/blob/master/test2](https://github.com/xukejing/pspJoystick/blob/master/test2 "https://github.com/xukejing/pspJoystick/blob/master/test2") 第二版代码就花哨了!它被加入了“硬件外挂”的功能,实现了一键连招、一键大招,完整代码如下: ![](https://cf01.ickimg.com/bbsimages/202003/7a194d3d233fbe6a3a98e7a868394db1.png) 游戏中,单独按下“爆气键”是不会产生伤害的,它只有与其他键组合才有用。 然后,当我们需要控制孙悟空做出乾坤大挪移般瞬移连续攻击接龟派气功时,需要快速按“爆气键”+“重拳键”。所以,完全可以把没有独立存在意义的“爆气”给取消了,换成“快速按下放开”组合键——“爆气+重拳”。 这个“快速”有多快呢?请看局部代码 ![](https://cf01.ickimg.com/bbsimages/202003/ca6502b0288a124f98075833bbb2e71a.jpg) 当C1==1时候,就循环按下“爆气键”+“重拳键”20毫秒,放开20毫秒。有一点需要提醒,虽然开头有个大于10毫秒的判断,但这里不是10+20=放开30毫秒,而是放开20毫秒。因为内部延时40毫秒,大于10毫秒,所以第一个检测是否大于10毫秒的语句会直接进入。 上面的C1=1由矩阵键盘按键触发。C1被赋值1的位置请看按键按下事件中的局部代码: ```c else if (kpd.key[i].kchar == '1') { Gamepad.press(8); Gamepad.press(1); delay(20); Gamepad.write(); Gamepad.release(8); Gamepad.release(1); delay(20); Gamepad.write(); c1 = 1; } ``` 在按键按下一瞬,先打出第一个组合键攻击,然后就会因为C1=1而进入前面的循环自动点击状态。速度相当于每秒打出25个组合键。游戏会自动过滤掉过快的按键,剩下的有效按键就会无缝接成连招。 C1=0关闭连招由按键放开来控制。请看按键放开事件中的局部代码: ```c else if (kpd.key[i].kchar == '1') { Gamepad.release(11); Gamepad.release(3); Gamepad.write(); c1 = 0; } ``` 当自动组合攻击键被放开,“爆气键”+“重拳键”一起放开,然后C1=0,退出循环自动点击。 下图是“龟派气功”刚打出时的截图,这招只有在“爆气键”+“重拳键”连续打出瞬移暴击后才能使出,可以看到图中R和三角键是按下的。 ![](https://cf01.ickimg.com/bbsimages/202003/086db64b05268c88e9d7181e0559a429.jpg) 我们再看看大招必杀技“元气弹”的控制。“元气弹”的组合键是方向上+O键。请看按键按下事件中的局部代码: ```c else if (kpd.key[i].kchar == '2') { Gamepad.press(11); Gamepad.press(3); } ``` 可以分析,方向键上下左右只有上有用,然后上键需要组合才能发大招,所以上键也没有单独存在的必要,我们完全可以用一个键来代替。 下图是我方孙悟空举起元气弹正要扔出(出招表:上+E)时候的截图。这招原来是要方向上键和O键同步按下,但是现在可以用摇杆一键解决了。 ![](https://cf01.ickimg.com/bbsimages/202003/c4f4ab411fc536e42194d9c7f0a05a09.jpg) ## 结果 这个摇杆,经测试,不止孙悟空可以使用,对贝吉塔也有效果。虽然贝吉塔没有瞬移多点暴击的能力,但大招的出招方法与孙悟空一致。 下面的动图中,贝吉塔通过本“物理外挂”发出了大招,把克林暴打了一顿: ![](https://cf01.ickimg.com/bbsimages/202003/5499b3bd4a5e1824754ff911039c4c76.gif) 孙悟空和贝吉塔都是战力爆表的赛亚人,现在还有了物理外挂加持,无缝衔接大招。这届天下第一武道会想必一定是神仙打架,特别好看了。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
xukejing
擅长:其他应用
关注
评论
(1)
登录后可评论,请
登录
或
注册
xdsnet
64
天前...
文章很好,就是代码部分有问题,估计是markdown解析问题,或者是输入内容没有处理好层次结构。
0
回复
发布
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交