关于ScrollContainer的问题
godot吧
全部回复
仅看楼主
level 7
如图,我想制作一个手机端的游戏(因此只会出现InputEventScreenTouch和InputEventScreenDrag事件)
现有一个ScrollContainer(图中的UnitMenu)用于盛放所有的单位卡片(图中的Entry_xx)
Entry的脚本接收 gui_input 信号并检查输入事件是否为屏幕滑动(InputEventScreenDrag),如果是,则会进入拖拽建筑模式,右侧列表收起(如下图)
现在的问题是,玩家需要上下滑动ScrollContainer来上下翻菜单,而由于Entry占据了大多数区域,所以玩家会不可避免地滑动到Entry上,而Entry只要检测到滑动就会进入拖拽建筑模式,所以导致玩家无法翻菜单...
所以,有没有办法检测玩家到底是想 拖拽建筑 还是 翻动菜单?
-----------------------------------------------------------------------------------
我想到的一个思路是,检测drag的relative,如果他与 向上方向 的角度绝对值小于45度则直接pass,反之则进入拖拽建筑模式,这样可以区分玩家在上下滑动(翻动菜单)还是左右滑动(拖拽建筑)
这个方法的问题有两个:
1. 玩家的拖拽并不是严格的直线,可能中途会有一小段是左右滑动的而整体是上下滑动,这导致中途会突然进入 拖拽建筑模式
2. 即使Entry的脚本直接pass且没有set_input_as_handled,ScrollContainer仍然没有接收到上下滑动的事件,因此最终还是没有翻动菜单
请问有没有更好的解决方案?
2022年07月03日 03点07分 1
level 5
如果你的几个选项被选中,如你的光伏电站被点击选中,就进入建筑拖拽模式,没被选中就不进去拖拽。
2022年07月03日 05点07分 2
就是先点一下选中,然后再拖动吗?这样可能会多一次操作... 我见过的可以拖动选项卡的游戏(e.g. 皇室战争,虽然他不需要滚动菜单)都是直接拖动就能放兵的,我想实现这种效果...
2022年07月03日 05点07分
@一只萌鼠鼠🐭 我去搞一个项目试一下,晚上给你回复,你有办法了也麻烦和我说一哈
2022年07月03日 05点07分
还有一个问题,就是只要ScrollContainer里面有Control,且Mouse的Filter属性里不设置为Ignore,那么玩家拖动时如果是从那个Control开始拖动的,ScrollContainer就不会滚动...
2022年07月03日 05点07分
@一叶知秋 找到方法了,看4楼[哈哈]
2022年07月03日 06点07分
level 11
建议加个滚动条,只有按在滚动条上时才滚动菜单。
如果加滚动条不符合你原有的画面设计,那就通过停留计时来作为判断条件。
就是玩家点到选项上时就开始计时优先是移动选项、如果计时到1.5秒,也就是玩家按在选项上停留了更长的时间时就触发滑动菜单。
只不过像楼上提出的通过先点选、再移动,其实也可以考虑的。要考虑玩家更愿意连贯的操作、还是愿意停留一下触发不同功能,这取决于哪种功能用得更多。
2022年07月03日 05点07分 3
不用了,问题解决了,楼下发解决方案,但还是蟹蟹啦♪(^∇^*)
2022年07月03日 06点07分
level 7
最终解决方案:
1. 滑动时检测,如果鼠标位置离开了右边的面板(宽度250,所以用viewportRect的x减去250,其实应该获取右侧面板的 根control 再把250换成他的width会更优雅一点)才会进入 建筑拖拽模式
2. 所有的Entry的Mouse Filter换成Ignore,这样可以正常滚动菜单(之前一直在调整Entry对应的场景里的Mouse Filter,没想到主场景中的Entry的Mouse Filter被手动改过导致没有应用到主场景)
2022年07月03日 06点07分 4
[真棒]能解决就好
2022年07月03日 10点07分
level 6
大概是这种感觉?
2022年07月03日 08点07分 5
对,和这个一样的,感谢[真棒] 只不过我自己拓展了Tilemap做了一个建筑系统,所以没敢用自带的drag方法[滑稽]
2022年07月03日 15点07分
1