本帖最后由 brooke_zb 于 2019-9-27 19:16 编辑 
这个想法是我在观看国外一张冒险地图的视频时产生的,视频中利用资源包和指令结合的方式创造出了具有高度交互性的GUI,可以通过前进/后退键和鼠标滑轮滚动的方式控制菜单选项的滚动,不过前进/后退键检测不是我们今天要讲的内容,我们主要来聊聊通过如何检测鼠标滑轮的滚动。
 
 
要实现检测到鼠标滑轮(以下简称滑轮)的滚动,首先从快捷栏入手,因为滑轮滚动影响的是快捷栏主手槽位(以下简称槽位)的变动,所以应当通过SelectedItemSlot这个NBT来获取玩家选择的槽位。效果图见示例&效果图一节
这个想法是我在观看国外一张冒险地图的视频时产生的,视频中利用资源包和指令结合的方式创造出了具有高度交互性的GUI,可以通过前进/后退键和鼠标滑轮滚动的方式控制菜单选项的滚动,不过前进/后退键检测不是我们今天要讲的内容,我们主要来聊聊通过如何检测鼠标滑轮的滚动。
思路
要实现检测到鼠标滑轮(以下简称滑轮)的滚动,首先从快捷栏入手,因为滑轮滚动影响的是快捷栏主手槽位(以下简称槽位)的变动,所以应当通过SelectedItemSlot这个NBT来获取玩家选择的槽位。效果图见示例&效果图一节
示例
原理&解析
上面便是检测指令的核心,思路如下:
首先创建slot和lastslot计分板项,分别用于储存玩家当前选择的槽位与上1tick选择的槽位(懒得写了)
1.利用data指令获取玩家当前选择的槽位,并保存在slot计分板上
2.将玩家lastslot计分板项的分数减去1.中获得的slot分数
3.根据lastslot的分数判断滚轮滚动方向并用tellraw输出
4.将玩家slot分数复制到lastslot分数上
原理就是储存玩家每tick选择的槽位,然后让玩家上1tick选择的槽位减去现在选择的槽位,便能得出一个反应槽位变动的值,理论上(滚轮滑动速度不超过1格/tick时),会有下列几种情况:
值为1,表示滑轮往上滑动了一格,如9到8,2到1
值为-1,表示滑轮往下滑动了一个,如6到7,3到4
值为0,表示滑轮没有滑动
当然,MC中存在着滑轮滚动到第一格/第九格之后继续往上/往下滑动会回到第九格/第一格的机制,所以还存在下面2种情况:
值为8,表示滑轮从槽位9滑动到了槽位1,属于往下滑动
值为-8,表示滑轮从槽位1滑动到了槽位9,属于往上滑动
当然,这只是理论上的情况,实际测试时发现当滑轮滑动较快时,系统并不能准确地反应出滑动了多少格(估计我滑动速度超过1格/tick了)
所以还要修bug[:hide:]不过我们要的只是检测滑动,并不要求精确反映滑动格数,所以就简单把槽位变动值的检测范围扩大到最大4格/tick(滑动速度高于36格/秒就会有bug了,不过这里不讨论这种搞事情的情况),就有了示例图中的效果。
应用
利用这个方法其实可以做出许多有趣的东西来,这帖子只是作一个抛砖引玉。鼠标滚轮滑动的特点就是交互性高,目前个人想到的有:
赛车地图中用滚轮调节车速,逮虾户!
RPG地图中与NPC对话时用滑轮控制选项
以及其他一切与滑动条有关的交互内容
这是示例用到的数据包,感兴趣的可以下载后自己琢磨琢磨,有什么问题也可以提出来
前言
这个想法是我在观看国外一张冒险地图的视频时产生的,视频中利用资源包和指令结合的方式创造出了具有高度交互性的GUI,可以通过前进/后退键和鼠标滑轮滚动的方式控制菜单选项的滚动,不过前进/后退键检测不是我们今天要讲的内容,我们主要来聊聊通过如何检测鼠标滑轮的滚动。
 
思路
要实现检测到鼠标滑轮(以下简称滑轮)的滚动,首先从快捷栏入手,因为滑轮滚动影响的是快捷栏主手槽位(以下简称槽位)的变动,所以应当通过SelectedItemSlot这个NBT来获取玩家选择的槽位。效果图见示例&效果图一节
2021.12 数据,可能有更多内容
前言这个想法是我在观看国外一张冒险地图的视频时产生的,视频中利用资源包和指令结合的方式创造出了具有高度交互性的GUI,可以通过前进/后退键和鼠标滑轮滚动的方式控制菜单选项的滚动,不过前进/后退键检测不是我们今天要讲的内容,我们主要来聊聊通过如何检测鼠标滑轮的滚动。

思路
要实现检测到鼠标滑轮(以下简称滑轮)的滚动,首先从快捷栏入手,因为滑轮滚动影响的是快捷栏主手槽位(以下简称槽位)的变动,所以应当通过SelectedItemSlot这个NBT来获取玩家选择的槽位。效果图见示例&效果图一节
示例

代码:
- #检测并输出玩家滚轮滚动方向
 
- execute as @s store result score @s slot run data get entity @s SelectedItemSlot
 
- scoreboard players operation @p lastslot -= @s slot
 
- tellraw @s[scores={lastslot=-4..-1}] {"text":"你往下滑动了鼠标滚轮","color":"red"}
 
- tellraw @s[scores={lastslot=1..4}] {"text":"你往上滑动了鼠标滚轮","color":"blue"}
 
- tellraw @s[scores={lastslot=5..8}] {"text":"你往下滑动了鼠标滚轮","color":"red"}
 
- tellraw @s[scores={lastslot=-8..-5}] {"text":"你往上滑动了鼠标滚轮","color":"blue"}
 
- scoreboard players operation @p lastslot = @s slot
原理&解析
上面便是检测指令的核心,思路如下:
首先创建slot和lastslot计分板项,分别用于储存玩家当前选择的槽位与上1tick选择的槽位(懒得写了)
1.利用data指令获取玩家当前选择的槽位,并保存在slot计分板上
2.将玩家lastslot计分板项的分数减去1.中获得的slot分数
3.根据lastslot的分数判断滚轮滚动方向并用tellraw输出
4.将玩家slot分数复制到lastslot分数上
原理就是储存玩家每tick选择的槽位,然后让玩家上1tick选择的槽位减去现在选择的槽位,便能得出一个反应槽位变动的值,理论上(滚轮滑动速度不超过1格/tick时),会有下列几种情况:
值为1,表示滑轮往上滑动了一格,如9到8,2到1
值为-1,表示滑轮往下滑动了一个,如6到7,3到4
值为0,表示滑轮没有滑动
当然,MC中存在着滑轮滚动到第一格/第九格之后继续往上/往下滑动会回到第九格/第一格的机制,所以还存在下面2种情况:
值为8,表示滑轮从槽位9滑动到了槽位1,属于往下滑动
值为-8,表示滑轮从槽位1滑动到了槽位9,属于往上滑动
当然,这只是理论上的情况,实际测试时发现当滑轮滑动较快时,系统并不能准确地反应出滑动了多少格(估计我滑动速度超过1格/tick了)
所以还要修bug[:hide:]不过我们要的只是检测滑动,并不要求精确反映滑动格数,所以就简单把槽位变动值的检测范围扩大到最大4格/tick(滑动速度高于36格/秒就会有bug了,不过这里不讨论这种搞事情的情况),就有了示例图中的效果。
应用
利用这个方法其实可以做出许多有趣的东西来,这帖子只是作一个抛砖引玉。鼠标滚轮滑动的特点就是交互性高,目前个人想到的有:
赛车地图中用滚轮调节车速,逮虾户!
RPG地图中与NPC对话时用滑轮控制选项
以及其他一切与滑动条有关的交互内容
这是示例用到的数据包,感兴趣的可以下载后自己琢磨琢磨,有什么问题也可以提出来
事实证明,配合 bossbar 使用,效果更佳 
但如果我按的是键盘上的数字键呢

但如果我按的是键盘上的数字键呢

Teenager_Yang 发表于 2019-8-25 12:56
事实证明,配合 bossbar 使用,效果更佳
但如果我按的是键盘上的数字键呢 ...
也能啊,但是如果地图里只提示用滑轮 操作再加上用某种手段把物品栏隐藏起来的话大多数玩家不会想到这一点吧
这个应该属于基本操作了……
曾经我建议素学姐用滚轮来做输入法来生成二维码……(跑)
曾经我建议素学姐用滚轮来做输入法来生成二维码……(跑)
新手入坑 十分感谢 哈哈
感谢感谢
红石黑科技!