首页 / 专利分类库 / 运动;游戏;娱乐活动 / 一种游戏界面优化方法及可视化界面优化系统

一种游戏界面优化方法及可视化界面优化系统

申请号 CN202410332509.X 申请日 2024-03-22 公开(公告)号 CN117919709A 公开(公告)日 2024-04-26
申请人 深圳市乐易网络股份有限公司; 发明人 胡广; 荆丽娟; 陈聪; 何瑞斌; 石一峰;
摘要 本 发明 公开一种游戏界面优化方法及 可视化 界面优化系统,涉及图形界面 渲染 技术领域。本发明包括根据用户对每个悬浮操作元素的操作以及主界面内 鼠标 在不同时刻的 位置 以及悬浮操作元素的位置分布得到每个悬浮操作元素被激活为不透明状态的时刻作为激活时刻;根据每个悬浮操作元素的历次激活时刻预估得到每个悬浮操作元素的当前激活间隔时长;根据最低可视透明度以及每个悬浮操作元素的当前激活间隔时长得到每个悬浮操作元素在未来时段内不同时刻的透明度。本发明通过对游戏主界面上的悬浮操作元素进行个性化的透明度自动调整,优化玩家的操作和游戏体验。
权利要求

1.一种游戏界面优化方法,其特征在于,包括,
获取若干个悬浮显示在主界面之上的悬浮操作元素的位置分布;
获取所述悬浮操作元素的最低可视透明度;
实时获取用户对每个悬浮操作元素的操作;
实时获取所述主界面内鼠标在不同时刻的位置;
根据用户对每个悬浮操作元素的操作以及所述主界面内鼠标在不同时刻的位置以及所述悬浮操作元素的位置分布得到每个所述悬浮操作元素被激活为不透明状态的时刻作为激活时刻;
根据每个所述悬浮操作元素的历次所述激活时刻预估得到每个所述悬浮操作元素的当前激活间隔时长;
根据最低可视透明度以及每个所述悬浮操作元素的当前激活间隔时长得到每个所述悬浮操作元素在未来时段内不同时刻的透明度。
2.根据权利要求1所述的方法,其特征在于,所述根据用户对每个悬浮操作元素的操作以及所述主界面内鼠标在不同时刻的位置以及所述悬浮操作元素的位置分布得到每个所述悬浮操作元素被激活为不透明状态的时刻作为激活时刻的步骤,包括,将每个所述悬浮操作元素在不同时刻被用户操作的时刻作为操作时刻,其中所述悬浮操作元素被用户操作时转化为不透明状态;
根据所述主界面内鼠标在不同时刻的位置以及所述悬浮操作元素的位置分布获取每个所述悬浮操作元素被鼠标触碰触发为不透明状态的时刻作为触发时刻;
将所述操作时刻所述触发时刻作为所述激活时刻。
3.根据权利要求2所述的方法,其特征在于,所述根据所述主界面内鼠标在不同时刻的位置以及所述悬浮操作元素的位置分布获取每个所述悬浮操作元素被鼠标触碰触发为不透明状态的时刻作为触发时刻的步骤,包括,
根据所述主界面内鼠标在不同时刻的位置得到鼠标每次移动过程中的移动轨迹和终点位置;
若鼠标移动的终点位置落入所述悬浮操作元素的位置分布,则判断对应的所述悬浮操作元素被鼠标触碰触发为不透明状态,并获取对应的所述触发时刻;
若鼠标移动的终点位置未落入所述悬浮操作元素的位置分布,且鼠标的移动轨迹穿过所述悬浮操作元素的位置分布,则根据鼠标在不同时刻的位置得到鼠标在移入和移出所述悬浮操作元素的位置分布的瞬时速度,以及鼠标在所述悬浮操作元素的位置分布的平均速度;
若鼠标在所述悬浮操作元素的位置分布的平均速度小于鼠标在移入和移出所述悬浮操作元素的位置分布的瞬时速度,则判断对应的所述悬浮操作元素被鼠标触碰触发为不透明状态,并获取对应的所述触发时刻。
4.根据权利要求1所述的方法,其特征在于,所述根据每个所述悬浮操作元素的历次所述激活时刻预估得到每个所述悬浮操作元素的当前激活间隔时长的步骤,包括,获取每个所述悬浮操作元素的每个所述激活时刻与上一个所述激活时刻的间隔时长作为激活间隔时长;
根据每个所述悬浮操作元素对应的所述激活时刻以及所述激活间隔时长得到每个所述悬浮操作元素在符合用户当前操作习惯状态下的多个所述激活间隔时长作为惯性激活间隔时长;
对于每个所述悬浮操作元素,根据对应的惯性激活间隔时长和所述激活时刻预估得到每个所述悬浮操作元素的当前激活间隔时长。
5.根据权利要求4所述的方法,其特征在于,所述根据每个所述悬浮操作元素对应的所述激活时刻以及所述激活间隔时长得到每个所述悬浮操作元素在符合用户当前操作习惯状态下的多个所述激活间隔时长作为惯性激活间隔时长的步骤,包括,获取每次游戏的开始时刻和结束时刻;
获取本次游戏和历次游戏过程中每个所述悬浮操作元素对应的所述激活时刻以及所述激活间隔时长;
将本次游戏过程中每个所述悬浮操作元素的每个所述激活间隔时长按照对应的所述激活时刻分别在时间轴上进行排列标记后按照设定的顺序排列得到本次游戏过程的二维特征矩阵;
获取游戏时长超过本次游戏过程的历次游戏过程作为参考游戏过程;
将参考游戏过程中每个所述悬浮操作元素的每个所述激活间隔时长按照对应的所述激活时刻分别在时间轴上进行排列标记后按照设定的顺序排列,分别得到每个参考游戏过程的二维特征矩阵;
计算获取本次游戏过程的二维特征矩阵分别与每个参考游戏过程的二维特征矩阵的结构相似性指标;
将所述结构相似性指标的最大值对应的参考游戏过程作为目标游戏过程;
将目标游戏过程中每个所述悬浮操作元素的每个所述激活间隔时长作为每个所述悬浮操作元素的多个惯性激活间隔时长。
6.根据权利要求5所述的方法,其特征在于,所述对于每个所述悬浮操作元素,根据对应的惯性激活间隔时长和所述激活时刻预估得到每个所述悬浮操作元素的当前激活间隔时长的步骤,包括,
获取当前游戏过程与目标游戏过程的时长之比作为第一调整系数;
将获取本次游戏过程的二维特征矩阵与目标游戏过程的二维特征矩阵的结构相似性指标作为第二调整系数;
将所述第一调整系数与所述第二调整系数的乘积作为目标游戏过程对当前游戏过程的影响系数;
对于每个所述悬浮操作元素,
获取所述悬浮操作元素在本次游戏过程中的若干个激活间隔时长的均值,并将数值1作为对应的权重系数,
获取所述悬浮操作元素在目标游戏过程中的若干个激活间隔时长的均值,并将所述影响系数作为对应的权重系数,
计算获取所述悬浮操作元素在本次游戏过程中的若干个激活间隔时长的均值和所述悬浮操作元素在目标游戏过程中的若干个激活间隔时长的均值的加权均值作为所述悬浮操作元素的当前激活间隔时长;
汇总得到每个所述悬浮操作元素的当前激活间隔时长。
7.根据权利要求1所述的方法,其特征在于,所述根据最低可视透明度以及每个所述悬浮操作元素的当前激活间隔时长得到每个所述悬浮操作元素在未来时段内不同时刻的透明度的步骤,包括,
将不透明状态至最低可视透明度的差值分别与每个所述悬浮操作元素的当前激活间隔时长的比值作为每个所述悬浮操作元素的透明度增长率;
获取每个所述悬浮操作元素上一次的所述激活时刻;
由每个所述悬浮操作元素上一次的所述激活时刻的不透明状态开始,按照对应的所述透明度增长率计算得到每个所述悬浮操作元素在未来时段内不同时刻的透明度。
8.一种游戏界面优化方法,其特征在于,包括,
获取悬浮操作元素的最低可视透明度;
接收权利要求1至7任一项所述的一种游戏界面优化方法中的每个所述悬浮操作元素在未来时段内不同时刻的透明度;
按照每个所述悬浮操作元素在未来时段内不同时刻的透明度控制每个所述悬浮操作元素在主界面之上进行悬浮显示;
若所述悬浮操作元素达到最低可视透明度,则停止显示;
若否,则持续显示。
9.一种游戏界面优化方法,其特征在于,包括,
获取悬浮操作元素的最低可视透明度;
接收权利要求1至7任一项所述的一种游戏界面优化方法中的每个所述悬浮操作元素在未来时段内不同时刻的透明度;
根据所述悬浮操作元素的最低可视透明度以及每个所述悬浮操作元素在未来时段内不同时刻的透明度得到所述悬浮操作元素达到最低可视透明度的时刻;
若所述悬浮操作元素达到最低可视透明度,则停止向前端传输对应的所述悬浮操作元素的交互数据;
若否,则持续传输。
10.一种可视化界面优化系统,其特征在于,包括,
前端优化控件,用于获取若干个悬浮显示在主界面之上的悬浮操作元素的位置分布;
获取所述悬浮操作元素的最低可视透明度;
实时获取用户对每个悬浮操作元素的操作;
实时获取所述主界面内鼠标在不同时刻的位置;
根据用户对每个悬浮操作元素的操作以及所述主界面内鼠标在不同时刻的位置以及所述悬浮操作元素的位置分布得到每个所述悬浮操作元素被激活为不透明状态的时刻作为激活时刻;
根据每个所述悬浮操作元素的历次所述激活时刻预估得到每个所述悬浮操作元素的当前激活间隔时长;
根据最低可视透明度以及每个所述悬浮操作元素的当前激活间隔时长得到每个所述悬浮操作元素在未来时段内不同时刻的透明度;
前端数据显示控件,用于获取所述悬浮操作元素的最低可视透明度;
接收每个所述悬浮操作元素在未来时段内不同时刻的透明度;
按照每个所述悬浮操作元素在未来时段内不同时刻的透明度控制每个所述悬浮操作元素在主界面之上进行悬浮显示;
若所述悬浮操作元素达到最低可视透明度,则停止显示;
若否,则持续显示;
后端数据传输控件,用于获取所述悬浮操作元素的最低可视透明度;
接收每个所述悬浮操作元素在未来时段内不同时刻的透明度;
根据所述悬浮操作元素的最低可视透明度以及每个所述悬浮操作元素在未来时段内不同时刻的透明度得到所述悬浮操作元素达到最低可视透明度的时刻;
若所述悬浮操作元素达到最低可视透明度,则停止向前端传输对应的所述悬浮操作元素的交互数据;
若否,则持续传输。

说明书全文

一种游戏界面优化方法及可视化界面优化系统

技术领域

[0001] 本发明属于图形界面渲染技术领域,特别是涉及一种游戏界面优化方法及可视化界面优化系统。

背景技术

[0002] 在现代的游戏产业中,游戏界面(Graphical User Interface, GUI)的设计与优化是提升用户体验的重要方面。游戏界面不仅需要提供给玩家必要的信息,帮助他们理解游戏状态、色状况、任务目标等,还需要具备良好的视觉吸引,以及高效的交互设计来确保玩家可以快速、准确地完成操作。
[0003] 然而,随着游戏复杂度的提升以及玩家需求的多样化,传统的游戏界面多种操作元素堆叠在主界面上,需要用户进行手动选择收纳整理,影响玩家的操作和使用体验。

发明内容

[0004] 本发明的目的在于提供一种游戏界面优化方法及可视化界面优化系统,通过对游戏主界面上的悬浮操作元素进行个性化的透明度自动调整,优化玩家的操作和游戏体验。
[0005] 为解决上述技术问题,本发明是通过以下技术方案实现的:本发明提供一种游戏界面优化方法,包括,
获取若干个悬浮显示在主界面之上的悬浮操作元素的位置分布;
获取所述悬浮操作元素的最低可视透明度;
实时获取用户对每个悬浮操作元素的操作;
实时获取所述主界面内鼠标在不同时刻的位置;
根据用户对每个悬浮操作元素的操作以及所述主界面内鼠标在不同时刻的位置以及所述悬浮操作元素的位置分布得到每个所述悬浮操作元素被激活为不透明状态的时刻作为激活时刻;
根据每个所述悬浮操作元素的历次所述激活时刻预估得到每个所述悬浮操作元素的当前激活间隔时长;
根据最低可视透明度以及每个所述悬浮操作元素的当前激活间隔时长得到每个所述悬浮操作元素在未来时段内不同时刻的透明度。
[0006] 本发明还公开了一种游戏界面优化方法,包括,获取悬浮操作元素的最低可视透明度;
接收每个所述悬浮操作元素在未来时段内不同时刻的透明度;
按照每个所述悬浮操作元素在未来时段内不同时刻的透明度控制每个所述悬浮操作元素在主界面之上进行悬浮显示;
若所述悬浮操作元素达到最低可视透明度,则停止显示;
若否,则持续显示。
[0007] 本发明还公开了一种游戏界面优化方法,包括,获取悬浮操作元素的最低可视透明度;
接收每个所述悬浮操作元素在未来时段内不同时刻的透明度;
根据所述悬浮操作元素的最低可视透明度以及每个所述悬浮操作元素在未来时段内不同时刻的透明度得到所述悬浮操作元素达到最低可视透明度的时刻;
若所述悬浮操作元素达到最低可视透明度,则停止向前端传输对应的所述悬浮操作元素的交互数据;
若否,则持续传输。
[0008] 本发明还公开了一种可视化界面优化系统,包括,前端优化控件,用于获取若干个悬浮显示在主界面之上的悬浮操作元素的位置分布;
获取所述悬浮操作元素的最低可视透明度;
实时获取用户对每个悬浮操作元素的操作;
实时获取所述主界面内鼠标在不同时刻的位置;
根据用户对每个悬浮操作元素的操作以及所述主界面内鼠标在不同时刻的位置以及所述悬浮操作元素的位置分布得到每个所述悬浮操作元素被激活为不透明状态的时刻作为激活时刻;
根据每个所述悬浮操作元素的历次所述激活时刻预估得到每个所述悬浮操作元素的当前激活间隔时长;
根据最低可视透明度以及每个所述悬浮操作元素的当前激活间隔时长得到每个所述悬浮操作元素在未来时段内不同时刻的透明度;
前端数据显示控件,用于获取所述悬浮操作元素的最低可视透明度;
接收每个所述悬浮操作元素在未来时段内不同时刻的透明度;
按照每个所述悬浮操作元素在未来时段内不同时刻的透明度控制每个所述悬浮操作元素在主界面之上进行悬浮显示;
若所述悬浮操作元素达到最低可视透明度,则停止显示;
若否,则持续显示;
后端数据传输控件,用于获取所述悬浮操作元素的最低可视透明度;
接收每个所述悬浮操作元素在未来时段内不同时刻的透明度;
根据所述悬浮操作元素的最低可视透明度以及每个所述悬浮操作元素在未来时段内不同时刻的透明度得到所述悬浮操作元素达到最低可视透明度的时刻;
若所述悬浮操作元素达到最低可视透明度,则停止向前端传输对应的所述悬浮操作元素的交互数据;
若否,则持续传输。
[0009] 本发明通过对游戏主界面上的悬浮操作元素进行个性化的透明度自动调整,在不影响用户操作的前提下,及时将用户不需要的悬浮操作元素停止显示,提高了主界面的可视性,优化玩家的操作和游戏体验。
[0010] 当然,实施本发明的任一产品并不一定需要同时达到以上所述的所有优点。附图说明
[0011] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0012] 图1为本发明所述一种可视化界面优化系统于一实施例的功能组件和数据交互示意图;图2为本发明所述主界面和悬浮操作元素于一实施例的示意图;
图3为本发明所述前端优化控件于一实施例的步骤流程示意图;
图4为本发明所述前端数据显示控件于一实施例的步骤流程示意图;
图5为本发明所述后端数据传输控件于一实施例的步骤流程示意图;
图6为本发明所述步骤S5于一实施例的步骤流程示意图;
图7为本发明所述步骤S52于一实施例的步骤流程示意图;
图8为本发明所述步骤S6于一实施例的步骤流程示意图;
图9为本发明所述步骤S62于一实施例的步骤流程示意图;
图10为本发明所述步骤S63于一实施例的步骤流程示意图;
图11为本发明所述步骤S7于一实施例的步骤流程示意图;
附图中,各标号所代表的部件列表如下:
1‑主界面,2‑悬浮操作元素,3‑前端优化控件,4‑前端数据显示控件,5‑后端数据传输控件。

具体实施方式

[0013] 为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
[0014] 需要说明的是,本申请中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。以下示例性实施例中所描述的实施方式并不代表与本申请相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本申请的一些方面相一致的装置和方法的例子。
[0015] 在数字游戏的发展过程中,游戏界面的优化始终是提升玩家体验的重要方面。游戏界面中的角色属性面板、技能属性面板、设置面板等操作元素悬浮显示在游戏的主界面上,但是这些悬浮操作元素并非都是用户经常需要操作的,通常需要用户进行手动调用和关闭,这样会影响用户的操作和使用体验。为了让主界面上的悬浮操作元素能够自适应显示,本发明提供以下方案。
[0016] 请参阅图1至2所示,本发明提供了一种可视化界面优化系统,包括位于前端的前端优化控件3和前端数据显示控件4,以及位于后端的后端数据传输控件5。这些控件以游戏插件的形式存在于系统之中。前端数据显示控件4控制悬浮操作元素2悬浮显示在主界面1之上。
[0017] 在具体运行的过程中,请参阅图3所示,首先由前端优化控件3执行步骤S1获取若干个悬浮显示在主界面之上的悬浮操作元素的位置分布。接下来可以执行步骤S2获取悬浮操作元素的最低可视透明度。接下来可以执行步骤S3实时获取用户对每个悬浮操作元素的操作。接下来可以执行步骤S4实时获取主界面内鼠标在不同时刻的位置。接下来可以执行步骤S5根据用户对每个悬浮操作元素的操作以及主界面内鼠标在不同时刻的位置以及悬浮操作元素的位置分布得到每个悬浮操作元素被激活为不透明状态的时刻作为激活时刻。接下来可以执行步骤S6根据每个悬浮操作元素的历次激活时刻预估得到每个悬浮操作元素的当前激活间隔时长。最后可以执行步骤S7根据最低可视透明度以及每个悬浮操作元素的当前激活间隔时长得到每个悬浮操作元素在未来时段内不同时刻的透明度。
[0018] 请参阅图4所示,对于前端数据显示控件4而言,首先可以执行步骤S011获取悬浮操作元素的最低可视透明度。接下来可以执行步骤S012接收每个悬浮操作元素在未来时段内不同时刻的透明度。接下来可以执行步骤S013按照每个悬浮操作元素在未来时段内不同时刻的透明度控制每个悬浮操作元素在主界面之上进行悬浮显示。接下来可以执行步骤S014若悬浮操作元素达到最低可视透明度,则接下来可以执行步骤S015停止显示。若否则最后可以执行步骤S016持续显示。
[0019] 请参阅图5所示,对于后端数据传输控件5而言,首先可以执行步骤S021获取悬浮操作元素的最低可视透明度。接下来可以执行步骤S022接收每个悬浮操作元素在未来时段内不同时刻的透明度。接下来可以执行步骤S023根据悬浮操作元素的最低可视透明度以及每个悬浮操作元素在未来时段内不同时刻的透明度得到悬浮操作元素达到最低可视透明度的时刻。接下来可以执行步骤S024若悬浮操作元素达到最低可视透明度,则接下来可以执行步骤S025停止向前端传输对应的悬浮操作元素的交互数据。若否则最后可以执行步骤S026持续传输。
[0020] 请参阅图6所示,悬浮操作元素可以通过用户操作被激活,同时用户的鼠标悬停操作也可以起到激活的作用。为了对其进行统计,上述的步骤S5在具体实施的过程中首先可以执行步骤S51将每个悬浮操作元素在不同时刻被用户操作的时刻作为操作时刻,其中悬浮操作元素被用户操作时转化为不透明状态。接下来可以执行步骤S52根据主界面内鼠标在不同时刻的位置以及悬浮操作元素的位置分布获取每个悬浮操作元素被鼠标触碰触发为不透明状态的时刻作为触发时刻。最后可以执行步骤S53将操作时刻触发时刻作为激活时刻。
[0021] 请参阅图7所示,为了具体判断鼠标操作中哪些属于对悬浮操作元素的悬停操作,上述的步骤S52在具体实施的过程中首先可以执行步骤S521根据主界面内鼠标在不同时刻的位置得到鼠标每次移动过程中的移动轨迹和终点位置。接下来可以执行步骤S522至步骤S523若鼠标移动的终点位置落入悬浮操作元素的位置分布,则判断对应的悬浮操作元素被鼠标触碰触发为不透明状态,并获取对应的触发时刻。接下来可以执行步骤S524至步骤S526若鼠标移动的终点位置未落入悬浮操作元素的位置分布,且鼠标的移动轨迹穿过悬浮操作元素的位置分布,则根据鼠标在不同时刻的位置得到鼠标在移入和移出悬浮操作元素的位置分布的瞬时速度,以及鼠标在悬浮操作元素的位置分布的平均速度。最后可以执行步骤S527至步骤S528若鼠标在悬浮操作元素的位置分布的平均速度小于鼠标在移入和移出悬浮操作元素的位置分布的瞬时速度,则判断对应的悬浮操作元素被鼠标触碰触发为不透明状态,并获取对应的触发时刻。
[0022] 为了对上述的步骤S521至步骤S527的实施过程进行补充说明,提供部分功能模的源代码,并在注释部分进行对照解释说明。为了避免涉及商业秘密的数据泄露,对不影响方案实施的部分数据进行脱敏处理,下同。
[0023] #include#include
#include
#include
// 定义悬浮操作元素的结构体
struct FloatingElement {
   int id; // 元素的唯一标识符
   float x, y; // 元素的中心坐标
   float radius; // 元素的有效触发半径
};
// 定义鼠标位置的结构体
struct MousePosition {
   float x, y; // 鼠标的坐标
   std::chrono::steady_clock::time_point time; // 鼠标位置对应的时间点
};
// 存储悬浮操作元素
std::vectorelements;
// 存储鼠标轨迹
std::vectormouseTrail;
// 检测鼠标是否触发悬浮操作元素
bool checkTrigger(const MousePosition&mousePos, FloatingElement&elem, std::chrono::steady_clock::time_point&triggerTime) {
    float distance = std::sqrt((mousePos.x ‑ elem.x) * (mousePos.x ‑ elem.x) + (mousePos.y ‑ elem.y) * (mousePos.y ‑ elem.y));
    if (distance<= elem.radius) {
        triggerTime = mousePos.time;
        return true;
    }
    return false;
}
// 添加鼠标位置到轨迹
void addMousePosition(float x, float y) {
    MousePosition newPos = {x, y, std::chrono::steady_clock::now()};
    mouseTrail.push_back(newPos);
}
// 主逻辑函数,处理鼠标移动事件
void processMouseMovement(float mouseX, float mouseY) {
   // 添加新的鼠标位置
    addMousePosition(mouseX, mouseY);
   // 最近两个鼠标位置代表最新的移动
    if (mouseTrail.size()<2) return;
    MousePosition&newPos = mouseTrail.back();
    MousePosition&oldPos = *(mouseTrail.end() ‑ 2);
   // 计算瞬时速度和平均速度
    float instantSpeed = std::sqrt((newPos.x ‑ oldPos.x) * (newPos.x ‑ oldPos.x) + (newPos.y ‑ oldPos.y) * (newPos.y ‑ oldPos.y))
                         / std::chrono::duration_castmilliseconds>(newPos.time ‑ oldPos.time).count();
    float averageSpeed = 0.0f;
    for (size_t i = 1; i        auto&pos1 = mouseTrail[i ‑ 1];
        auto&pos2 = mouseTrail[i];
        averageSpeed += std::sqrt((pos2.x ‑ pos1.x) * (pos2.x ‑ pos1.x) + (pos2.y ‑ pos1.y) * (pos2.y ‑ pos1.y))
                        / std::chrono::duration_castmilliseconds>(pos2.time ‑ pos1.time).count();
    }
    averageSpeed /= mouseTrail.size() ‑ 1;
   // 遍历所有悬浮操作元素
    for (auto&elem : elements) {
        std::chrono::steady_clock::time_point triggerTime;
        if (checkTrigger(newPos, elem, triggerTime)) {
           // 如果鼠标位置落在元素区域内
            std::cout<<"Element ID "<(triggerTime.time_since_epoch()).count()<<" ms"<        } else if (averageSpeed           // 如果平均速度小于瞬时速度
            if (checkTrigger(oldPos, elem, triggerTime)) {
               // 如果之前的鼠标位置落在元素区域内
                std::cout<<"Element ID "<(triggerTime.time_since_epoch()).count()<<" ms"<            }
        }
    }
}
int main
#include
#include
#include
#include
// 定义悬浮操作元素的结构体
struct FloatingElement {
   int id; // 元素的唯一标识符
   float x, y; // 元素的中心坐标
   float radius; // 元素的有效触发半径
   bool isTriggered; // 元素是否被触发
   std::chrono::steady_clock::time_point triggerTime; // 触发的时刻};
// 初始化悬浮操作元素
std::vectorinitializeElements() {
   // 这里只是示例,实际情况下应该根据游戏界面的具体布局来初始化
    std::vectorelements = {
        {1, 100.0f, 100.0f, 10.0f, false, std::chrono::steady_clock::
now()},
        {2, 200.0f, 200.0f, 10.0f, false, std::chrono::steady_clock::
now()}
       // 添加其他悬浮操作元素
    };
    return elements;
}
// 检测鼠标位置是否与悬浮操作元素相交
bool isMouseOverElement(const FloatingElement&element, float mouseX, float mouseY) {
    float dx = mouseX ‑ element.x;
    float dy = mouseY ‑ element.y;
    return (dx * dx + dy * dy)<= (element.radius * element.radius);
}
// 更新悬浮操作元素的触发状态
void updateElementTriggerStatus(FloatingElement&element, float 
mouseX, float mouseY) {
   // 检查鼠标是否在元素上
    if (isMouseOverElement(element, mouseX, mouseY)) {
        element.isTriggered = true;
       element.triggerTime = std::chrono::steady_clock::now(); // 记录触发时刻
    }
}
// 处理鼠标移动事件
void handleMouseMovement(float mouseX, float mouseY, std::vector&elements) {
    for (auto&element : elements) {
        updateElementTriggerStatus(element, mouseX, mouseY);
    }
}
int main() {
   std::vectorelements = initializeElements(); // 初始化元素
   // 模拟鼠标移动
   handleMouseMovement(105.0f, 105.0f, elements); // 示例鼠标移动到(105, 105)
   // 输出触发状态
    for (const auto&element : elements) {
        if (element.isTriggered) {
            std::cout<<"Element ID "<                      <milliseconds>(element.triggerTime.time_since_epoch()).count()
                      <<" milliseconds."<        }
    }
    return 0;
}
这段代码定义了悬浮操作元素的结构,包括元素的位置、触发半径、触发状态和触发时间。initializeElements函数用于初始化悬浮操作元素的集合。isMouseOverElement函数检查鼠标位置是否与悬浮操作元素相交。updateElementTriggerStatus函数用于更新元素的触发状态。如果鼠标位置在元素内,则该元素被设置为触发状态,并记录触发时间。
[0024] 在main函数中,模拟了鼠标移动事件,并调用handleMouseMovement函数来处理这一事件。最后,程序会输出所有被触发的悬浮操作元素及其对应的触发时间。
[0025] 在实际的游戏或GUI应用程序中,应该将此代码结合到事件处理循环中,并在鼠标移动事件发生时调用handleMouseMovement函数。此外,还需要使用游戏或应用程序的渲染系统来实时更新元素的可视状态。
[0026] 请参阅图8所示,由于用户在每次游戏的过程中存在历史惯性,因此可以在历史记录中匹配得到符合用户当前操作习惯状态下的多个激活间隔时长作为惯性激活间隔时长,从而进一步得到每个悬浮操作元素的当前激活间隔时长。具体而言,上述的步骤S6在具体实施的过程中首先可以执行步骤S61获取每个悬浮操作元素的每个激活时刻与上一个激活时刻的间隔时长作为激活间隔时长。接下来可以执行步骤S62根据每个悬浮操作元素对应的激活时刻以及激活间隔时长得到每个悬浮操作元素在符合用户当前操作习惯状态下的多个激活间隔时长作为惯性激活间隔时长。对于每个悬浮操作元素,最后可以执行步骤S63根据对应的惯性激活间隔时长和激活时刻预估得到每个悬浮操作元素的当前激活间隔时长。
[0027] 请参阅图9所示,为了在历史记录中找到贴近当前操作习惯状态下的多个激活间隔时长,需要比对本次游戏过程和历次游戏过程的相似度。具体而言,上述的步骤S62在具体实施的过程中首先可以执行步骤S621获取每次游戏的开始时刻和结束时刻。接下来可以执行步骤S622获取本次游戏和历次游戏过程中每个悬浮操作元素对应的激活时刻以及激活间隔时长。接下来可以执行步骤S623将本次游戏过程中每个悬浮操作元素的每个激活间隔时长按照对应的激活时刻分别在时间轴上进行排列标记后按照设定的顺序排列,得到本次游戏过程的二维特征矩阵。接下来可以执行步骤S624获取游戏时长超过本次游戏过程的历次游戏过程作为参考游戏过程。接下来可以执行步骤S625将参考游戏过程中每个悬浮操作元素的每个激活间隔时长按照对应的激活时刻分别在时间轴上进行排列标记后按照设定的顺序排列,分别得到每个参考游戏过程的二维特征矩阵。接下来可以执行步骤S626计算获取本次游戏过程的二维特征矩阵分别与每个参考游戏过程的二维特征矩阵的结构相似性指标;对于待比较的两个矩阵,分别将其作为A(x)和A(y),两者的结构相似性定义为:



结构相似性指标的值越大,代表两个信号的相似性越高。其中, >0, >0, >0,及 、 及 分别为A(x)和A(y)中x和y的平均值和标准差, 为A(x)和A(y)
中x和y的协方差, 、 、 为常量,用以维持 、 、 的稳定。
[0028] 接下来可以执行步骤S627将结构相似性指标的最大值对应的参考游戏过程作为目标游戏过程。最后可以执行步骤S628将目标游戏过程中每个悬浮操作元素的每个激活间隔时长作为每个悬浮操作元素的多个惯性激活间隔时长。
[0029] 为了实现上述的步骤S621至步骤S628的实施过程,提供以下源代码,并在注释部分进行对照解释说明,能够处理游戏中的激活时刻和激活间隔时长,同时构建特征矩阵,比较不同游戏过程中的激活模式,并找出最相似的游戏过程来确定惯性激活间隔时长。
[0030] #include#include
#include
#include
// 定义悬浮操作元素的激活记录
struct ActivationRecord {
   std::chrono::steady_clock::time_point activationTime; // 激活时刻
   std::chrono::milliseconds interval; // 激活间隔时长
};
// 悬浮操作元素定义
struct FloatingElement {
   int id; // 元素ID
   std::vectoractivationRecords; // 激活记录
};
// 游戏过程定义
struct GameSession {
   std::chrono::steady_clock::time_point startTime; // 开始时刻
   std::chrono::steady_clock::time_point endTime; // 结束时刻
   std::vectorelements; // 游戏过程中的悬浮操作元素};
// 计算两个激活记录之间的相似性,这里简化为计算它们间隔时长的差值double calculateRecordSimilarity(const ActivationRecord&a, const ActivationRecord&b) {
    return std::chrono::duration(a.interval ‑ b.interval).count();
}
// 计算两个游戏过程的特征矩阵相似性
double calculateSessionSimilarity(const GameSession&session1, const GameSession&session2) {
    double similarity = 0.0;
   // 遍历所有悬浮操作元素
    for (const auto&elem1 : session1.elements) {
        for (const auto&elem2 : session2.elements) {
            if (elem1.id == elem2.id) {
               // 确保两个元素具有相同数量的激活记录
                 if  (elem1.activationRecords.size()  != 
elem2.activationRecords.size()) {
                    continue;
                }
               // 计算所有激活记录的相似性
                for (size_t i = 0; i                    similarity += calculateRecordSimilarity
(elem1.activationRecords[i], elem2.activationRecords[i]);
                }
            }
        }
    }
    return similarity;
}
// 主函数
int main() {
   // 示例:初始化当前游戏会话和历史游戏会话列表
   GameSession currentSession{/* 填充当前游戏会话信息 */};
   std::vectorhistoricalSessions{/* 填充历史游戏会话列表 */};
   // 计算当前游戏会话与历史游戏会话的相似性
    std::vectorsimilarities;
    for (const auto&historicalSession : historicalSessions) {
         similarities.push_back(calculateSessionSimilarity
(currentSession, historicalSession));
    }
   // 找出最相似的历史游戏会话
    auto  maxIt =  std::max_element(similarities.begin(), 
similarities.end());
    int mostSimilarIndex = std::distance(similarities.begin(), 
maxIt);
    GameSession&mostSimilarSession  =  historicalSessions
[mostSimilarIndex];
   // 输出最相似游戏会话的激活间隔作为惯性激活间隔
    for (const auto&element : mostSimilarSession.elements) {
        std::cout<<"Element ID "<        for (const auto&record : element.activationRecords) {
            std::cout<        }
        std::cout<    }
    return 0;
}
请参阅图10所示,由于目标游戏过程中只是与本次游戏过程具有相似性,并非完全一致。因此在计算每个悬浮操作元素的当前激活间隔时长的过程中,首先可以执行步骤S631获取当前游戏过程与目标游戏过程的时长之比作为第一调整系数。接下来可以执行步骤S632将获取本次游戏过程的二维特征矩阵与目标游戏过程的二维特征矩阵的结构相似性指标作为第二调整系数。接下来可以执行步骤S633将第一调整系数与第二调整系数的乘积作为目标游戏过程对当前游戏过程的影响系数。
[0031] 对于每个悬浮操作元素而言,首先可以执行步骤S634获取悬浮操作元素在本次游戏过程中的若干个激活间隔时长的均值,并将数值1作为对应的权重系数。接下来可以执行步骤S635获取悬浮操作元素在目标游戏过程中的若干个激活间隔时长的均值,并将影响系数作为对应的权重系数。接下来可以执行步骤S636计算获取悬浮操作元素在本次游戏过程中的若干个激活间隔时长的均值和悬浮操作元素在目标游戏过程中的若干个激活间隔时长的均值的加权均值作为悬浮操作元素的当前激活间隔时长。最后可以执行步骤S637汇总得到每个悬浮操作元素的当前激活间隔时长。
[0032] 请参阅图11所示,在悬浮操作元素的透明度以均匀速率提高的状态下,计算每个悬浮操作元素在未来时段内不同时刻的透明度的过程可以分解为首先执行步骤S71将不透明状态至最低可视透明度的差值分别与每个悬浮操作元素的当前激活间隔时长的比值作为每个悬浮操作元素的透明度增长率。接下来可以执行步骤S72获取每个悬浮操作元素上一次的激活时刻。最后可以执行步骤S73由每个悬浮操作元素上一次的激活时刻的不透明状态开始,按照对应的透明度增长率计算得到每个悬浮操作元素在未来时段内不同时刻的透明度。当悬浮操作元素的透明度达到最低可视透明度之后可以将其折叠或者关闭,但是依旧可以通过游戏的设置选项将其再次打开。
[0033] 附图中的流程图框图显示了根据本申请的多个实施例的装置、系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。
[0034] 也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行相应的功能或动作的硬件,例如电路或ASIC(专用集成电路,Application Specific Integrated Circuit)来实现,或者可以用硬件和软件的组合,如固件等来实现。
[0035] 尽管在此结合各实施例对本发明进行了描述,然而,在实施所要求保护的本发明过程中,本领域技术人员通过查看所述附图、公开内容、以及所附权利要求书,可理解并实现所述公开实施例的其它变化。在权利要求中,“包括”(comprising)一词不排除其他组成部分或步骤,“一”或“一个”不排除多个的情况。单个处理器或其它单元可以实现权利要求中列举的若干项功能。相互不同的从属权利要求中记载了某些措施,但这并不表示这些措施不能组合起来产生良好的效果。
[0036] 以上已经描述了本申请的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
QQ群二维码
意见反馈