以前用BlueNRG-1实现了单点触摸屏,最近开始玩刺激战场手游,观战别人时看到高手的操作都非常流畅自己怎么练习也没练出人家的水平,在淘宝里搜索“吃鸡神器”倒是有很多宝贝可选,一种是使用物理触点按下屏幕的,还有一种是使用一个设备连接手机,然后再把键盘和鼠标连接到这个设备上控制游戏的,出于爱好想自己DIY一个玩玩。 使用物理触点的方式需要自己制作机械结构难度比较大,而且操作起来也功能有很多限制,第二种方式好像是弄一个USB HUB让手机同时连接键盘鼠标或者通过USB连接一个键盘和一个鼠标,再使用BLE HID来实现复合设备把键盘鼠标的操作发送到手机,在游戏的设置里找了没发现有键盘映射相关的设置,在网上查资料看到好像需要使用模拟器才能使用键盘映射功能,看淘宝里有的说是直接通过BLE连接到手机就可以玩,不知道他的设备是怎么实现键盘映射的,我能想到的方案是使用BLE HID 键盘屏设备,将键盘和鼠标转换成相应的触摸操作,因为如果要实现全功能的操作至少需要2点触摸,大于2点的触摸操在BlueNRG-1上作弄了好几天都没成功,这一步就没法继续往下走了。 除了使用外接键盘鼠标还有一种方式我觉得应该比键盘鼠标更好,就是在手机上安装几个按钮,再通过BLE HID 触摸屏将按钮转换成对应的坐标,功能类似于物理触点的方案,但是比物理触摸更方便的是按键位置不受限制,没有物理触摸不阻挡屏幕,和鼠标键盘相比因为不需要外接其它设备拿着更方便,和手机屏幕同时触摸屏配合玩起来也更顺手。 实现常用的像开火、开镜、跳跃、蹲、爬这些操作单点触摸也够用了,于是就准备在之前用BlueNRG-1完成的单点触摸基础上改增加一些坐标实现指定时间的点击和松开,首先实现的是开火,想得到相应的坐标可以打开手机的USB调试打开显示触摸操作和指针位置,点击相应的位置再查看对应的坐标,开火在我的手机对应的坐标是x=185,y=747左右,把它放到程序里再设置按下的时间和松开的时间就能完成开火操作。 我的屏幕分辨率是2560*1440,HID的描述符里设置了最大值是10000,需要将坐标进行转换,比如要点击x=185,要用发送的X坐标数据则是10000/1440*185。 - #include "touch.h"
- //是否执行触摸动作
- uint8_t touchFlag = 0;
- //每发送一次触摸动作加1
- uint32_t touchEventCounter = 0;
- typedef struct
- {
- uint8_t onTouch;
- uint16_t x;
- uint16_t y;
- }Touch_t;
- Touch_t touch;
- uint16_t jump[] = {2450,1000,50};
- uint16_t fire[] = {185,747,50};
- //输入值与输出值的比例
- float xP = 1000/1440;
- float yP = 1000/2560;
- uint8_t Action(uint16_t *action)
- {
- //按下n个APP_Tick周期
- if(touchEventCounter < action[2])
- {
- touch.onTouch = 255;
- touch.x = action[0];
- touch.y = action[1];
- }
- //松开1个APP_Tick周期
- else if(touchEventCounter < action[2]+1)
- {
- touch.onTouch = 0;
- touch.x = action[0];
- touch.y = action[1];
- }
- //清计数
- else
- {
- touchEventCounter = 0;
- touchFlag = 0;
- //动作完成后返回0
- return 0;
- }
- //返回1时动作没执行完
- return 1;
- }
- void Touch(uint8_t *buff)
- {
- uint16_t x,y;
- touchEventCounter++;
- if(touchFlag == 0)return;
- Action(fire);
- buff[0] = touch.onTouch;
- x=2560;//(uint16_t)((uint32_t)touch.x * xP);
- y=(uint16_t)(touch.y * yP);
- buff[2] = x>>8;
- buff[1] = x;
- buff[4] = y>>8;
- buff[3] = y;
- }
复制代码
开火操作成功后下一步是增加跳跃,跳跃的坐标是x=2450,y=1000左右,设置好以后在游戏里操作发现Y的位置正确,X的位置回到0了,调试后发现10000/1440*2450后发送的数据已经超过10000了,因为屏幕的x最大只有1440,发送2450当然会超出最大值,原因是开启手游手手机屏幕自动翻转了,原来的x坐标实现是用来控制手机的Y,原来的y是用来控制手机的X,所以控制Y没问题,控制X最大就只能是1440了,对应屏幕翻转后的Y就只能操作左边的半个屏幕,在网上找了一些资料,有说是屏幕翻转后手机没有对HID设备的坐标重新适配,因为对android底层不了解,这个问题也没法解决了。 既然不能操作右半屏幕,是不是可以把所有想操作的按钮都移动到左边?,按照这个方法修改按钮位置后就变成下边这样, 常用功能是可以实现了,简单操作后又发现一个问题,BlueNRG-1实现的触摸屏和手机上的触摸屏是互斥的,比如BlueNRG-1按下了开火按钮没有松开,这时手指在屏幕上操作(比如移动方向)BlueNRG-1按下的开火按键就会自动松开,两个触摸操作不能共存,在网上没找到相应的资料,估计这个想在手机上改也比较麻烦,2个触摸设备如果不能同时操作游戏就没法玩了,比如这边开着火,手指一摸屏幕跟踪敌人就停止射击,或者手指一直触摸屏幕调整方向这边又开不了火都对操作有非常大的影响,弄到这儿,这几天的功夫算是白费,有时间还得再弄弄多点触摸才行。
|