著录项信息
专利名称 | 应用程序的控制方法、装置及设备 |
申请号 | CN201710573725.3 | 申请日期 | 2017-07-14 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2017-11-17 | 公开/公告号 | CN107357586A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F9/44 | IPC分类号 | G;0;6;F;9;/;4;4查看分类表>
|
申请人 | 腾讯科技(深圳)有限公司 | 申请人地址 | 广东省深圳市南山区高新区科技中一路腾讯大厦35层
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 腾讯科技(深圳)有限公司 | 当前权利人 | 腾讯科技(深圳)有限公司 |
发明人 | 夏富荣;陆鹤云 |
代理机构 | 北京三高永信知识产权代理有限责任公司 | 代理人 | 刘映东 |
摘要
本发明公开了一种应用程序的控制方法、装置及设备,属于人机交互领域。所述方法包括:通过虚拟引擎拦截压力触控事件;通过虚拟引擎将压力触控事件传递至应用程序的外层程序;通过应用程序的外层程序将压力触控事件传递至应用程序的内层程序;通过应用程序的内层程序根据压力触控事件执行预定操作。本发明解决了由于应用程序的内层程序无法直接在操作系统中运行,需要增加外层程序后才能正常运行,但因外层程序的存在,导致应用程序无法直接对压力触控事件进行处理的问题;从而实现了基于虚拟引擎开发的应用程序中能够采用压力触控技术进行输入控制,在移动终端有限的屏幕面积上实现多种控制指令的触发,从而提高人机交互的效率。
1.一种应用程序的控制方法,其特征在于,应用于安装有虚拟引擎和应用程序的终端中,所述应用程序是基于所述虚拟引擎开发的程序,所述应用程序包括外层程序和内层程序,所述方法包括:
所述虚拟引擎拦截压力触控事件,所述压力触控事件包括操作坐标和压力值;
所述虚拟引擎将所述压力触控事件传递至所述外层程序;
所述外层程序将所述压力触控事件传递至所述内层程序;
所述内层程序根据所述压力触控事件执行预定操作。
2.根据权利要求1所述的方法,其特征在于,所述外层程序是采用第一编程语言开发的程序,所述内层程序是采用第二编程语言开发的程序;
所述外层程序将所述压力触控事件传递至所述内层程序,包括:
所述外层程序将所述压力触控事件发送至所述内层程序的主线程中;
所述内层程序的主线程将所述压力触控事件传递至所述内层程序的输入控制器;
其中,所述输入控制器是用于处理外部输入信号的程序模块。
3.根据权利要求2所述的方法,其特征在于,所述终端采用第一操作系统,所述终端还安装有预设程序;
所述虚拟引擎将所述压力触控事件传递至所述外层程序之前,还包括:
在所述应用程序启动时,所述预设程序将所述虚拟引擎中的消息转发代码的消息接收方从所述内层程序修改为所述外层程序;
所述虚拟引擎将所述压力触控事件传递至所述外层程序,包括:
所述虚拟引擎中按照所述预设程序修改后的所述消息转发代码,将所述压力触控事件传递至所述外层程序。
4.根据权利要求3所述的方法,其特征在于,所述在所述应用程序启动时,所述预设程序将所述虚拟引擎中的消息转发代码的消息接收方从所述内层程序修改为所述外层程序,包括:
在所述应用程序启动时,所述预设程序获取所述虚拟引擎在内存中的基地址;
所述预设程序按照所述基地址和预设偏移地址定位所述消息转发代码对应的代码位置;
所述预设程序根据定位到的所述代码位置将所述消息转发代码的消息接收方地址从所述内层程序修改为所述外层程序。
5.根据权利要求2所述的方法,其特征在于,所述终端采用第二操作系统;
所述外层程序将所述压力触控事件发送至所述内层程序的主线程之前,还包括:
所述内层程序向所述外层程序发送调用请求,所述调用请求用于指示所述外层程序在接收到所述压力触控事件时转发至所述内层程序。
6.根据权利要求5所述的方法,其特征在于,所述第二操作系统包括系统级用户界面UI框架;
所述虚拟引擎拦截压力触控事件,包括:
所述虚拟引擎在所述系统级UI框架拦截所述压力触控事件。
7.根据权利要求1至6任一所述的方法,其特征在于,所述内层程序根据所述压力触控事件执行预定操作,包括:
所述内层程序从所述压力触控事件中解析出所述操作坐标和所述压力值;
所述内层程序确定与所述操作坐标对应的输入控件;
当所述压力值大于预定阈值时,所述内层程序执行与所述输入控件对应的第一操作;
当所述压力值小于所述预定阈值时,所述内层程序执行与所述输入控件对应的第二操作。
8.一种应用程序的控制装置,其特征在于,所述装置包括:虚拟引擎模块和应用程序模块,所述应用程序是基于所述虚拟引擎模块开发的程序,所述应用程序模块包括外层程序模块和内层程序模块;
所述虚拟引擎模块,用于拦截压力触控事件,所述压力触控事件包括操作坐标和压力值;
所述虚拟引擎模块,用于将所述压力触控事件传递至所述外层程序模块;
所述外层程序模块,用于将所述压力触控事件传递至所述内层程序模块;
所述内层程序模块,用于根据所述压力触控事件执行预定操作。
9.根据权利要求8所述的装置,其特征在于,
所述外层程序模块,用于将所述压力触控事件发送至所述内层程序模块的主线程中;
所述内层程序模块,用于通过所述主线程将所述压力触控事件传递至所述内层程序模块的输入控制器;
其中,所述输入控制器是所述内层程序模块中用于处理外部输入信号的程序模块。
10.根据权利要求9所述的装置,其特征在于,所述装置采用第一操作系统,所述装置还包括:预设程序模块;
所述预设程序模块,用于在所述应用程序启动时,将所述虚拟引擎中的消息转发代码的消息接收方从所述内层程序模块修改为所述外层程序模块;
所述虚拟引擎模块,用于按照所述预设程序模块修改后的所述消息转发代码,将所述压力触控事件传递至所述外层程序模块。
11.根据权利要求10所述的装置,其特征在于,
所述预设程序模块,用于在所述应用程序启动时,获取所述虚拟引擎模块在内存中的基地址;按照所述基地址和预设偏移地址定位所述消息转发代码对应的代码位置;根据定位到的所述代码位置将所述消息转发代码的消息接收方地址从所述内层程序模块修改为所述外层程序模块。
12.根据权利要求9所述的装置,其特征在于,
所述内层程序模块,还用于向所述外层程序模块发送调用请求,所述调用请求用于指示所述外层程序模块在接收到所述压力触控事件时转发至所述内层程序模块。
13.根据权利要求8至12任一所述的装置,其特征在于,
所述内层程序模块,用于从所述压力触控事件中解析出所述操作坐标和所述压力值;
确定与所述操作坐标对应的输入控件;当所述压力值大于预定阈值时,执行与所述输入控件对应的第一操作;当所述压力值小于所述预定阈值时,执行与所述输入控件对应的第二操作。
14.一种终端,其特征在于,所述终端包括处理器和存储器,所述存储器中存储有至少一条指令,所述指令由所述处理器加载并执行以实现如权利要求1至7任一所述的应用程序的控制方法。
15.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令,所述指令由处理器加载并执行以实现如权利要求1至7任一所述的应用程序的控制方法。
应用程序的控制方法、装置及设备\n技术领域\n[0001] 本发明涉及人机交互领域,特别涉及一种应用程序的控制方法、装置及设备。\n背景技术\n[0002] 移动终端上存在很多采用虚拟引擎开发的应用程序,特别是存在很多采用三维虚拟引擎开发的应用程序,比如:虚拟现实应用程序、三维地图程序、第一人称射击游戏(First-person shooting game,FPS)、多人在线战术竞技游戏(Multiplayer Online Battle Arena Games,MOBA)。\n[0003] 目前较为常用的三维虚拟引擎是Unity引擎,以应用程序是基于Unity引擎开发的FPS游戏应用程序为例,用户在使用该FPS游戏应用程序时,用户界面上显示有若干个虚拟按键,用户按压虚拟按键控制游戏角色进行前进、后退、转身和开火等行为。\n[0004] 虽然一些移动终端上配备了压力触控屏幕,但是由于目前的Unity引擎还不能直接支持压力触控功能,所以无法采用压力触控技术对基于Unity引擎开发的应用程序进行控制。\n发明内容\n[0005] 为了解决无法采用压力触控技术对基于Unity引擎开发的应用程序进行控制的问题,本发明实施例提供了一种应用程序的控制方法、装置及设备。所述技术方案如下:\n[0006] 第一方面,提供了一种应用程序的控制方法,应用于安装有虚拟引擎和应用程序的终端中,所述应用程序是基于所述虚拟引擎开发的程序,所述应用程序包括外层程序和内层程序,所述方法包括:\n[0007] 所述虚拟引擎拦截压力触控事件,所述压力触控事件包括操作坐标和压力值;\n[0008] 所述虚拟引擎将所述压力触控事件传递至所述外层程序;\n[0009] 所述外层程序将所述压力触控事件传递至所述内层程序;\n[0010] 所述内层程序根据所述压力触控事件执行预定操作。\n[0011] 第二方面,提供了一种应用程序的控制装置包括:虚拟引擎模块和应用程序模块,所述应用程序是基于所述虚拟引擎模块开发的程序模块,所述应用程序模块包括外层程序模块和内层程序模块;\n[0012] 所述虚拟引擎模块,用于拦截压力触控事件,所述压力触控事件包括操作坐标和压力值;\n[0013] 所述虚拟引擎模块,用于将所述压力触控事件传递至所述外层程序模块;\n[0014] 所述外层程序模块,用于将所述压力触控事件传递至所述内层程序模块;\n[0015] 所述内层程序模块,用于根据所述压力触控事件执行预定操作。\n[0016] 本发明实施例提供的技术方案带来的有益效果是:\n[0017] 通过将压力触控事件传递至应用程序的外层程序,再从应用程序的外层程序传递至应用程序的内层程序,由内层程序根据压力触控事件执行预设操作;解决了由于应用程序的内层程序无法直接在操作系统中运行,需要增加外层程序后才能正常运行,但因外层程序的存在,导致应用程序无法直接对压力触控事件进行处理的问题;从而实现了基于三维虚拟引擎开发的应用程序中能够采用压力触控技术进行输入控制,在移动终端有限的屏幕面积上实现多种控制指令的触发,从而提高人机交互的效率。\n附图说明\n[0018] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。\n[0019] 图1是本发明一个示例性的实施例提供的终端的结构示意图;\n[0020] 图2是本发明一个示例性实施例提供的应用程序的控制方法的流程图;\n[0021] 图3是本发明一个示例性实施例提供的应用程序的控制方法在实施时的界面示意图;\n[0022] 图4是本发明另一个示例性实施例提供的应用程序的控制方法的流程图;\n[0023] 图5是本发明另一个示例性的实施例提供的终端的结构示意图;\n[0024] 图6是本发明另一个示例性实施例提供的应用程序的控制方法的流程图;\n[0025] 图7是本发明另一个示例性的实施例提供的终端的结构示意图;\n[0026] 图8是本发明另一个示例性实施例提供的应用程序的控制方法的流程图;\n[0027] 图9是本发明另一个示例性的实施例提供的终端的结构示意图;\n[0028] 图10是本发明另一个示例性实施例提供的应用程序的控制方法的流程图;\n[0029] 图11是本发明另一个示例性的实施例提供的终端的结构示意图;\n[0030] 图12是本发明另一个示例性实施例提供的应用程序的控制方法的流程图;\n[0031] 图13是本发明另一个示例性实施例提供的应用程序的控制方法的流程图;\n[0032] 图14是本发明一个示例性实施例提供的应用程序的控制装置的的框图。\n具体实施方式\n[0033] 为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。\n[0034] 常见的虚拟引擎为Unity引擎,基于Unity引擎开发的应用程序通常采用C#编程语言编写。在将基于Unity引擎开发的应用程序发布到不同的操作系统上时,由于不同的操作系统上所支持的编程语言是不同的,所以需要对应用程序进行适应性的修改。比如,安卓操作系统支持以Java编程语言开发的应用程序,则需要对基于C#编程语言编写的应用程序增加一个Java编程语言编写的外层程序后,才能在安卓操作系统中正常运行;又比如,IOS操作系统支持以Object-C编程语言开发的应用程序,则需要对基于C#编程语言编写的应用程序增加一个Object-C编程语言编写的外层程序后,才能在IOS操作系统中正常运行。\n[0035] 由于外层程序的存在,导致基于C#编程语言编写的应用程序无法获取到操作系统底层的压力触控事件,所以不支持压力触控技术。为此,本发明实施例提供了如下实施例,用于解决该技术问题。\n[0036] 图1是本发明一个示例性的实施例提供的终端的结构示意图。如图1所示,该终端包括处理器11、触摸屏12以及存储器13。\n[0037] 处理器11可以是单核处理器、多核处理器、嵌入式芯片以及具有指令运行能力的处理器中的至少一种。\n[0038] 触摸屏12为压力感应触摸屏,压力感应触摸屏可以对施加在触摸屏12上的按压力度进行测量。\n[0039] 存储器13存储有处理器11的可执行程序。示意性的,存储器13中存储有应用程序A、应用程序B、应用程序C、虚拟引擎17、压力感应模块18、操作系统的内核层19。示意性的,应用程序A包括了应用程序A的外层程序141和应用程序A的内层程序142。其中,应用程序A为基于虚拟引擎17开发的应用程序,应用程序A的外层程序采用第一编程语言进行开发,应用程序A的内层程序采用第二编程语言进行开发。可选地,第一编程语言为操作系统的应用层所直接支持的开发语言,第二编程语言为应用程序初始开发时所使用的编程语言,第一编程语言与第二编程语言为两种不同的编程语言,且在没有应用程序A的外层程序的情况下,应用程序A的内层程序无法直接运行在操作系统中。应用程序A的外层程序中包含了应用程序A的内层程序。可选地,应用程序A包括但不限于由虚拟引擎17开发的游戏程序、虚拟现实程序、三维地图程序、三维演示程序中的至少一种。比如,终端的操作系统采用安卓操作系统时,应用程序A的外层程序采用Java编程语言进行开发,应用程序A的内层程序采用C#语言进行开发;又比如,终端的操作系统采用IOS操作系统时,应用程序A的外层程序采用Object-C编程语言进行开发,应用程序A的内层程序采用C#语言进行开发。\n[0040] 虚拟引擎17是一款支持多种操作系统平台的交互式引擎,示意性的,虚拟引擎可用于游戏开发领域、虚拟现实(Virtual Reality,VR)领域以及三维地图领域等多领域的程序开发,虚拟引擎包括但不限于:三维虚拟引擎、二维虚拟引擎等。本发明实施例对虚拟引擎17的具体类型不限,在下文实施例中以虚拟引擎17为三维虚拟引擎,特别是Unity引擎为例来举例说明。\n[0041] 压力感应模块18是用于接收触摸屏驱动程序191所上报的压力触控事件的模块。\n压力触控事件中包括:压力触控事件的压力值以及坐标值。该坐标值用于指示压力触控操作在显示屏上的触控位置。可选地,以显示屏的水平方向建立横坐标轴,显示屏的竖直方向建立竖坐标轴得到一个二维坐标系。\n[0042] 示意性的,内核层19包括了触摸屏驱动程序191以及其它驱动程序192。触摸屏驱动程序191是用于检测压力触控事件的模块,当触摸屏驱动程序191检测到压力触控事件后,将压力触控事件传递给压力感应模块18。\n[0043] 其他驱动程序192可以是与处理器11有关的驱动程序、与存储器13有关的驱动程序、与网络组件有关的驱动程序、与声音组件有关的驱动程序等。\n[0044] 本领域技术人员可以知晓,上述仅为对终端的结构的概括性示意。在不同的实施例中,终端可以具有更多或更少的组件。比如,终端还可以包括重力加速度传感器、陀螺仪传感器、电源等等。\n[0045] 图2是本发明一个示例性实施例提供的应用程序的控制方法的流程图。本实施例以该应用程序的控制方法应用于图1所示的终端中来举例说明。该方法包括:\n[0046] 在步骤101中,虚拟引擎拦截压力触控事件。\n[0047] 压力触控事件是在采用了压力触控技术的触摸屏上触发的触摸事件。在本实施例中,虚拟引擎为应用程序A所使用的引擎。\n[0048] 当用户使用应用程序A时,终端的触摸屏12上显示有应用程序A的用户界面,该用户界面上包括用于人机交互的控件,比如虚拟按钮。用户在触摸屏上施加压力触控操作时,终端的触摸屏驱动程序191会产生压力触控事件,并上报至压力感应模块18。压力感应模块\n18将压力触控事件以消息形式,发送至至少一个应用程序。\n[0049] 其中,虚拟引擎会拦截压力触控事件。\n[0050] 在步骤102中,虚拟引擎将压力触控事件传递至应用程序的外层程序。\n[0051] 应用程序的外层程序采用第一编程语言进行开发,可选地,第一编程语言为操作系统的应用层所直接支持的开发语言,如安卓操作系统的应用层所支持的开发语言为Java,iOS操作系统的应用层所支持的开发语言为Object-C等,本实施例对此不加以限定。\n[0052] 在本实施例中,应用程序A为基于虚拟引擎所开发的应用程序,当虚拟引擎截获到压力触控事件后,将压力触控事件传递至应用程序A的外层程序,压力触控事件包括:该事件的压力值以及坐标值。\n[0053] 在步骤103中,应用程序的外层程序接收到压力触控事件。\n[0054] 该压力触控事件包括:该事件的压力值以及坐标值。\n[0055] 在步骤104中,应用程序的外层程序将压力触控事件传递至应用程序的内层程序。\n[0056] 应用程序的内层程序采用第二编程语言进行开发,可选地,第二编程语言为应用程序原始开发时的编程语言,该编程语言包括但不限于:C语言、Java语言、C#语言、C++语言、Python语言中的至少一种,本实施例以第二编程语言是C#语言来举例说明,但对此不加以限定。\n[0057] 在步骤105中,应用程序的内层程序接收到压力触控事件。\n[0058] 在步骤106中,应用程序的内层程序根据压力触控事件执行预定操作。\n[0059] 示意性的,当压力触控事件中的压力值大于预设阈值时,执行第一预定操作;当压力触控事件中的压力值小于预设阈值时,执行第二预定操作。\n[0060] 综上所述,本发明提供的应用程序的控制方法,通过将压力触控事件传递至应用程序的外层程序,再从应用程序的外层程序传递至应用程序的内层程序,由内层程序根据压力触控事件执行预设操作;解决了由于应用程序的内层程序无法直接在操作系统中运行,需要增加外层程序后才能正常运行,但因外层程序的存在,导致应用程序无法直接对压力触控事件进行处理的问题;从而实现了基于虚拟引擎开发的应用程序中能够采用压力触控技术进行输入控制,在移动终端有限的屏幕面积上实现多种操作指令的触发,从而提高人机交互的效率。\n[0061] 图3是本发明一个示例性实施例提供的应用程序的控制方法在具体实施时的界面示意图。在一个具体的例子中,如图3所示,终端上位于前台运行的应用程序是一个第一人称射击游戏,该应用程序是基于虚拟引擎开发的游戏应用程序,位于前台运行的用户界面为在游戏中以玩家的第一视角进行射击的界面,该界面包括:用于移动角色位置的第一控件331和用于移动视角位置的第二控件332。\n[0062] 第一控件331是用于移动角色位置的控件,由于游戏角色是位于三维虚拟环境中的虚拟人物,用户通过第一控件331可以控制虚拟人物在三维虚拟环境中向前、向后、向左或向右移动。示意性的,用户将第一控件331沿垂直向上滑动,终端将在三维虚拟环境中的虚拟人物向前方移动;用户将第一控件331沿垂直向下滑动,终端将在三维虚拟环境中的虚拟人物会向后方移动;用户将第一控件331沿水平向左滑动,终端将在三维虚拟环境中的虚拟人物向左方移动;用户将第一控件331沿水平向右滑动,终端将在三维虚拟环境中的虚拟人物向右方移动。\n[0063] 第二控件332是用于控制第一视角的视角方向的控件,示意性的,用户采用较轻的压力滑动第二控件332且将第二控件332沿水平向左滑动,应用程序的内层程序判断出压力值未超过预定阈值,则应用程序将游戏中的第一视角向左转动;将第一控件331沿水平向右滑动,用户在游戏中的第一视角向右转动;将第一控件沿垂直向上滑动,用户在游戏中的主观视角向上转动;将第二控件332沿垂直向下滑动,用户在游戏中的主观视角向下转动。\n[0064] 同时,第二控件332还可以用来触发开火操作。当用户采用较重的压力在第二控件\n332上按压时,应用程序的内层程序判断出压力值超过了预定阈值,则应用程序控制游戏角色进行开火操作。也即,用户能够通过不同压力值的压力触控操作,在第二控件332上实现两种不同的控制操作。\n[0065] 在一些实施例中,虚拟引擎本身提供有消息转发代码,该消息转发代码默认将压力触控事件转发至内层程序232。但是由于外层程序231的存在,该消息转发代码会转发失败,不能有效执行。此时需要对虚拟引擎的消息转发代码进行修改。为此,本发明还提供有如下实施例:\n[0066] 图4是本发明另一个示例性实施例提供的终端的结构示意图。示意性的,以终端采用的第一操作系统为例,该第一操作系统是触摸屏驱动程序将压力触控事件不通过图形用户界面组件而直接发送至应用层的操作系统,该第一操作系统包括但不限于:安卓操作系统。\n[0067] 处理器21可以是单核处理器、多核处理器、嵌入式芯片以及具有指令运行能力的处理器中的至少一种。\n[0068] 触摸屏22为压力感应触摸屏,压力感应触摸屏可以对施加在触摸屏12上的按压力度进行测量。\n[0069] 存储器23中存储有处理器21的可执行程序。示意性的,存储器23中存储有应用程序A、应用程序B、应用程序C、C++动态链接库26、虚拟引擎261、压力感应模块262、操作系统的内核层27。示意性的,应用程序A包括了应用程序A的外层程序231和应用程序A的内层程序232。其中,应用程序A为基于虚拟引擎261开发的应用程序,应用程序A的外层程序采用第一编程语言进行开发,应用程序A的内层程序采用第二编程语言进行开发。可选地,第一编程语言为操作系统的应用层所直接支持的开发语言,第二编程语言为应用程序初始开发时所使用的编程语言,第一编程语言与第二编程语言为两种不同的编程语言,且在没有应用程序A的外层程序的情况下,应用程序A的内层程序无法直接运行在操作系统中。应用程序A的外层程序中包含了应用程序A的内层程序。可选地,应用程序A包括但不限于由虚拟引擎\n261开发的游戏程序、虚拟现实程序、三维地图程序、三维演示程序中的至少一种。比如,终端的操作系统采用安卓操作系统时,应用程序A的外层程序采用Java编程语言进行开发,应用程序A的内层程序采用C#语言进行开发;又比如,终端的操作系统采用IOS操作系统时,应用程序A的外层程序采用Object-C编程语言进行开发,应用程序A的内层程序采用C#语言进行开发。\n[0070] 示意性的,内核层27包括了触摸屏驱动程序271以及其它驱动程序272。触摸屏驱动程序271是用于检测压力触控事件的模块,当触摸屏驱动程序271检测到压力触控事件后,将压力触控事件传递给压力感应模块262。\n[0071] 其他驱动程序272可以是与处理器21有关的驱动程序、与存储器23有关的驱动程序、与网络组件有关的驱动程序、与声音组件有关的驱动程序等。\n[0072] 如图4所示出的终端采用第一操作系统时,应用程序A的内层程序232又包括:内层程序的主线程模块233以及输入管理器234;C++动态链接库26又包括:虚拟引擎261和压力感应模块262。\n[0073] C++动态链接库是实现共享函数库概念的一种方式,动态链接库允许进程调用不属于其可执行代码的函数,且动态链接库可以将更新功能应用于应用程序的各个模块而不影响程序的其它部分。换句话说,应用程序A可以调用C++动态链接库26中的各个模块,但C++动态链接库26中的各个模块可以视为不属于应用程序A自身的可执行代码。\n[0074] 压力感应模块262中包括有预设程序,该预设程序是用于对虚拟引擎中的消息转发代码进行修改的程序。\n[0075] 图5是本发明另一个示例性实施例提供的应用程序的控制方法的流程图。本实施例以该应用程序的控制方法应用在图4所示终端中来举例说明。该方法包括:\n[0076] 在步骤301中,预设程序获取虚拟引擎在内存中的基地址。\n[0077] 在应用程序A启动后,C++动态链接库26中的预设程序获取虚拟引擎在内存中运行时的基地址。预设程序可以采用反汇编的形式获取虚拟引擎在内存中的基地址。\n[0078] 内存寻址是指在内存中找到数据或指令的代码位置,对于内存寻址来说,需要通过基地址+偏移地址来定位指令或代码位置。\n[0079] 在步骤302中,预设程序按照基地址和预设偏移地址定位消息转发代码对应的代码位置。\n[0080] 消息转发代码是虚拟引擎中预设的消息转发代码。该消息转发代码用于将拦截到的压力触控事件转发至内层程序。\n[0081] 预设程序根据获取到的基地址以及预设的偏移地址,对消息转发代码在内存中的代码位置进行定位。\n[0082] 在步骤303中,预设程序根据定位到的代码位置将消息转发代码的消息接收方从内层程序修改为外层程序。\n[0083] 由于需要将压力触控事件先传递给外层程序后,再由外层程序传递给内层程序,所以预设程序在定位到消息转发代码的代码位置后,将消息转发代码中的消息接收方从内层程序修改为外层程序。\n[0084] 在步骤304中,虚拟引擎拦截压力触控事件。\n[0085] 当用户使用应用程序时,终端的触摸屏上显示有应用程序的用户界面,该用户界面上包括用于人机交互的控件,比如虚拟按钮。用户在触摸屏上施加压力触控操作时,终端的触摸屏驱动程序会产生压力触控事件,并上报至压力感应模块,虚拟引擎会拦截到该压力触控事件。\n[0086] 在步骤305中,虚拟引擎根据预设程序修改后的消息转发代码,将压力触控事件传递至应用程序的外层程序。\n[0087] 由于修改后的消息转发代码中将压力触控事件的目标地址由内层程序修改为外层程序,故虚拟引擎在拦截到压力触控事件时,根据修改后的消息转发代码将压力触控事件传递至应用程序的外层程序中。\n[0088] 在步骤306中,外层程序将压力触控事件发送至内层程序的主线程中。\n[0089] 在步骤307中,内层程序通过主线程将压力触控事件传递至内层程序中的输入管理器。\n[0090] 输入管理器是在内层程序中负责处理外部输入信号的程序模块。示意性的,输入管理器用于对用户界面显示的虚拟按键上所触发的压力触控事件进行管理,参考图3可知,输入管理器可对第一控件31和第二控件32进行压力触摸事件的管理。\n[0091] 在步骤308中,内层程序通过输入管理器根据压力触控事件执行预定操作。\n[0092] 可选地,输入管理器从压力触控事件中解析出操作坐标和压力值;输入管理器确定与操作坐标对应的输入控件;当压力值大于预定阈值时,输入管理器执行与输入控件对应的第一操作;当压力值小于预定阈值时,输入管理器执行与输入控件对应的第二操作。\n[0093] 综上所述,本实施例提供的应用程序控制方法,通过采用预设程序对虚拟引擎中原始的消息转发代码进行修改,使得虚拟引擎在拦截到压力触控事件后,先将压力触控事件传递至外层程序,再由外层程序传递至内层程序;从而解决了由于应用程序的内层程序无法直接在操作系统中运行,需要增加外层程序后才能正常运行,但因外层程序的存在,导致应用程序无法直接对压力触控事件进行处理的问题;从而实现了内层程序也能够接收到压力触控事件,从而内层程序中的输入管理器也能够对压力触控事件进行处理,从而支持压力触控操作对应用程序的控制,在移动终端有限的屏幕面积上实现多种控制指令的触发,从而提高人机交互的效率。\n[0094] 在一个具体的例子中,图4所示终端采用的第一操作系统是安卓操作系统。图6示出了本发明另一个示例性实施例提供的终端的结构示意图。在终端采用安卓操作系统时,应用程序A的外层程序为Java层57,应用程序A的内层程序为C#层572,其中,应用程序A的Java层中还包括:UI线程模块571;C++动态链接库58中的虚拟引擎为Unity引擎581,压力感应模块582用于拦截压力触控事件且压力感应模块582中包括有预设程序,该预设程序用于修改Unity引擎的消息转发机制;安卓操作系统中还包括:Java虚拟机59。Java虚拟机59用于为应用程序A、应用程序B和应用程序C提供Java运行环境。\n[0095] 可选地,Java语言为安卓操作操作的应用层所支持的编程语言,所以应用程序A的外层程序为Java层的程序模块;可选地,C#语言为应用程序A的原始开发语言,所以应用程序A的内层程序为C#层的程序模块。\n[0096] 虚拟机是一种虚拟化和抽象化的计算机,Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,且具有相应的指令系统,Java虚拟机可以使Java程序只需生成在Java虚拟机上运行的目标代码就可以在多种平台上不加修改的运行。在本实施例中,Java虚拟机用于运行应用程序A的外层程序的各项功能。\n[0097] 上述的预设程序具有地址映射能力。地址映射是指将应用程序中的逻辑地址转换为运行时由机器直接寻址的物理地址的过程。\n[0098] 图7是本发明一个示例性实施例提供的应用程序的控制方法的流程图。本实施例以该应用程序的控制方法应用于图6所示的安卓操作系统中来举例说明。该方法包括:\n[0099] 在步骤501中,在应用程序启动时,C#层进行应用程序的初始化;\n[0100] 用户点击应用程序A的图标后,启动应用程序A。应用程序A的C#层进行初始化,初始化包括但不限于:启动C#层中的主线程、加载图像资源、音频资源和逻辑代码等。\n[0101] 在步骤502中,Unity引擎调用Java层的UI线程;\n[0102] 在应用程序需要显示与三维虚拟环境有关的UI时,由Unity引擎生成UI画面,并调用Java层的UI线程进行显示。\n[0103] 在步骤503中,Java层的UI线程加载C++动态链接库中的压力感应模块;\n[0104] Java层的UI线程在显示UI画面的过程中,会动态加载压力感应模块。该压力感应模块中包括预设程序。\n[0105] 在步骤504中,预设程序获取Unity引擎在内存中的基地址。\n[0106] 预设程序从安卓操作系统中获取Unity引擎在内存中运行时的基地址。预设程序可以采用反汇编的形式获取Unity引擎在内存中的基地址。\n[0107] 在步骤505中,预设程序按照基地址和预设偏移地址定位消息转发代码对应的代码位置。\n[0108] 消息转发代码是Unity引擎中预设的消息转发代码。该消息转发代码用于将拦截到的压力触控事件转发至内层程序。\n[0109] 预设程序根据获取到的基地址以及预设的偏移地址,对消息转发代码在内存中的代码位置进行定位。\n[0110] 在步骤506中,预设程序根据定位到的代码位置将消息转发代码的消息接收方从C#层修改为Java层的UI线程。\n[0111] 由于应用程序A的内层程序为C#层,即应用程序A所使用的开发语言为C#语言,而外层程序的开发语言为Java语言,在不经过Java层的情况下C#层无法获取到压力触控事件,所以需要将压力触控事件先传递给Java层的UI线程后,再由Java层的UI线程传递给C#层。\n[0112] 预设程序在定位到消息转发代码的代码位置后,将消息转发代码中的消息接收方从C#层修改为Java层的UI线程。\n[0113] 在步骤507中,在接收到压力触控操作时,触摸屏驱动程序生成压力触控事件;\n[0114] 在步骤508中,Unity引擎拦截压力触控事件。\n[0115] 当用户使用应用程序A时,终端的触摸屏上显示有应用程序A的用户界面,该用户界面上包括用于人机交互的控件,比如虚拟按钮。用户在触摸屏上施加压力触控操作时,终端的触摸屏驱动程序会产生压力触控事件,并上报至压力感应模块,Unity引擎会拦截到该压力触控事件。\n[0116] 在步骤509中,Unity引擎根据修改后的消息转发代码,将压力触控事件传递至Java层的UI线程。\n[0117] 在本实施例中,由于修改后的消息转发代码中将压力触控事件的目标地址由C#层修改为Java层,故Unity引擎通过该消息转发代码,会将压力触控事件传递至Java层的UI线程。\n[0118] 在步骤510中,Java层的UI线程接收到压力触控事件。\n[0119] 在步骤511中,Java层的UI线程将压力触控事件发送至C#层的主线程中。\n[0120] 当应用程序A是游戏应用程序时,该主线程是用于实现游戏应用程序中主要运行逻辑的主线程。\n[0121] 在步骤512中,C#层的主线程将压力触控事件传递至C#层的输入管理器。\n[0122] 输入管理器是在C#层中负责处理外部输入信号的程序模块。示意性的,输入管理器用于对用户界面显示的虚拟按键上所触发的压力触控事件进行管理,参考图3可知,输入管理器可对第一控件31和第二控件32进行压力触摸事件的管理。\n[0123] 在步骤513中,输入管理器根据压力触控事件生成控制指令;\n[0124] 可选地,输入管理器从压力触控事件中解析出操作坐标和压力值;输入管理器确定与操作坐标对应的输入控件(比如第二控件);当压力值大于预定阈值时,输入管理器生成与输入控件对应的第一操作指令,比如改变第一视角的视角方向;当压力值小于预定阈值时,输入管理器生成与输入控件对应的第二操作,比如开火,如图8所示。\n[0125] 在步骤514中,角色控制器执行控制指令。\n[0126] 可选地,应用程序是游戏应用程序时,内层程序中还包括用于对游戏角色进行控制的角色控制器。当输入管理器生成第一操作指令时,由角色控制器执行第一操作指令;当输入管理器生成第二操作指令时,由角色控制器执行第二操作指令。\n[0127] 在另外一些实施例中,终端采用第二操作系统。与第一操作系统不同的是,第二操作系统是具有一套原生的GUI(Graphical User Interface,图形用户界面)组件的系统,该GUI组件具有一套完善的消息派发模块,该GUI组件用于在压力触控事件由触摸屏驱动程序上报至该GUI组件后,将该压力触控事件上报至应用层,该第二操作系统包括但不限于:iOS操作系统。此时,虚拟引擎需要从该GUI组件中的消息派发模块中拦截压力触控事件。\n[0128] 图9是本发明另一个示例性实施例提供的终端的结构示意图。示意性的,以终端采用的是第二操作系统为例。该终端包括:处理器31、触摸屏32和存储器33。存储器33中存储有至少一个程序指令。\n[0129] 处理器31可以是单核处理器、多核处理器、嵌入式芯片以及具有指令运行能力的处理器中的至少一种。\n[0130] 触摸屏32为压力感应触摸屏,压力感应触摸屏可以对施加在触摸屏32上的按压力度进行测量。\n[0131] 存储器33存储有处理器31的可执行程序。示意性的,存储器33中存储的程序指令包括但不限于:内核层34、UI框架35、C++动态链接库36和应用层37。\n[0132] 内核层34包括:触摸屏驱动程序341和其它驱动程序342。触摸屏驱动程序341用于在触摸屏32上收到压力触控操作时,生成压力触控事件。该压力触控事件包括:操作坐标和压力值。触摸屏驱动程序341还用于将压力触控事件上报至UI框架35。\n[0133] UI框架35是操作系统提供的框架,用于实现人机交互的界面显示框架。UI框架35中提供有消息派发模块。当UI框架35接收到压力触控事件时,会将压力触控事件派发至相应的应用程序。\n[0134] C++动态链接库36包括:虚拟引擎361和消息拦截模块362。虚拟引擎361用于实现三维虚拟环境的构建和显示;消息拦截模块362用于从UI框架35拦截压力触控事件。可选地,消息拦截模块362是虚拟引擎361的一部分。虚拟引擎361通过消息拦截模块362拦截到压力触控事件后,将压力触控事件传递至应用程序A的外层程序。\n[0135] 应用程序A是基于虚拟引擎开发的应用程序。应用程序A包括:外层程序371和内层程序372。其中,内层程序372包括:主线程模块373和输入管理器374。输入管理器374是用于对外部输入信号(比如压力触控事件)进行处理的程序模块。\n[0136] 图10示出了本发明的一个示例性实施例提供的应用程序的控制方法的流程图。本实施例以该应用程序的控制方法应用于图9所示的终端中来举例说明。该方法包括:\n[0137] 在步骤601中,内层程序向外层程序发送调用请求,该调用请求用于指示所述外层程序在接收到压力触控事件时转发至内层程序;\n[0138] 在步骤602中,UI框架接收到压力触控事件;\n[0139] 当用户使用应用程序A时,终端的触摸屏上显示有应用程序A的用户界面,该用户界面上包括用于人机交互的控件,比如虚拟按钮。用户在触摸屏上施加压力触控操作时,终端的触摸屏驱动程序会产生压力触控事件,并上报至UI框架。\n[0140] 对应的,UI框架接收压力触控事件。\n[0141] 在步骤603中,虚拟引擎从UI框架拦截压力触控事件;\n[0142] 在步骤604中,虚拟引擎将压力触控事件传递至外层程序;\n[0143] 在步骤605中,外层程序将压力触控事件传递至内层程序;\n[0144] 在步骤606中,内层程序根据压力触控事件执行预定操作。\n[0145] 示意性的,当压力触控事件中的压力值大于预设阈值时,执行第一预定操作;当压力触控事件中的压力值小于预设阈值时,执行第二预定操作。\n[0146] 综上所述,本实施例提供的应用程序控制方法,通过预先由内层程序向外层程序发送调用请求,能够触发外层程序在接收到压力触控事件时转发至内层程序;再由内层程序根据压力触控事件执行预设操作;解决了由于应用程序的内层程序无法直接在操作系统中运行,需要增加外层程序后才能正常运行,但因外层程序的存在,导致应用程序无法直接对压力触控事件进行处理的问题;从而实现了基于虚拟引擎开发的应用程序中能够采用压力触控技术进行输入控制,在移动终端有限的屏幕面积上实现多种操作指令的触发,从而提高人机交互的效率。\n[0147] 图11是本发明另一个示例性的实施例提供的终端的结构示意图。示意性的,以终端采用的第二操作系统为iOS操作系统为例,该终端包括:处理器61、触摸屏62和存储器63。\n存储器63中存储有至少一个程序指令。\n[0148] 处理器61可以是单核处理器、多核处理器、嵌入式芯片以及具有指令运行能力的处理器中的至少一种。\n[0149] 触摸屏62为压力感应触摸屏,压力感应触摸屏可以对施加在触摸屏62上的按压力度进行测量。\n[0150] 存储器63存储有处理器61的可执行程序。示意性的,存储器63中存储的程序指令包括但不限于:内核层64、UI Kit 65、C++动态链接库66和应用层67。\n[0151] 内核层64包括:触摸屏驱动程序641和其它驱动程序642。触摸屏驱动程序641用于在触摸屏62上收到压力触控操作时,生成压力触控事件。该压力触控事件包括:操作坐标和压力值。触摸屏驱动程序641还用于将压力触控事件上报至UI Kit 65。\n[0152] UI Kit 65是IOS操作系统提供的框架,用于实现人机交互的界面显示框架。UI Kit 65中提供有消息派发模块。当UI Kit 65接收到压力触控事件时,会将压力触控事件派发至相应的程序模块。\n[0153] C++动态链接库66包括:Unity引擎661和消息拦截模块662。Unity引擎661用于实现三维虚拟环境的构建和显示;消息拦截模块662用于从UI Kit65拦截压力触控事件。可选地,消息拦截模块662是Unity引擎661的一部分。Unity引擎661通过消息拦截模块662拦截到压力触控事件后,将压力触控事件传递至应用程序A的外层程序。\n[0154] 应用程序A是基于Unity引擎开发的应用程序。应用程序A包括:Object-C层671和C#层672。其中,Object-C层671包括:UI线程模块673和Unity线程模块674,C#层672包括:主线程模块675、输入管理器676、应用框架(Frame Work)677、原生消息中心(NativeMsgHub)\n678和角色控制器679。输入管理器676是用于对外部输入信号(比如压力触控事件)进行处理的程序模块;应用框架(Frame Work)677用于实现应用程序A的主要运行逻辑,当应用程序A是游戏应用时,应用框架677是游戏应用框架;原生消息中心678用于实现与Object-C层\n671的调用;角色控制器679用于执行输入管理器676生成的控制指令,并控制游戏角色。\n[0155] 图12是本发明一个示例性实施例提供的应用程序的控制方法的流程图。本实施例以该应用程序的控制方法应用于图11所示的终端中来举例说明。该方法包括:\n[0156] 在步骤701中,C#层向Object-C层发送调用请求,该调用请求用于指示Object-C层在接收到压力触控事件时转发至C#层;\n[0157] 在应用程序启动后,C#层的主线程模块(也称Unity Mono C#线程)向Object-C层发送调用请求。该调用请求用于询问终端是否支持压力触控功能,当终端支持压力触控功能时,Object-C层需要在接收到压力触控事件时转发至C#层。\n[0158] 可选地,C#层中的输入管理器会通过原生消息中心向Object-C层的Unity线程发送调用请求。Untiy线程通过线程安全异步调用将调用请求转发至UI线程。UI线程用于在接收到压力触控事件时转发至C#层中的应用框架,如图13所示。\n[0159] 在步骤702中,在接收到压力触控操作时,触摸屏驱动程序生成压力触控事件;\n[0160] 当用户使用应用程序A时,终端的触摸屏上显示有应用程序A的用户界面,该用户界面上包括用于人机交互的控件,比如虚拟按钮。用户在触摸屏上施加压力触控操作时,终端的触摸屏驱动程序会产生压力触控事件。\n[0161] 在步骤703中,触摸屏驱动程序将压力触控事件上报至UI Kit;\n[0162] 在步骤704中,UI Kit接收到压力触控事件;\n[0163] 在步骤705中,Unity引擎从UI Kit拦截压力触控事件;\n[0164] Unity引擎通过消息拦截模块,从UI Kit拦截压力触控事件。\n[0165] 在步骤706中,Unity引擎将压力触控事件传递至Object-C层的UI线程;\n[0166] 在步骤707中,Object-C层的UI线程将压力触控事件传递至C#层的游戏应用框架;\n[0167] 在步骤708中,C#层的游戏应用框架将压力触控事件转发给C#层的输入管理器;\n[0168] 在步骤709中,C#层的输入管理器根据压力触控事件生成控制指令;\n[0169] 可选地,输入管理器从压力触控事件中解析出操作坐标和压力值;输入管理器确定与操作坐标对应的输入控件(比如第二控件);当压力值大于预定阈值时,输入管理器生成与输入控件对应的第一操作指令,比如改变第一视角的视角方向;当压力值小于预定阈值时,输入管理器生成与输入控件对应的第二操作,比如开火,如图8所示。\n[0170] 在步骤710中,C#层的角色控制器执行控制指令。\n[0171] 可选地,应用程序是游戏应用程序时,内层程序中还包括用于对游戏角色进行控制的角色控制器。当输入管理器生成第一操作指令时,由角色控制器执行第一操作指令;当输入管理器生成第二操作指令时,由角色控制器执行第二操作指令。\n[0172] 图14示出了本公开一个示例性实施例提供的应用程序的控制装置的框图,该应用程序的控制装置可以通过软件、硬件和/或两者的结合实现成为终端的全部和一部分,该装置中安装有操作系统和应用程序,所述装置包括:\n[0173] 虚拟引擎模块801,被配置为拦截压力触控事件,所述压力触控事件包括操作坐标和压力值;\n[0174] 所述虚拟引擎模块,被配置为将所述压力触控事件传递至所述外层程序模块;\n[0175] 应用程序模块802,被配置为包括外层程序模块和内层程序模块;\n[0176] 外层应用程序模块803,被配置为将压力触控事件传递至内层程序模块;\n[0177] 内层应用程序模块804,被配置为根据所述压力触控事件执行预定操作。\n[0178] 在一个可选的实施例中,所述外层程序模块,用于将所述压力触控事件发送至所述内层程序模块的主线程中;\n[0179] 所述内层程序模块,用于通过所述主线程将所述压力触控事件传递至所述内层程序模块的输入控制器;\n[0180] 其中,所述输入控制器是所述内层程序模块中用于处理外部输入信号的程序模块。\n[0181] 在一个可选的实施例中,所述装置还包括:预设程序模块;\n[0182] 所述预设程序模块,用于在所述应用程序启动时,将所述虚拟引擎中的消息转发机制的消息接收方从所述内层程序模块修改为所述外层程序模块;\n[0183] 所述虚拟引擎模块,用于按照所述预设程序模块修改后的所述消息转发机制,将所述压力触控事件传递至所述外层程序模块。\n[0184] 在一个可选的实施例中,所述预设程序模块,用于在所述应用程序启动时,获取所述虚拟引擎模块在内存中的基地址;按照所述基地址和预设偏移地址定位所述消息转发机制对应的代码位置;根据定位到的所述代码位置将所述消息转发机制的消息接收方地址从所述内层程序模块修改为所述外层程序模块。\n[0185] 在一个可选的实施例中,所述内层程序模块,还用于向所述外层程序模块发送调用请求,所述调用请求用于指示所述外层程序模块在接收到所述压力触控事件时转发至所述内层程序模块。\n[0186] 在一个可选的实施例中,所述装置还包括:系统级UI框架;\n[0187] 所述虚拟引擎模块,用于在所述系统级UI框架拦截所述压力触控事件。\n[0188] 在一个可选的实施例中,所述内层程序模块,用于从所述压力触控事件中解析出所述操作坐标和所述压力值;确定与所述操作坐标对应的输入控件;当所述压力值大于预定阈值时,执行与所述输入控件对应的第一操作;当所述压力值小于所述预定阈值时,执行与所述输入控件对应的第二操作。\n[0189] 需要说明的是:上述实施例提供的应用程序的控制装置在触发智能网业务时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的应用程序的控制装置与应用程序的控制方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。\n[0190] 本发明实施例还提供了一种终端,所述终端包括处理器和存储器,所述存储器中存储有至少一条指令,所述指令由所述处理器加载并执行以实现如上任一实施例所述的应用程序的控制方法。\n[0191] 本发明实施例还提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令,所述指令由处理器加载并执行以实现如上任一实施例所述的应用程序的控制方法。\n[0192] 上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。\n[0193] 本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。\n[0194] 以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
法律信息
- 2018-06-05
- 2017-12-12
实质审查的生效
IPC(主分类): G06F 9/44
专利申请号: 201710573725.3
申请日: 2017.07.14
- 2017-11-17
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2017-01-04
|
2016-08-16
| | |
2
| |
2014-09-10
|
2014-03-04
| | |
3
| |
2016-11-09
|
2016-06-02
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |