设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3802|回复: 25

[有事请教] 如何才能判定玩家鼠标右键是否长按

[复制链接]

Lv4.逐梦者

梦石
0
星屑
18471
在线时间
1027 小时
注册时间
2019-3-5
帖子
1418
发表于 2020-4-8 23:29:20 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
唯独找不到判断鼠标右键长按的脚本……

TouchInput.isTriggered()
  
  判断鼠标是否有左击
  
TouchInput._cancelled
  
  判断鼠标是否按下右键
   
Input.isTriggered('down')
  按钮单击判断
  
  括号里面的是按键的代号。
  up
  down
  right
  left
  pagedown
  pageup
  ok
  menu

Lv3.寻梦者

梦石
0
星屑
3461
在线时间
292 小时
注册时间
2020-1-27
帖子
190
发表于 2020-4-9 00:06:52 | 显示全部楼层
本帖最后由 zths 于 2020-4-9 20:50 编辑

JAVASCRIPT 代码复制
  1. keys = [];
  2. longPressTime = 1000;
  3. mouseLpressd = false;
  4. mouseRpressd = false;
  5. mouseMpressd = false;
  6. mouseLLongpressd = false;
  7. mouseRLongpressd = false;
  8. mouseMLongpressd = false;
  9. function isKeyPressed(kc){
  10.         if(typeof(kc) == "undefined"){
  11.                 return false
  12.         }
  13.         return keys[kc] > 0
  14. }
  15. function isKeyLongPressed(kc){
  16.         if(typeof(kc) == "undefined"){
  17.                 return false
  18.         }
  19.         return keys[kc] > longPressTime
  20. }
  21. mouseLLongpressdT = 0;
  22. mouseRLongpressdT = 0;
  23. mouseMLongpressdT = 0;
  24. if(typeof(handleWkd) === "undefined"){
  25.     handleWkd = true
  26.     window.addEventListener("keydown",function(ev) {
  27.         keys[ev.keyCode] = 1;
  28.     });
  29.     window.addEventListener("keyup",function(ev) {
  30.         keys[ev.keyCode] = undefined;
  31.     });
  32.     window.addEventListener("mousedown",function(ev) {
  33.         if(ev.button === 0){
  34.             mouseLpressd = true;
  35.             mouseLLongpressd = false;
  36.             mouseLLongpressdT = 0;
  37.         }
  38.         if(ev.button === 2){
  39.             mouseRpressd = true;
  40.             mouseRLongpressd = false;
  41.             mouseRLongpressdT = 0;
  42.         }
  43.         if(ev.button === 1){
  44.             mouseMpressd = true;
  45.             mouseMLongpressd = false;
  46.             mouseMLongpressdT = 0;
  47.         }
  48.     });
  49.     window.addEventListener("mouseup",function(ev) {
  50.         if(ev.button === 0){
  51.             mouseLpressd = false;
  52.             mouseLLongpressd = false;
  53.             mouseLLongpressdT = 0;
  54.         }
  55.         if(ev.button === 2){
  56.             mouseRpressd = false;
  57.             mouseRLongpressd = false;
  58.             mouseRLongpressdT = 0;
  59.         }
  60.         if(ev.button === 1){
  61.             mouseMpressd = false;
  62.             mouseMLongpressd = false;
  63.             mouseMLongpressdT = 0;
  64.         }
  65.     });
  66. }
  67. if(typeof(handleWkdInv) !== "undefined"){
  68.     clearInterval(handleWkdInv)
  69. }
  70. handleWkdInv = setInterval(function(){
  71.     keys.forEach(function(v,i){
  72.         if(v){
  73.             keys[i]+=longPressTime/3;
  74.         }
  75.     });
  76.     if(mouseLpressd){mouseLLongpressdT+=longPressTime/3;mouseLLongpressd = (mouseLLongpressdT >= longPressTime) ? true : false;}
  77.     if(mouseRpressd){mouseRLongpressdT+=longPressTime/3;mouseRLongpressd = (mouseRLongpressdT >= longPressTime) ? true : false;}
  78.     if(mouseMpressd){mouseMLongpressdT+=longPressTime/3;mouseMLongpressd = (mouseMLongpressdT >= longPressTime) ? true : false;}
  79. },longPressTime/3);

没测试过。。原生js
大概就是上面的意思。。
实际用应该会报错。。
mouseLpressd//鼠标左键按下
mouseRpressd//鼠标右键按下
mouseMpressd//鼠标中键按下
mouseLLongpressd//鼠标左键长按
mouseRLongpressd //鼠标右键长按
mouseMLongpressd //鼠标中键长按
isKeyPressed(keycode) //键盘按键按下
isKeyLongPressed(keycode)//键盘按键长按
longPressTime = 1000;//长按阈值 毫秒

鼠标按下判断部分其实可以写好点。。冗余太多了。。。

点评

这我得单回复说。  发表于 2020-4-10 20:53
不是,我只是有些疑惑而已。  发表于 2020-4-10 20:50
我觉得问题出在后续判断上。TouchInput.isTriggered()就是单击(即使按住)后不会继续触发。  发表于 2020-4-10 20:48
( mouseLpressd && !mouseLLongpressd ) 就是 触发了按下,但没触发长按  发表于 2020-4-10 20:46
你使用的时候如果仅判断长按那就不用管短按 如果需要排除长按那就 mouseLpressd && !mouseLLongpressd  发表于 2020-4-10 20:45
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4098
在线时间
618 小时
注册时间
2018-1-16
帖子
126
发表于 2020-4-9 10:21:16 | 显示全部楼层

点评

单纯看描述的话,和我的需求不太兼容。他这个似乎是根据格子或者屏幕xy来确认点击的。  发表于 2020-4-9 13:03
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
18471
在线时间
1027 小时
注册时间
2019-3-5
帖子
1418
 楼主| 发表于 2020-4-9 13:35:14 | 显示全部楼层
shantianzu 发表于 2020-4-9 10:21
这个你有没有用。https://rpg.blue/forum.php?mod=viewthread&tid=399598&extra=page%3D2%26filter%3Dtypei ...

测试完发现两点:
1.他这个插件判断点击的方法确实和事件坐标和屏幕坐标有关。而我想要的是能在屏幕任意地方长按右键进行判定。
2.它这个虽然描述有“长按鼠标右键”的判断方式,但我查看代码发现其实就是“单击”的判定。有点挂羊头卖狗肉的意思。而单击无法实现我想要的“按住按键进行蓄力攻击”。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33143
在线时间
10485 小时
注册时间
2009-3-15
帖子
4756
发表于 2020-4-9 14:19:52 | 显示全部楼层
本帖最后由 soulsaga 于 2020-4-9 14:29 编辑

按下和长按..
不是一个意思吗..还是说长按会判断按下的时间达到一定值才符合?不过真这样的话时间判断就不合适了吧
只要判断右键持续按下有效达到指定的时间就可以了吧..
一般不都这样做的么
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
18471
在线时间
1027 小时
注册时间
2019-3-5
帖子
1418
 楼主| 发表于 2020-4-9 15:05:32 | 显示全部楼层
本帖最后由 Zeldashu 于 2020-4-9 15:06 编辑
soulsaga 发表于 2020-4-9 14:19
按下和长按..
不是一个意思吗..还是说长按会判断按下的时间达到一定值才符合?不过真这样的话时间判断就不合 ...


长按的意思是按住的过程一直生效。比如说默认的分歧“按键【确认】正被按着”。这代表只要你按住确认键,分歧后面的内容就会一直被触发。

简单来说,目前我做出来的效果就是:只要玩家按住按键,变量1就会一直被增加。而这个过程的判断是依靠并行处理的,所以当玩家松开按键时,分歧自然变为了false的内容。这样就实现了一个蓄力攻击的效果。

现在的问题就是似乎没有针对鼠标右键长按的脚本。只有右键单击的。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33143
在线时间
10485 小时
注册时间
2009-3-15
帖子
4756
发表于 2020-4-9 15:09:16 | 显示全部楼层
本帖最后由 soulsaga 于 2020-4-9 15:10 编辑
Zeldashu 发表于 2020-4-9 15:05
长按的意思是按住的过程一直生效。比如说默认的分歧“按键【确认】正被按着”。这代表只要你按住确认键, ...

TouchInput._cancelled
  
  判断鼠标是否按下右键
不是有按下吗..按下不是指右键被按下中的状态吗..
应该会和单击不同

这个按下不是和默认的分岐按键正被按着时一样吗
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
18471
在线时间
1027 小时
注册时间
2019-3-5
帖子
1418
 楼主| 发表于 2020-4-9 16:10:34 | 显示全部楼层
soulsaga 发表于 2020-4-9 15:09
TouchInput._cancelled
  
  判断鼠标是否按下右键

哦。你说的是我写的注释啊。

是这样的,我有一个习惯就是把一些脚本记在小本本上,然后为了自己方便回忆会写上自己的注释。
一楼里的注释就是为了方便我自己理解写的,要是严谨些描述的话,内容应该是:【判断鼠标是否单机右键】

也就是说TouchInput._cancelled只会判定一次右键单击。无法实现长按一直触发。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3461
在线时间
292 小时
注册时间
2020-1-27
帖子
190
发表于 2020-4-10 21:00:43 | 显示全部楼层
本帖最后由 zths 于 2020-4-10 21:37 编辑

JAVASCRIPT 代码复制
  1. /**
  2.  * Checks whether a key is just pressed.
  3.  *
  4.  * @static
  5.  * @method isTriggered
  6.  * @param {String} keyName The mapped name of the key
  7.  * @return {Boolean} True if the key is triggered
  8.  */
  9. Input.isTriggered = function(keyName) {
  10.     if (this._isEscapeCompatible(keyName) && this.isTriggered('escape')) {
  11.         return true;
  12.     } else {
  13.         return this._latestButton === keyName && this._pressedTime === 0;
  14.     }
  15. };

上面是游戏的 isTriggered  逻辑
可以看到 他是 取得最后一个按下的键,并且是该帧按下的。才会返回 true...

所以他叫 isTriggered , 表达的意思是 在该帧被触发了.

我写的是浏览器原生方法,不需要 mv 核心的参与..
实现是判断被下的时间大于(所需值)....
如果需要修改为和他一样的实现的的话. 需要把 setInterval 的 func hook 至 图形更新方法下面。。
然后判断的时候把 大于 改为 等于 就可以了。。。(时间处理部分也需要修改成帧计数)

JAVASCRIPT 代码复制
  1. /**
  2.  * Checks whether a key is currently pressed down.
  3.  *
  4.  * @static
  5.  * @method isPressed
  6.  * @param {String} keyName The mapped name of the key
  7.  * @return {Boolean} True if the key is pressed
  8.  */
  9. Input.isPressed = function(keyName) {
  10.     if (this._isEscapeCompatible(keyName) && this.isPressed('escape')) {
  11.         return true;
  12.     } else {
  13.         return !!this._currentState[keyName];
  14.     }
  15. };


我审题有点问题。因为我实现的是 isPressed...

顺便
JAVASCRIPT 代码复制
  1. /**
  2.  * Checks whether a key is kept depressed.
  3.  *
  4.  * @static
  5.  * @method isLongPressed
  6.  * @param {String} keyName The mapped name of the key
  7.  * @return {Boolean} True if the key is long-pressed
  8.  */
  9. Input.isLongPressed = function(keyName) {
  10.     if (this._isEscapeCompatible(keyName) && this.isLongPressed('escape')) {
  11.         return true;
  12.     } else {
  13.         return (this._latestButton === keyName &&
  14.                 this._pressedTime >= this.keyRepeatWait);
  15.     }
  16. };

对着这个逻辑改改你就能得到你所有想要的了。。。

点评

非常感谢!学到不少东西  发表于 2020-4-10 21:45
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-19 08:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表